07月30, 2018

mongodb地理位置查询入门

地理位置索引

地理位置索引常用的有两种:只要坐标跨度不太大(比如几百几千公里),这两个索引计算出的距离相差几乎可以忽略不计

  • 2d 平面坐标索引,适用于基于平面的坐标计算。也支持球面距离计算,不过官方推荐使用2dsphere索引。
  • 2dsphere 几何球体索引,适用于球面几何运算

查询方式分三种情况:

  • Inclusion。范围查询,如百度地图“视野内搜索”。
  • Inetersection。交集查询。不常用。
  • Proximity。周边查询,如“附近500内的餐厅”,如果用弧度查询,则以公里数除以6371
  • 矩形区域:指定两个坐标
  • 圆形区域:查询以某坐标为圆心,指定半径的圆内的数据。 圆形区域搜索分为$center和$centerSphere这两种类型,它们的区别主要在于支持的索引和默认距离单位不同。 2d索引能同时支持$center和$centerSphere,2dsphere索引支持$centerSphere。关于距离单位,$center默认是度,$centerSphere默认距离是弧度。

常用方式

  • $geoNear与$near功能类似,但提供更多功能和返回更多信息,如查询时间、返回数量、最大距离、平均距离、距离目标点的距离等
  • $geoNear返回结果集中的dis,如果指定了spherical为true, dis的值为弧度,不指定则为度。
  • 指定 spherical为true,结果中的dis需要乘以6371换算为km:
  • 不指定sphericial,结果中的dis需要乘以111换算为km:
  • 可以直接在查询时指定 distanceMultiplier ,它会将这个参数乘以距离返回,如指定为6371,返回的就是公里数

常用方式对比

查询命令 距离单位 说明
$near 官方文档上关于这一点是错的
$nearSphere 弧度
$center
$centerSphere 弧度
$polygon
$geoNear 度或弧度 指定参数spherical为true则为弧度,否则为度
db.geotest.ensureIndex({"loc":"2d"} ,{"min":-500,"max":500}) 
db.geotest.find( {"loc":{"$near": [25,25]}}) 
db.geotest.find( {"loc":{"$near": [25,20],"$maxDistance":12}}).sort({"timestmp":-1})

db.geotest.insert({'name':'name10',"loc":{"lat":11,"long":30},"timestmp":120})
db.geotest.insert({'name':'name12',"loc":{"lat":11,"long":20},"timestmp":130})
db.geotest.insert({'name':'name13',"loc":{"lat":21,"long":30},"timestmp":140})
db.geotest.insert({'name':'name14',"loc":{"lat":21,"long":20},"timestmp":160})
db.geotest.insert({'name':'name15',"loc":{"lat":31,"long":30},"timestmp":180})

本文链接:https://blog.jnliok.com/post/mongodb-geo.html

-- EOF --

Comments