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