比较
- 经度纬度都要在有效区间。经度范围介于 -180 到 180,纬度范围大致介于-90和到90。
- redis使用Zset结构存储,将经度值、纬度值转换为一个值,二维量变成一维量找附近的位置,效率极高,不过限于平面,且无法分页。
- MongoDB更为灵活,通过建立地理位置索引,来实现附近的地理位置查找,可以支持平面、球面,还可分页,功能更为丰富完善。
Redis使用
- 添加地理位置坐标:GEOADD 键名 经度 纬度 位置名
- 删除地理位置(和操作zset是一样的):ZREM 键名 位置名
- 查找附近的位置(返回[[位置名,距离],[位置名,距离],[位置名,距离]...]):
GEORADIUS 键名 经度 纬度 最大距离 单位(m或km) WITHDIST(意为带距离) count 数量数字 ASC(意为由近到远)
- demo(有自定义的工具方法,需要改造)
MongoDB使用
- 需要建立2dsphere索引(2d索引不考虑):db.表名.createIndex({"建立索引的字段": "2dsphere"})
- 一般的数据类型为JSON格式的,可参考如下结构:db.pos.createIndex({"location": "2dsphere"})
- 查询附近位置且显示距离,单位为米
db.getCollection('表名').aggregate([ {$geoNear:{ "near":{"type": "Point", "coordinates": [经度, 纬度]}, "spherical": true, "distanceField": "distance" }}, {$skip:0}, {$limit:20} ]);