当前位置: 首页 > news >正文

图解 MongoDB 地理位置索引的实现原理(转)

原文链接:图解 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):

0111
0010

这样[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次。

相关文章:

  • 【转】越狱的 iPhone、iPad 通过网站实现一键安装 ipa 格式的 APP 应用
  • 软件测试流程进阶----两年软件测试总结
  • 使用sublime同步编辑线上脚本
  • Windows 7 64bit和Visual Studio 2010下安装及使用GnuWin32
  • iptables/netfilter防火墙
  • 对Spring 的面向切面的理解
  • 通过案例对SparkStreaming 透彻理解三板斧之一:解密SparkStreaming运行机制
  • 文件夹工具类 - FolderUtils
  • iOS中使用RSA对数据进行加密解密
  • 王高利:Apache2.4编译安装及其新特性
  • 小波说雨燕 第三季 构建 swift UI 之 UI组件集-视图集(五)Image View视图 学习笔记...
  • 机器学习中的数学(1)-回归(regression)、梯度下降(gradient descent)
  • Angularjs1.2版本与1.3版本中控制器的问题
  • php_note.txt
  • Tomcat设置,输入IP地址 ,直接访问项目主页
  • gcc介绍及安装
  • Netty源码解析1-Buffer
  • PHP的类修饰符与访问修饰符
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • webpack4 一点通
  • 从伪并行的 Python 多线程说起
  • 给新手的新浪微博 SDK 集成教程【一】
  • 回顾2016
  • 使用 QuickBI 搭建酷炫可视化分析
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 自动记录MySQL慢查询快照脚本
  • postgresql行列转换函数
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • 容器镜像
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • #ifdef 的技巧用法
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (C语言)共用体union的用法举例
  • (二)Eureka服务搭建,服务注册,服务发现
  • (九)One-Wire总线-DS18B20
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (算法二)滑动窗口
  • (五)网络优化与超参数选择--九五小庞
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • (转载)OpenStack Hacker养成指南
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .NET : 在VS2008中计算代码度量值
  • .NET Framework与.NET Framework SDK有什么不同?
  • .NET 服务 ServiceController
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)
  • .net中应用SQL缓存(实例使用)
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • /etc/skel 目录作用
  • @SuppressLint(NewApi)和@TargetApi()的区别
  • @TableLogic注解说明,以及对增删改查的影响
  • [ 攻防演练演示篇 ] 利用通达OA 文件上传漏洞上传webshell获取主机权限
  • [Android]一个简单使用Handler做Timer的例子
  • [C++]类和对象(中)