MongoDB开发LBS应用

昨天晚上看到《APP后台运维与实践》中介绍MongoDB,其中有一个应用案例,讲的就是LBS应用,看到对于附近的人,及距离计算都非常方便

封装了大量的地理位置操作,全球流行的LBS服务Foursquare,快的曾经都是用MongoDB的地理位置查询功能

MongoDB原生支持地理位置索引,可以直接用于位置距离计算和查询。

db.runCommand( { geoNear: "places", near: [117.034449,36.673595], num:1000 })

查询结果默认将会由近到远排序,而且查询结果也包含目标点对象、距离目标点的距离等信息

MongoDB地理位置索引

  (1)2d 平面坐标索引,适用于基于平面的坐标计算

  (2)2dsphere 几何球体索引,适用于球面几何运算

建立索引:

> db.location.ensureIndex({'coordinate':'2d'})
> db.location.ensureIndex({'coordinate':'2dsphere'})

查询坐标参数

(1)坐标对(经纬度)根据查询命令的不同,$maxDistance距离单位可能是 弧度 和 平面单位(经纬度的“度”)

db.<collection>.find( { <location field> :
     { $nearSphere: [ <x> , <y> ] ,
       $maxDistance: <distance in radians>
 } } )

 

(2)GeoJson $maxDistance距离单位默认为米:

 db.<collection>.find( { <location field> :
       { $nearSphere :
           { $geometry :
                 {type : "Point" ,
                  coordinates : [ <longitude> , <latitude> ]} ,
           $maxDistance : <distance in meters>
} } } )                                                                                                            

eg:1.附近的人

  A.和坐标[117.034449,36.673595]的间距在1000米内的坐标

  db.location.find({"coordinate":{

    "$nearSphere:[117.034449,36.673595],

    "spherical":true,

    "$maxDistance":1000/6378137,

    "distanceMuitiplier":637813

  }})

  说明:

    使用$nearSphere,查找有哪些坐标和用户当前坐标直线距离为某个固定值以内

    spherical为true表示计算距离

    distanceMuitiplier指定地球半径来得到实际的千米或米的距离,1000/6378137把距离转化为弧度

  B.查找500米内的

db.location.find({"coordinate":{

    "$nearSphere:[117.034449,36.673595],

    "spherical":true,

    "$maxDistance":500/6378137,

    "distanceMuitiplier":637813

  }})

  C.查找500米内的坐标,同时显示和目标坐标的距离

db.runCommand({

  "geoNear":location",

  "near":[117.034449,36.673595],

  "spherical":true,

  "$maxDistance":500/6378137,

  "distanceMuitiplier":637813

})

  说明:

    geoNear是基于db的command,返回结果包含距离信息 

  2.查找某个范围内的坐标

  db.location.find({

    "coordinate":{

      "$geoWithin":{

        $box:[[117.034233,36.667574],[117.056223,36.679211]]

      }

    }

})

  说明:

    $geoWith操作符搜索某个范围内的坐标,支持$box矩形,$center圆,$polygon多边形

还可以使用 PostgreSQL+PostGIS

 

posted @ 2017-11-21 13:33  慕尘  阅读(666)  评论(0编辑  收藏  举报