mongo php geonear_mongodb通过$geoNear进行坐标检索
最近的项目涉及带geo信息的多源数据融合,发现mongo3.x的geo检索跟2.x有点变化,在这里mark一下。
//1.建立geo索引
db.point.ensureIndex({"geo":"2d"});
//"geo"格式说明:
[
116.279943 #lng经度
40.049971, #lat纬度
]
//2.插入示例数据
db.point.insert({ "@id" : 1, "@geo" : [ 116.305297, 40.041993 ], "@bucket":["稻香村"], "@bucket_sign":["19d40bb2165c198560278e7bc3b2c5e5"] ,"name":"稻香村上地店"})
db.point.insert({ "@id" : 2, "@geo" : [ 116.305306, 40.041995 ], "@bucket":["稻香村"], "@bucket_sign":["19d40bb2165c198560278e7bc3b2c5e5"] ,"name":"稻香村西二旗店" })
db.point.insert({ "@id" : 3, "@geo" : [ 116.305309, 40.041993 ], "@bucket":["海底捞"], "@bucket_sign":["f6c832afc1c578ee731273c14a0245b4"] ,"name":"海底捞西二旗店" })
db.point.insert({ "@id" : 4, "@geo" : [ 116.279943,40.049971 ], "@bucket":["海底捞"], "@bucket_sign":["f6c832afc1c578ee731273c14a0245b4"] ,"name":"海底捞上地店" })
db.point.insert({ "@id" : 5, "@geo" : [ 116.225901,39.773136 ], "@bucket":["海底捞"], "@bucket_sign":["f6c832afc1c578ee731273c14a0245b4"] ,"name":"海底捞房山长阳店" })
//3.查询附近1公里的点示例:
1)find标准查询(仅mongodb2.x版本支持,不能返回距离)
db.point.find({"geo ":{ $near : [116.279943,40.049971] , $maxDistance : 1/111.12},"@bucket_sign" : [ "f6c832afc1c578ee731273c14a0245b4"}) 返回格式: { "_id" : ObjectId("59f8418c278994d6d2e77c9a"), "@id" : 4, "@geo" : [ 116.279943, 40.049971 ], "@bucket" : [ "海底捞" ], "@bucket_sign" : [ "f6c832afc1c578ee731273c14a0245b4" ], "name" : "海底捞上地店", "dist" : { "calculated" : 0, "location" : [ 116.279943, 40.049971 ] } } { "_id" : ObjectId("59f8418c278994d6d2e77c99"), "@id" : 3, "@geo" : [ 116.305309, 40.041993 ], "@bucket" : [ "海底捞" ], "@bucket_sign" : [ "f6c832afc1c578ee731273c14a0245b4" ], "name" : "海底捞西二旗店", "dist" : { "calculated" : 2.33435844594686, "location" : [ 116.305309, 40.041993 ] } } { "_id" : ObjectId("59f8418c278994d6d2e77c9b"), "@id" : 5, "@geo" : [ 116.225901, 39.773136 ], "@bucket" : [ "海底捞" ], "@bucket_sign" : [ "f6c832afc1c578ee731273c14a0245b4" ], "name" : "海底捞房山长阳店", "dist" : { "calculated" : 31.12581912580905, "location" : [ 116.225901, 39.773136 ] } } 2)aggregate聚合查询 返回格式与find相同。参数中$maxDistance为经纬弧度(1° latitude = 111.12 kilometers)即 1/111.12,表>示查找附近一公里。 db.point.aggregate([{$geoNear:{near:[116.279943,40.049971],distanceField: "dist.calculated",maxDistance: 100/111.12,query:{"@bucket_sign":"f6c832afc1c578ee731273c14a0245b4"},includeLocs: "dist.location",uniqueDocs: true,num: 5,spherical:true,"distanceMultiplier": 6371}}]) 返回同1)find格式3)runCommand命令方式
db.runCommand({geoNear:"point",near:[116.305207,40.042053 ], maxDistance : 1/111.12,query: { "@bucket":"海底捞" }})
返回格式:
{ "ns" : "point", "near" : "", "results" : [ { "dis" : 0.0001138771267725113, "obj" : { "_id" : ObjectId("59eeeed3b5fbf3fa598cd4b0"), "@id" : 4, "@geo" : [ 40.041995, 116.305305 ], "@bucket" : [ "海底捞" ], "@bucket_sign" : [ "f6c832afc1c578ee731273c14a0245b4" ], "name" : "海底捞西北旺店" } }, { "dis" : 0.00011833849754085601, "obj" : { "_id" : ObjectId("59eeeed3b5fbf3fa598cd4af"), "@id" : 3, "@geo" : [ 40.041993, 116.305309 ], "@bucket" : [ "海底捞" ], "@bucket_sign" : [ "f6c832afc1c578ee731273c14a0245b4" ], "name" : "海底捞西二旗店" } } ], "stats" : { "time" : 2, "btreelocs" : 0, "nscanned" : 19, "objectsLoaded" : 10, "avgDistance" : 0.00011610781215668365, "maxDistance" : 0.00011833849754085601, "shards" : [ "ucp_shard_14", "ucp_shard_3", "ucp_shard_8" ] }, "ok" : 1 }
注1:mongodb3.x版本的两种geoNear查询方式都支持返回距离并按距离正序排序。
注2:使用geoNear获得的结果里dis的单位,有两种情况:
1)spherical设为false(默认),dis的单位与坐标的单位保持一致
如果保存的是longitude/latitude,则dis的单位就是经度(或者纬度,单位是一致的)
如果保存的是meter,则dis的单位就是meter
2)spherical设为true,dis的单位是弧度
想要换算成公里(km)的话,
要么在程序里做,要么使用distanceMultiplier参数来定义转换方式:
对应于1)
如果要保存的坐标是经纬度,要计算的是公里,可设置 distanceMultiplier: 111
如果要计算英里,可将111换成69
对应于2)
如果要计算公里,可设置 distanceMultiplier: 6371
如果要计算英里,则需要把6371换成3959
yan 17.10.24
参考:
http://www.cnblogs.com/shanyou/p/3494854.html
http://www.dewen.net.cn/q/7412
mongo php geonear_mongodb通过$geoNear进行坐标检索相关推荐
- leaflet通过经纬度定位_javascript – 如何使用Leaflet API从纬度和经度坐标检索LayerPoint(X,Y)...
如果我使用以下代码从指定的Lat / Lng获取LayerPoint: var latLng = new L.latLng(-37.81303878836989,144.97421264648438) ...
- 向量检索的索引构建算法综述
目录 VectorRetrieval github 落地场景 背景 框架 检索模型--暴力搜索.倒排索引 检索模型--kd-Tree.Annoy KD-Tree: Annoy: 检索模型--LSH 检 ...
- linux环境下搭建osm_web服务器四(对万国语的地名进行翻译和检索):
对万国语的地名进行翻译和检索 经过 前三篇的调试,已经有了一个完整的Map可以浏览,我们痛苦的世界范围数据下载.导入过程也结束了.要提醒一下的是,鉴于网速,不要下载 planetosm.lastest ...
- Redis地理算法GEO解析和应用
背景 获取周边信息:附近人?附近的公司?附近的餐厅?附近的星巴克? 获取两个坐标位置的距离? 实现 可以使用redis.mongo.mysql进行坐标检索换算实现,redis适用版本: >= 3 ...
- PHPExcel开发者文档[中文版]
1. 写在前面的话 首先,第一次翻译该文档,漏洞百出,希望大家给点意见和指导. phpExcel官网指出:PHPExcel是基于OPENXML标准,使用PHP读写并创建Excel文件电子表格的引擎. ...
- 安卓百度地图附近poi搜索以及到指定poi的换乘方案
我是第一次在CSDN写博客,是因为一起实习的学长嫌弃我总问他问题,就把一个类似于<车来了>的<班车系统>交给了我一个人,从那以后我必须要孤军奋战,自己研究不会的问题,对于我来说 ...
- Vertex Texture Fetch(VTF) Fragment Texture Fetch ( FTF )
在vertex shader里也可以检索纹理.我本来觉得这没什么好奇怪的,因为我一直也觉得这很当然可以啊~当初橙书(OpenGL Shading Language Edtion2)也说过texture ...
- Python操作Excel最好选择什么模块?
对比学习python,更高效~ Excel数据的类型及组织方式 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. 很多已经做案例的人,却 ...
- Vertex Texture Fetch 顶点纹理拾取
« 水效果Ⅱ - 涟漪学一学,VBO » Vertex Texture Fetch 顶点纹理拾取 2009-8-19 22:50:32 | 发布:zwqxin Vertex Texture Fetch ...
最新文章
- WinAPI: midiInReset - 重置输入
- python django 模板
- DL之RNN:人工智能为你写代码——基于TF利用RNN算法实现生成编程语言代码(C++语言)、训练测试过程全记录
- 沙雕同事一来公司就把高并发的程序搞崩了,我心态也蹦了!
- git提交代码到github时出现everything up-to-date,但是代码没有上传成功
- php表单复选传值,jQuery+SpringMVC中的复选框选择与传值实例_jquery
- [Hands On ML] 4. 训练模型
- android按钮旋转,单击一个按钮在android中顺时针旋转图像
- 封装性的基本使用练习1
- html隐藏域 js,JS实现“隐藏与显示”功能(多种方法)
- sublime ctrl b突然不能用解决方法
- 在web浏览器页面使用IC卡读卡器
- ISA防火墙基础及应用
- Access数据类型和SQL数据类型
- 百度地图路线规划重新设置起点、终点图标和路线颜色
- RabbitMQ(四):mandatory、immediate、备份交换器
- Android 使用RecyclerView实现(仿微信)的联系人A-Z字母排序和过滤搜索功能
- 英语语法笔记——冠词
- 商业智能(BI,Business Intelligence)。
- hp unix 日志文件的监测与文件清理