Mongodb地理位置检索

启动:mongod --dbpath D:\mondodb(数据库文件存放的位置)
在这里插入图片描述
在浏览器输入localhost:27017,出现下图证明启动成功在这里插入图片描述
连接数据库:
mongo
在这里插入图片描述

常用命令:

show dbs  //查看有多少库
use xxx   //创建一个新的库
show collections  //查看当前库的所有集合
db.collectionName.insert(obj)  //在名为collectionName的集合下插入一条数据,如果该集合不存在,就创建集合
db.collectionName.find()   //查找名为collectionName集合的所有记录

两种方式:

2d和2dsphere分别对应平面和球面

2dsphere方式

实体类

@Document(collection = "test")
public class Place {
    @Id
    private String id;
    private String address;
    private GeoJsonPoint loc;

测试数据

db.test.insert({"address" : "南京 禄口国际机场","loc" : { "type": "Point", "coordinates": [118.783799,31.979234]}})
 db.test.insert({"address" : "南京 浦口公园","loc" : { "type": "Point", "coordinates": [118.639523,32.070078]}})
 db.test.insert({"address" : "南京 火车站","loc" : { "type": "Point", "coordinates": [118.803032,32.09248]}})
 db.test.insert({"address" : "南京 新街口","loc" : { "type": "Point", "coordinates": [118.790611,32.047616]}})
 db.test.insert({"address" : "南京 张府园","loc" : { "type": "Point", "coordinates": [118.790427,32.03722]}})
 db.test.insert({"address" : "南京 三山街","loc" : { "type": "Point", "coordinates": [118.788135,32.029064]}})
 db.test.insert({"address" : "南京 中华门","loc" : { "type": "Point", "coordinates": [118.781161,32.013023]}})
 db.test.insert({"address" : "南京 安德门","loc" : { "type": "Point", "coordinates": [118.768964,31.99646]}})

建立索引:
db.test.ensureIndex( { loc : "2dsphere" } )

检索规定半径以内数据(单位为米)

db.test.find({ "loc" : { "$near" : { "$geometry" : { "type" : "Point", "coordinates" : [118.783799, 31.979234] }, "$maxDistance" : 5000 } } });

对应的代码

@Test
public void lbsFind(){
    BasicDBObject basicDBObject = new BasicDBObject("loc", new BasicDBObject("$near", 
                                      new BasicDBObject("$geometry", 
                                              new BasicDBObject("type","Point").
                                                      append("coordinates",new double[]{118.783799,31.979234})).
                                                      append("$maxDistance",5000)));//单位米
    Query query = new BasicQuery(String.valueOf(basicDBObject));
    List<Place> list = mongoTemplate.find(query, Place.class,"test");//test是对应mongodb的集合
    for(Place place:list){                                           //Place.class是对应的实体类
        System.out.println(place);
    }
}

查询距离
near:从距离最近的点开始搜索
distanceField:存放距离的参数
maxDistance:最远距离
query: 查询条件
num: 返回数据个数(默认为100)
spherical:是否采用球面几何计算

db.test.aggregate([
{
$geoNear:{
near:{type:"Point",coordinates:[118.783799,31.979234]},
distanceField:"dist.calculated",
maxDistance:10000,
spherical:true
}
}
])

对应代码

     @Test
    public void lbsFindDistance(){
        List<BasicDBObject> basicDBList = new ArrayList<>();
        BasicDBObject basicDBObject = new BasicDBObject("$geoNear",new BasicDBObject("near",
                                             new BasicDBObject("type","Point").
                                                     append("coordinates",new double[]{118.783799,31.979234})).
                                                     append("distanceField","distance").
                                                     append("maxDistance",10000).
                                                     append("spherical",true));
        basicDBList.add(basicDBObject);
        AggregateIterable<Document> iterable = mongoTemplate.getCollection("test").aggregate(basicDBList);
        MongoCursor<Document> cursor = iterable.iterator();
        while(cursor.hasNext()){
        Document document = cursor.next();
        double distance =(double) document.get("distance");
        String address =(String) document.get("address");
        System.out.println("地址:"+address+"  距离为:"+distance);
    }
}

2d方式
实体类

@Document(collection = "test2")

public class PlaceTwo {
    @Id
    private String id;
    private String address;
    private double[] locs = new double[2];//double类型二维数组存放经纬度

测试数据

db.test2.insert({"address" : "南京 禄口国际机场","locs" : [118.783799,31.979234]})
 db.test2.insert({"address" : "南京 浦口公园","locs" : [118.639523,32.070078]})
 db.test2.insert({"address" : "南京 火车站","locs" : [118.803032,32.09248]})
 db.test2.insert({"address" : "南京 新街口","locs" : [118.790611,32.047616]})
 db.test2.insert({"address" : "南京 张府园","locs" : [118.790427,32.03722]})
 db.test2.insert({"address" : "南京 三山街","locs" : [118.788135,32.029064]})
 db.test2.insert({"address" : "南京 中华门","locs" : [118.781161,32.013023]})
 db.test2.insert({"address" : "南京 安德门","locs" : [118.768964,31.99646]})

建立索引:db.test2.ensureIndex( { locs : "2d" } )

查询方式(五种)
(1)按距离由近到远查询

@Test
public void lbsFind3(){
    Point point = new Point(118.783799,31.979234);
    Query query = new Query(Criteria.where("locs").near(point).maxDistance(0.1));
    List<PlaceTwo> result = mongoTemplate.find(query,PlaceTwo.class,"test2");
    for(PlaceTwo place:result){
        System.out.println(place);
    }
}

(2)圆形查询

@Test
public void lbsFind3(){
    Circle circle = new Circle(118.783799,31.979234,0.1);
    Query query = new Query(Criteria.where("locs").within(circle));
    List<PlaceTwo> result = mongoTemplate.find(query,PlaceTwo.class);
    for(PlaceTwo place:result){
        System.out.println(place);
    }
}

(3)球星查询

@Test
public void lbsFind3(){
    Circle circle = new Circle(118.783799,31.979234,0.003712240453784);
    Query query = new Query(Criteria.where("locs").withinSphere(circle));
    List<PlaceTwo> result = mongoTemplate.find(query,PlaceTwo.class);
    for(PlaceTwo place:result){
        System.out.println(place);
    }
}

(4)空间距离查询

@Test
public void lbsFind3(){
    Point point = new Point(118.783799,31.979234);
    Query query = new Query(Criteria.where("locs").nearSphere(point).maxDistance(0.003712240453784));
    List<PlaceTwo> result = mongoTemplate.find(query,PlaceTwo.class);
    for(PlaceTwo place:result){
        System.out.println(place);
    }
}

(5)最近点查询(可以直接返回距离)

@Test
public void lbsFind2(){
    Point point = new Point(118.783799,31.979234);
    NearQuery query = NearQuery.near(point).maxDistance(new Distance(10, Metrics.KILOMETERS));
    GeoResults<PlaceTwo> result = mongoTemplate.geoNear(query, PlaceTwo.class, "test2");
    List<GeoResult<PlaceTwo>> content = result.getContent();
    for(GeoResult<PlaceTwo> place:content){
        System.out.println(place+"  距离为:"+place.getDistance().getValue());
    }
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值