转载自:http://blog.nosqlfan.com/html/1811.html

地理位置索引支持是MongoDB的一大亮点,这也是全球最流行的LBS服务foursquare 选择MongoDB的原因之一。我们知道,通常的数据库索引结构是B+ Tree,如何将地理位置转化为可建立B+Tree的形式,下文将为你描述。

首先假设我们将需要索引的整个地图分成16×16的方格,如下图(左下角为坐标0,0 右上角为坐标16,16):

单纯的[x,y]的数据是无法建立索引的,所以MongoDB在建立索引的时候,会根据相应字段的坐标计算一个可以用来做索引的hash值,这个值叫做geohash,下面我们以地图上坐标为[4,6]的点(图中红叉位置)为例。

我们第一步将整个地图分成等大小的四块,如下图:

划分成四块后我们可以定义这四块的值,如下(左下为00,左上为01,右下为10,右上为11):

01 11
00 10

这样[4,6]点的geohash值目前为 00

然后再将四个小块每一块进行切割,如下:

这时[4,6]点位于右上区域,右上的值为11,这样[4,6]点的geohash值变为:0011

继续往下做两次切分:

最终得到[4,6]点的geohash值为:00110100

这样我们用这个值来做索引,则地图上点相近的点就可以转化成有相同前缀的geohash值了。

我们可以看到,这个geohash值的精确度是与划分地图的次数成正比的,上例对地图划分了四次。而MongoDB默认是进行26次划分,这个值在建立索引时是可控的。具体建立二维地理位置索引的命令如下:

db.map.ensureIndex({point : "2d"}, {min : 0, max : 16, bits : 4})

其中的bits参数就是划分几次,默认为26次。

图解GeoHash算法--MongoDB 地理位置索引的实现原理相关推荐

  1. 图解 MongoDB 地理位置索引的实现原理

    地理位置索引支持是MongoDB的一大亮点,这也是全球最流行的LBS服务foursquare 选择MongoDB的原因之一.我们知道,通常的数据库索引结构是B+ Tree,如何将地理位置转化为可建立B ...

  2. mongodb地理位置索引实现原理

    地理位置索引支持是MongoDB的一大亮点,这也是全球最流行的LBS服务foursquare 选择MongoDB的原因之一.我们知道,通常的数据库索引结构是B+ Tree,如何将地理位置转化为可建立B ...

  3. 基于GeoHash算法的地理位置检索

    地理位置检索服务在日常生活中随处可见,小到共享单车.高德地图,大到飞行航线轨迹.上述服务中很多相关功能都可以通过GeoHash来实现,Lucene/Solr中也有应用到GeoHash,通过GeoHas ...

  4. Mongodb地理位置索引

    正在官方: 介绍:http://docs.mongodb.org/manual/applications/geospatial-indexes/ 建立索引:http://docs.mongodb.or ...

  5. MongoDB的地理位置索引

    背景 我们平常打开一些App的时候,经常有一个"查询周边景点"的功能,如我在高德里面就查询到了附近的景点. ​ 这种计算如果通过普通的关系型数据库,那对服务器和数据库的性能要求就太 ...

  6. mongodb java 地理位置_MongoDB的地理位置索引

    背景 我们平常打开一些App的时候,经常有一个"查询周边景点"的功能,如我在高德里面就查询到了附近的景点. 这种计算如果通过普通的关系型数据库,那对服务器和数据库的性能要求就太高了 ...

  7. LBS地理位置距离计算方法之【geohash算法】

    应用场景 最近的APP开发需求涉及到一个类似微信附近人的功能. APP是采集数据应用,当发布的任务绑定店铺的时候,如果用户在店铺附近,则可以浏览该题目,并且答题,得到相应的奖励. 为什么不直接使用经纬 ...

  8. 空间索引 - GeoHash算法及其实现优化

    转自原文 空间索引 - GeoHash算法及其实现优化 上篇博客中提到了空间索引的用途和多种数据库对空间索引的支持情况,那么在应用层以下,好学的小伙伴应该会考虑空间索引的实现原理了. 目前空间索引的实 ...

  9. [990]Geohash算法原理及实现

    文章目录 经纬度常识 基本原理 Geohash算法 GeoHash的精度 具体的计算方法 1.纬度相同,经度不同 2.经度相同,纬度不同 问题 代码实现 geohash在mysql中的使用 最近需要实 ...

最新文章

  1. 微信小程序教学第二章(含视频):小程序中级实战教程之预备篇 - 封装网络请求及 mock 数据...
  2. Simulink仿真教程1---一个简单的仿真例子
  3. JZOJ 3597. 【CQOI2014】危桥
  4. MacOS下MySQL配置
  5. 下面两种送礼模式会让你的生意兴隆
  6. 在Linux中查找用户帐户信息和登录详细信息的11种方法
  7. iPhone企业应用实例分析之一:系统介绍和需求及主要用例
  8. avast android高级版,排名第一 Android杀毒软件avast!评测
  9. 如何用photoshop快速换脸
  10. 新浪微博热门话题(30 分)(字符串)
  11. 西瓜书-机器学习复习<HENU>
  12. js中易错难点集合(1)
  13. 小米拒绝权限_手机用户隐私保护升级:小米MIUI 11支持“空信息授权”
  14. 关于TypeScript开发的6个小技巧
  15. Linux下无法使用v-2-ray
  16. 电脑连接电视html,电脑HDMI连接电视无信号的解决方法
  17. 监督学习和无监督学习(概念)
  18. python气泡图画_Python使用Plotly绘图工具,绘制气泡图
  19. 深入理解Java中的i++、++i语句
  20. C语言表达式和表达式的值

热门文章

  1. mysql指定当前时间为默认时间_MySQL设置当前时间为默认值的方法
  2. 函数实现十进制转二进制
  3. vs2010配置python_VS2010下python3的配置
  4. 【大数据分析常用算法】1.二次排序
  5. Jvm(4),保持线程可见性的几种方法
  6. mysql AB 的基本搭建
  7. iOS9的新特性以及适配方案
  8. 记录EasyUI使用中的问题和解决的方法
  9. [delphi]参数带有默认值的函数
  10. 性能调优-SQL TRACE