zoukankan      html  css  js  c++  java
  • 地图距离排序一(mongodb篇)

    首先我们准备数据集,创建一个 location 库,然后插入一些数据。如下:

    db.location.insert({"lng":经度,"lat":纬度,"loc":[lng,lat]});
    db.location.insert({"lng":1,"lat":1,"loc":[1,1]});
    db.location.insert({"lng":2,"lat":2,"loc":[2,2]});
    db.location.insert({"lng":3,"lat":3,"loc":[3,3]});
    db.location.insert({"lng":-1,"lat":-1,"loc":[-1,-1]});
    db.location.insert({"lng":-2,"lat":-2,"loc":[-2,2]});   
    db.location.insert({"lng":-3,"lat":-3,"loc":[-3,-3]});

    数据集准备好了之后,我们需要为 location 加上地图索引。mongodb 提供的地图索引有两种,分别是 2d 和 2dsphere。2d 索引通过二维平面记录点坐标,支持在平面几何中计算距离,而 2dsphere 则支持在球面上进行距离的计算,并且支持 mongodb 的所有地理空间查询方法。简单的理解,2dsphere 是 2d 的增强版。根据官方推荐,如果你的mongodb版本大于2.6,那么就用 2dsphere 索引 。如下:

    db.location.ensureIndex({"loc":"2dsphere"})

    索引加好后,我们就可以来实现按照离我最近排序了,姿势如下:

    db.location.find({
        "loc":{
            "$nearSphere":{
                "$geometry":{
                    "type":"Point",
                    "coordinates":[0,0]
                }
            }
        }
    })

    按照离我最近排序,除了使用 $nearSphere 查询外,我们还可以使用 aggregate 来实现。

    使用 aggregate 有两个好处。1.我们在进行排序的后,可以返回两点之间的距离。2.我们可以进行更为复杂的排序,例如我们可以先根据某个字段进行排序,然后该字段相同的情况下再根据距离排序。

    使用 aggregate 查询时,我们还可以返回两点之间的距离,其中 distanceField 可以对距离字段进行重命名。姿势如下:

    db.location.aggregate([
       {
         $geoNear: {
            near: { type: "Point", coordinates: [ 0 , 0 ] },
            distanceField: "distance",
            spherical: true
         }  
       }
    ])

    如果我们希望查询以某个点为中心的圆几公里以内的数据,那你的姿势可以如下:

    db.location.find({
        "loc":{
            "$geoWithin":{
                "$centerSphere":[
                    [
                        0,0
                    ],
                     0.025 //单位为弧度
                ]
            }
        }
    })

    最后,mongodb 提供了许多更为复杂的查询方法,有需要的同学可以自己到官网查看。

  • 相关阅读:
    学点 C 语言(40): 函数 多参函数
    存取 ListBox 列表 回复 "徐强" 的问题
    博客园RSS订阅汇总
    博客园电子期刊2012年2月刊发布啦
    上周热点回顾(3.53.11)
    博客园电子期刊2012年3月刊发布啦
    上周热点回顾(3.264.1)
    上周热点回顾(3.193.25)
    上周热点回顾(4.24.8)
    上周热点回顾(2.273.4)
  • 原文地址:https://www.cnblogs.com/xubao/p/12448656.html
Copyright © 2011-2022 走看看