昨天晚上看到《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..find( { :
{ $nearSphere: [ , ] ,
$maxDistance:} } )
(2)GeoJson $maxDistance距离单位默认为米:
db..find( { :
{ $nearSphere :
{ $geometry :
{type :"Point",
coordinates : [ , ]} ,
$maxDistance :} } } )
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