用spring data 查询 MongoDb 空间坐标 范围距离内所有的点
2017-02-13 16:38
716 查看
问题:想要实现类似于安居客的地图找房一样的功能,随着地图的画面的移动,动态查询地图内的符合检索条件数据点。
解决步骤:首先地图移动触发查询,这个就是不停触发查询事件。
然后当得到地图的中心坐标点,计算出地图的显示半径(单位米)的时候,需要到mongoDB中把满足的点查询出来。
最后在地图上表示相关点就可以。
地图移动事件,计算中心坐标(经纬段),地图半径还有显示点网上有很多事例可以找到。
下面说说我碰到的主要的mongo的查询的问题。
在看过spring data mongo的文档后,发现这个问题竟然可以比较简便的解决。
以下就是关键代码:
这个解决问题的方案是建立在
1)使用spring data(废话)
2)mongoDB中使用了坐标类型的字段(其实加个索引db.point.test.ensureIndex( { loc : "2dsphere" } ) 可以直接用shell查)
完整的例子在整理中。。。。
解决步骤:首先地图移动触发查询,这个就是不停触发查询事件。
然后当得到地图的中心坐标点,计算出地图的显示半径(单位米)的时候,需要到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查)
完整的例子在整理中。。。。
相关文章推荐
- spring data mongodb的根据参数模糊查询(传入一个参数查询slideId/slideName中包含这个参数的所有数据)
- spring data mongodb 按小时分组查询
- Spring Data MongoDB 三:基本文档查询(Query、BasicQuery)(一)
- spring-data-mongodb高级查询用法小结
- dubbo服务使用spring-data-mongodb进行时间查询的bug记录
- Spring Data MongoDB 三:基本文档查询(Query、BasicQuery)(一)
- springmvc mongodb 地理范围查询
- Spring整合MongoDB实现多个or的范围查询
- Spring整合MongoDB实现多个or的范围查询
- 整理springdata mongodb 查询 一
- Spring data mongodb ObjectId ,根据id日期条件查询,省略@CreatedDate注解
- Spring Data MongoDB:查询
- Spring Data MongoDB 五:进阶文档查询(分页、Morphia)(二)
- 在SPRING DATA MONGODB中使用聚合统计查询
- spring-data-mongodb的同字段索引多条件查询
- spring-data-mongodb查询结果返回指定字段
- springdata mongodb 查询二(Aggregation)
- Spring Data MongoDB 三:基本文档查询(query、BasicQuery)
- spring data mongodb高级查询语句的使用(网上基本没资料)
- Spring Data MongoDB 五:进阶文档查询(分页、Morphia)(二)