mongodb-mongotemplate进行地理坐标操作

Posted bronk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mongodb-mongotemplate进行地理坐标操作相关的知识,希望对你有一定的参考价值。

因为项目中使用的springboot + mongotemplate, 所以还是需要mongotemplate的操作方式

首先建立一个bean: 

package com.iwhere.easy.travel.entity;

import java.io.Serializable;
import java.util.Arrays;

import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.PersistenceConstructor;
import org.springframework.data.mongodb.core.index.GeoSpatialIndexed;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;

/**
 * 收费poi
 * 
 * @author wenbronk
 * @time 2017年7月19日 下午4:46:39
 */

@Document(collection = "charge_poi")
public class ChargePoi implements Serializable {
    private static final long serialVersionUID = 2653147280472201924L;

    @Id
    private String _id;

    @Indexed
    private String poi_id;
    private String poi_name;
    @GeoSpatialIndexed
    private Double[] location;
    private String media_url;
    private Double price;

    public ChargePoi() {
        super();
    }

    @PersistenceConstructor
    ChargePoi(String _id, String poi_id, String poi_name, Double[] location, String media_url, Double price) {
        super();
        this._id = _id;
        this.poi_id = poi_id;
        this.poi_name = poi_name;
        this.location = location;
        this.media_url = media_url;
        this.price = price;
    }

    public ChargePoi(String _id, String poi_id, String poi_name, Double x, Double y, String media_url, Double price) {
        super();
        this._id = _id;
        this.poi_id = poi_id;
        this.poi_name = poi_name;
        this.location = new Double[]{x, y};
        this.media_url = media_url;
        this.price = price;
    }

    public String get_id() {
        return _id;
    }

    public void set_id(String _id) {
        this._id = _id;
    }

    public String getPoi_id() {
        return poi_id;
    }

    public void setPoi_id(String poi_id) {
        this.poi_id = poi_id;
    }

    public String getPoi_name() {
        return poi_name;
    }

    public void setPoi_name(String poi_name) {
        this.poi_name = poi_name;
    }

    public Double[] getLocation() {
        return location;
    }

    public void setLocation(Double[] location) {
        this.location = location;
    }

    public String getMedia_url() {
        return media_url;
    }

    public void setMedia_url(String media_url) {
        this.media_url = media_url;
    }

    public Double getPrice() {
        return price;
    }

    public void setPrice(Double price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "ChargePoi [_id=" + _id + ", poi_id=" + poi_id + ", poi_name=" + poi_name + ", location="
                + Arrays.toString(location) + ", media_url=" + media_url + ", price=" + price + "]";
    }
}

注: 

@GeoSpatialIndexed  注解的作用: 

Mark a field to be indexed using MongoDBs geospatial indexing feature.
开始没有加这个注解, 然后计算距离的时候就会报错

1, 准备测试数据: 

    /**
     * save
     */
    @Test
    public void test1() {
        for (int x = 100; x < 131; x++) {
            for (int y = 30; y < 61; y++) {
                Double loca[] = new Double[]{Double.valueOf(x), Double.valueOf(y)};
                ChargePoi chargePoi = new ChargePoi();
                chargePoi.setPoi_id("poiid" + x);
                chargePoi.setMedia_url("http://www.baidu.com?params=" + x);
                chargePoi.setPoi_name("vini" + Arrays.toString(loca));
                chargePoi.setPrice(Math.random() * 100);
                chargePoi.setLocation(loca);
                mongoTemplate.insert(chargePoi);
            }
        }
    }

2, 圆形查询

    /**
     * circle
     */
    @Test
    public void test2() {
        Circle circle = new Circle(30, 20, 20);
        List<ChargePoi> find = mongoTemplate.find(new Query(Criteria.where("location").within(circle)), ChargePoi.class);
        System.out.println(find);
        System.out.println(find.size());
    }

3, 球星查询

    /**
     * spherical 
     */
    @Test
    public void test3() {
        Circle circle = new Circle(30,20, 20);
        List<ChargePoi> find = mongoTemplate.find(new Query(Criteria.where("location").withinSphere(circle)), ChargePoi.class);
        System.out.println(find.size());
        System.out.println(find);
    }

4, 矩形查询, box

    /**
     * box
     */
    @Test
    public void test4() {
        Box box = new Box(new Point(10, 11), new Point(10, 20));  
        List<ChargePoi> find = 
                mongoTemplate.find(new Query(Criteria.where("location").within(box)), ChargePoi.class);
        System.out.println(find.size());
        System.out.println(find);
    }

5, 按距离由近到元查询

    /**
     * near
     */
    @Test
    public void test5() {
        Point point = new Point(12, 12);
        List<ChargePoi> venues = 
                mongoTemplate.find(new Query(Criteria.where("location").near(point).maxDistance(20)), ChargePoi.class);
        System.out.println(venues.size());
        System.out.println(venues);
    }

6, 空间距离查询

    /**
     * nearSphere
     */
    @Test
    public void test6() {
        Point point = new Point(12, 12);
        List<ChargePoi> venues = 
                mongoTemplate.find(new Query(Criteria.where("location").nearSphere(point).maxDistance(20)), ChargePoi.class);
        System.out.println(venues.size());
        System.out.println(venues);
    }

7, 最近点查询

    @Test
    public void test7() {
        Point location = new Point(12, 12);
        NearQuery query = NearQuery.near(location).maxDistance(new Distance(100000, Metrics.KILOMETERS));
        GeoResults<ChargePoi> result = mongoTemplate.geoNear(query, ChargePoi.class);
        System.out.println(result);
    }

 

我是勤劳的搬运工:->http://docs.spring.io/spring-data/data-mongo/docs/1.5.2.RELEASE/reference/html/mongo.core.html#mongo.geospatial

 



以上是关于mongodb-mongotemplate进行地理坐标操作的主要内容,如果未能解决你的问题,请参考以下文章

使用地名进行弹性搜索的地理定位(地理编码)

地理定位移动测试,无需 https 即可进行网络地理定位

如何使用 PHP 对 MapQuest 地理编码器进行批量地理编码?

如何创建一个嵌入多边形以进行地理围栏的圆形地理围栏区域?

对交叉点进行反向地理编码

使用谷歌地图地理定位 api 进行准确的地理定位