问题:想要实现类似于安居客的地图找房一样的功能,随着地图的画面的移动,动态查询地图内的符合检索条件数据点。
解决步骤:首先地图移动触发查询,这个就是不停触发查询事件。
然后当得到地图的中心坐标点,计算出地图的显示半径(单位米)的时候,需要到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查)
完整的例子在整理中。。。。