原文链接:图解 MongoDB 地理位置索引的实现原理

地理位置索引支持是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次。

最新文章

  1. sql server 去除(替换)空格,回车,换行 函数
  2. php-empty()
  3. 精通 CSS 选择器(二)
  4. Linux high memory 学习总结
  5. Effective Java 32 Use EnumSet instead of bit fields
  6. surface RT app安装心得
  7. OUYA游戏开发核心技术剖析OUYA游戏入门示例——StarterKit
  8. 批量清除.svn 或 _svn
  9. 20145236 冯佳 《Java程序设计》第3周学习总结
  10. 四则运算2扩展---c++
  11. 参加魅族 flyme 互联网编程大赛的一些感受
  12. CentOS 6.4 64位 源码编译hadoop 2.2.0
  13. cordova开发中遇到的一些坑
  14. HDFS 2中Namenode启动时WebUI的变化
  15. python进程池剖析(一)
  16. Cocos2dx 学习笔记整理----在项目中使用图片(三)
  17. Vmware Vsphere WebService之vijava 开发一-vcenter连接、及集群信息获取
  18. js中的匿名函数自执行
  19. WordPress添加显示和隐藏侧边栏按钮开关
  20. java基础(一):我对java的三个环境变量的简单理解和配置

热门文章

  1. Codeforces-1084C
  2. [转]我的数据结构不可能这么可爱!——珂朵莉树(ODT)详解
  3. odoo导入功能二开
  4. Python基础笔记(三)
  5. linux安装project lemon测评机
  6. qq sid qq sid 是什么 qq sid 怎么用
  7. BZOJ4317: Atm的树
  8. 吴恩达-coursera-机器学习-week3
  9. apache2.4配置https
  10. JSP Servlet学习笔记——使用fileupload上传文件