今天需要对mongodb中的数据进行处理的时候发现有很多经纬度数据需要按照一定的范围进行分类,正好看到mongodb有一个对LBS进行处理的功能,特此进行填坑操作~!
Double
类型:$geoWithin
指定形状查询db.collection_name.ensureIndex({"location" : "2d"});
在指定形状查询中,$box
、$polygon
、$center
分别表示按矩形、五边形、圆形进行查询。
$box
查询矩形区域坐标点:mongodb语句如下:
db.company.find({
"location" : {
"$geoWithin" : {
"$box":[[116.362078,39.945976],[116.482451,39.914176]]
}
}
})
对应java dao
代码如下:
// 矩形
double[] box1 = {116.362078,39.945976};
double[] box2 = {116.482451,39.914176};
Box shape = new Box(box1, box2);
Criteria criteria = Criteria.where("location")
.within(shape);
List<com.qnloft.web.model.baidu.Result> mongoResults =
mongoTemplate.find(query(criteria),
com.qnloft.web.model.baidu.Result.class,
"company");
$center
查询圆形区域坐标点:圆心坐标点是大望路地铁站经纬度,半径为0.05
mongodb语句如下:
db.company.find({
"location" : {
"$geoWithin" : {
"$center":[[116.482451,39.914176],0.05]
}
}
})
对应java dao
代码如下:
double radius = 0.05;
Circle circle = new Circle(new Point(116.482451,39.914176), radius);
Criteria criteria = Criteria.where("location")
.within(circle);
List<com.qnloft.web.model.baidu.Result> mongoResults =
mongoTemplate.find(query(criteria),
com.qnloft.web.model.baidu.Result.class,
"company");
我怎么知道这里Criteria
需要传入哪些类呢?org.springframework.data.mongodb.core.query.GeoCommand
,getCommand
方法代码如下,一看便知:
$near
接近点查询这个功能相当于微信附近的人功能。这里为什么不适用2d索引?因为2d索引不能使用经纬度查询,需要传入弧度。
2dsphere
索引)db.company.ensureIndex({"location" : "2dsphere"});
以
望京东
地铁站经纬度为圆心,查询附近1000米
以内公司坐标
MongoDB语句如下:
db.company.find({
"location": {
"$near": {
"$geometry": {
type: "Point" ,
coordinates: [116.493231,40.009379]
},
"$maxDistance": 1000
}
}
})
对应java dao
代码如下:
List<Double> coordinates = new ArrayList<>();
coordinates.add(116.493231);
coordinates.add(40.009379);
Bson nearBson = Filters.near("location" ,new Point(new Position(coordinates)),1000.0,0.0);
List<com.qnloft.web.model.baidu.Result> list = new ArrayList<>();
mongoTemplate.getCollection("company").find(nearBson).forEach((Block<Document>) document -> {
// 将结果转换成bean
com.qnloft.web.model.baidu.Result geoResult = JSON.parseObject(document.toJson(), com.qnloft.web.model.baidu.Result.class);
System.out.println(JSON.toJSONString(geoResult.getLocation()) + ",");
});