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

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


解决步骤:首先地图移动触发查询,这个就是不停触发查询事件。
          然后当得到地图的中心坐标点,计算出地图的显示半径(单位米)的时候,需要到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查)


完整的例子在整理中。。。。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值