最近的项目涉及带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进行坐标检索相关推荐

  1. leaflet通过经纬度定位_javascript – 如何使用Leaflet API从纬度和经度坐标检索LayerPoint(X,Y)...

    如果我使用以下代码从指定的Lat / Lng获取LayerPoint: var latLng = new L.latLng(-37.81303878836989,144.97421264648438) ...

  2. 向量检索的索引构建算法综述

    目录 VectorRetrieval github 落地场景 背景 框架 检索模型--暴力搜索.倒排索引 检索模型--kd-Tree.Annoy KD-Tree: Annoy: 检索模型--LSH 检 ...

  3. linux环境下搭建osm_web服务器四(对万国语的地名进行翻译和检索):

    对万国语的地名进行翻译和检索 经过 前三篇的调试,已经有了一个完整的Map可以浏览,我们痛苦的世界范围数据下载.导入过程也结束了.要提醒一下的是,鉴于网速,不要下载 planetosm.lastest ...

  4. Redis地理算法GEO解析和应用

    背景 获取周边信息:附近人?附近的公司?附近的餐厅?附近的星巴克? 获取两个坐标位置的距离? 实现 可以使用redis.mongo.mysql进行坐标检索换算实现,redis适用版本: >= 3 ...

  5. PHPExcel开发者文档[中文版]

    1. 写在前面的话 首先,第一次翻译该文档,漏洞百出,希望大家给点意见和指导. phpExcel官网指出:PHPExcel是基于OPENXML标准,使用PHP读写并创建Excel文件电子表格的引擎. ...

  6. 安卓百度地图附近poi搜索以及到指定poi的换乘方案

    我是第一次在CSDN写博客,是因为一起实习的学长嫌弃我总问他问题,就把一个类似于<车来了>的<班车系统>交给了我一个人,从那以后我必须要孤军奋战,自己研究不会的问题,对于我来说 ...

  7. Vertex Texture Fetch(VTF) Fragment Texture Fetch ( FTF )

    在vertex shader里也可以检索纹理.我本来觉得这没什么好奇怪的,因为我一直也觉得这很当然可以啊~当初橙书(OpenGL Shading Language Edtion2)也说过texture ...

  8. Python操作Excel最好选择什么模块?

    对比学习python,更高效~ Excel数据的类型及组织方式 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. 很多已经做案例的人,却 ...

  9. Vertex Texture Fetch 顶点纹理拾取

    « 水效果Ⅱ - 涟漪学一学,VBO » Vertex Texture Fetch 顶点纹理拾取 2009-8-19 22:50:32 | 发布:zwqxin Vertex Texture Fetch ...

最新文章

  1. WinAPI: midiInReset - 重置输入
  2. python django 模板
  3. DL之RNN:人工智能为你写代码——基于TF利用RNN算法实现生成编程语言代码(C++语言)、训练测试过程全记录
  4. 沙雕同事一来公司就把高并发的程序搞崩了,我心态也蹦了!
  5. git提交代码到github时出现everything up-to-date,但是代码没有上传成功
  6. php表单复选传值,jQuery+SpringMVC中的复选框选择与传值实例_jquery
  7. [Hands On ML] 4. 训练模型
  8. android按钮旋转,单击一个按钮在android中顺时针旋转图像
  9. 封装性的基本使用练习1
  10. html隐藏域 js,JS实现“隐藏与显示”功能(多种方法)
  11. sublime ctrl b突然不能用解决方法
  12. 在web浏览器页面使用IC卡读卡器
  13. ISA防火墙基础及应用
  14. Access数据类型和SQL数据类型
  15. 百度地图路线规划重新设置起点、终点图标和路线颜色
  16. RabbitMQ(四):mandatory、immediate、备份交换器
  17. Android 使用RecyclerView实现(仿微信)的联系人A-Z字母排序和过滤搜索功能
  18. 英语语法笔记——冠词
  19. 商业智能(BI,Business Intelligence)。
  20. hp unix 日志文件的监测与文件清理

热门文章

  1. (信贷风控十)催收评分卡的介绍
  2. Hyper-V之虚拟磁盘压缩与收缩VHD 和 VHDX
  3. 谈组装电脑2013趋势
  4. 汇编语言(王爽) 课程设计一
  5. 招聘顶尖人才!旷视科技“MegEagle创视者计划”正式启动
  6. 2009老百姓最关心的十大问题
  7. IDEA 开发工具使用记录
  8. USB(CH376)使用笔记-U盘的数据读写
  9. 深入理解JVM(3)——7种垃圾收集器
  10. p5.js 我的第一幅码绘——小丑