您的位置:首页 > 数据库 > Mongodb

用spring data 查询 MongoDb 空间坐标 范围距离内所有的点

2017-02-13 16:38 716 查看
问题:想要实现类似于安居客的地图找房一样的功能,随着地图的画面的移动,动态查询地图内的符合检索条件数据点。

解决步骤:首先地图移动触发查询,这个就是不停触发查询事件。

          然后当得到地图的中心坐标点,计算出地图的显示半径(单位米)的时候,需要到mongoDB中把满足的点查询出来。
 最后在地图上表示相关点就可以。

 地图移动事件,计算中心坐标(经纬段),地图半径还有显示点网上有很多事例可以找到。
 
 下面说说我碰到的主要的mongo的查询的问题。

 在看过spring data mongo的文档后,发现这个问题竟然可以比较简便的解决。
 以下就是关键代码:

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.springframework.data.geo.*;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;

//传入的是经度纬度,还有半径(米)
public RetCode<ArrayList<RealTimeData>> findRealTimeByRange(double latitude, double longitude, double raidus) {
RetCode rt = new RetCode();
try {
ArrayList<RealTimeData> list;
//中心点
Point point = new Point(latitude,longitude);
//转换为2dsphere的距离,这一步非常重要
Distance distance = new Distance(raidus/1000, Metrics.KILOMETERS);
//画一个圆
Circle circle = new Circle(point,distance);
Date date = Utils.getCurrentTime();
//自定义的追加了一个检索时间的查询
Calendar calendar = Calendar.getInstance();
Calendar calendar1 = Calendar.getInstance();
calendar.setTime(date);
calendar1.setTime(date);
calendar.add(Calendar.SECOND, -30);
Date date1 = calendar.getTime();
Date date2 = calendar1.getTime();
//withinSphere 这个可以查询圆内的点
//还可以加很多自己想要的条件
Criteria cc = Criteria.where("loc").withinSphere(circle).and("fametime").gte(date1).lte(date2);
Query query = new Query(cc);
list = iBaseDao.query(query, RealTimeData.class, "LatestVehicleData");
if (list.size() == 0) {
rt.setCode(0);
rt.setDesc("数据为空");
} else {
rt.setCode(1);
rt.setObj(list);
}
} catch (Exception e) {
rt.setCode(1001);
rt.setDesc(e.getMessage());
}
return rt;
}


这个解决问题的方案是建立在
1)使用spring data(废话)
2)mongoDB中使用了坐标类型的字段(其实加个索引db.point.test.ensureIndex( { loc : "2dsphere" } ) 可以直接用shell查)

完整的例子在整理中。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: