当前位置: 首页 > 编程日记 > 正文

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次。

相关文章:

NSMakeRange基础函数应用

NSRange NSMakeRange (NSUInteger loc,NSUInteger len );这是官方得接口描述。loc 为location缩写,len 表示长度。作用:在loc指定得位置开始往后获取len长度个得元素。示例程序使用这个函数来为指定数组得某个位置向后指定长度得元素集合。如NSRange NSM…

上传图片,要求图片200100象素,大小小于2M

作者:网际浪子专栏(曾用名littlehb) http://blog.csdn.net/littlehb/上传图片,要求图片200100象素,大小小于2M,如果图片不符合要求,不能上传,否则上传图片,上传以后对图…

炸裂!这些大厂跪求的人才太牛了!

今年所有的互联网公司都在ALL in AI,百度、腾讯、阿里巴巴、京东等互联网巨头都在四处挖掘AI人才。AI的岗位需求很多,几乎每天都有数百个JD放出。而亿欧智库发布的《2020全球人工智能人才培养研究报告》提到,近4年AI人才的需求量以每年74%的速…

新春祝福必杀计之发送短信攻略

新的一年就要到了,陆陆续续的收到很多同事们的短信祝福,哎,不能欠人家的人情债啊,但是我实在是个懒人啊,这个祝福短信还是要回复的啊,我的手机里有超过百位联系人,全是和工作有关的,…

centos6.5环境DNS-本地DNS主从服务器bind的搭建

centos6.5环境DNS-本地DNS主从服务器bind的搭建在上一篇博客中我已经搭建好了一个本地DNS服务器,能够实现正向反向解析,那么我们只需要加入一台从DNS服务器即可完成,我们来开始配置主从服务器:一.主DNS服务器上面的额外…

再见,Python!

结合我最近这些年的 Python 学习、开发经验,发现近90%的程序员在学 Python 时都会遇到下面这3个问题:1.想学Python,但不知从何学起,应用方向太多了也不知道该选择什么方向...2.基础入门看似简单,但是进阶实战就举步维艰…

如何更新父窗体

Response.Write("<script languagejavascript>window.opener.locationwindow.opener.location.href;</script>") 第一种方案是&#xff1a;file a.htm function OpenDialog(url,param){return window.open(url,param, "DialogWidth:450px;DialogH…

文件体积单位的换算

单位转换&#xff08;参考&#xff09;&#xff1a; 1bit&#xff08;这个比特表示一个二进制数字&#xff09; 1Byte&#xff08;这个单词音译过来也叫“比特”但是表示一个十六进制的数字&#xff09; 1B1Byte8bit 1 kB 1024 B (kB - kilobyte) 千 1 MB 1024 kB (MB - mega…

防止盗链下载问题

经常在网络上四处载东西&#xff0c;有时碰到直接拷贝一个类似 http://193.100.100.56/TestWebSolution/WebApplication1/test.rar地址准备下载test.rar文件时&#xff0c;却被告知没有登录或者直接跳转到其他页面的情况&#xff0c;然后等登录后直接下载该文件。要实现上面情况…

中国人工智能市场破 50 亿!你还不了解 AI 云服务吗?

作者 | 马超责编 | 伍杏玲出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;从AI的发展趋势来看&#xff0c;最新的人工智能模型对于算力的要求往往较高&#xff0c;如谷歌的T5&#xff0c;其整个模型的参数数量达到了惊人的 110 亿&#xff0c;谷歌科学家更在T5的论…

Java中数据存储方式

2019独角兽企业重金招聘Python工程师标准>>> 1&#xff0e; 寄存器&#xff08;register&#xff09;。这是最快的存储区&#xff0c;因为它位于不同于其他存储区的地方——处理器内部。但是寄存器的数量极其有限&#xff0c;所以寄存器由编译器根据需求进行分配。你…

Oracle与JCP执行委员会分享了他们的Java EE策略

Anil Gaur是Oracle集团负责Java EE和WebLogic Server的副总裁。他受邀在上一次的JCP执行委员会会议上发表了演讲&#xff0c;透露了有关Java EE未来发展的一些信息。他所传达的信息和Oracle之前的说法一致&#xff1a;企业编程正在发生变化&#xff0c;Oracle希望适应这种变化。…

5G:新基建的压舱石,如何为新基建按下“加速键”?

受访嘉宾 | 广和通 CEO 应凌鹏记者 | 邓晓娟2019 年&#xff0c;伴随着 5G 的浪潮&#xff0c;5G、AI、AIoT等新兴技术得到了全面的爆发&#xff0c;过去人们认为遥不可及的「高科技」&#xff0c;也逐渐走下“神坛”来进入大家的生活。5G 时代的万物互联&#xff0c;在本次疫情…

no argument specified with option /LIBPATH:错误的解决

作者&#xff1a;朱金灿来源&#xff1a;http://blog.csdn.net/clever101下午使用VS2005编译工程碰到一个链接错误&#xff1a;no argument specified with option "/LIBPATH:"。检查了链接库的文件路径&#xff0c;发现某个路径是非法的&#xff08;即不存在该文件路…

Animation 模拟纸盒的爆破

用简单的Animation动作模拟爆破的瞬间&#xff0c;仔细的调整各种参数效果会更像 原理&#xff1a;用定义好的纸张从onTouch中心点向四面八方散开&#xff0c;散开过程中&#xff0c;使用不用的速度、大小、方向、旋转角度、透明度&#xff08;这里纸张可以加上火焰&#xff0c…

代码恒久远,GitHub 永流传

作者 | 唐小引题图 | GitHub来源 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;这两天&#xff0c;在 GitHub 上积极贡献代码的许多开发者都收到了「Arctic Code Vault Contributor」的荣誉勋章的通知&#xff0c;并非常兴奋地晒起了朋友圈。因为这标志着自己在 GitHu…

不允许后退的方法

由于项目的需要不允许系统在提交之后&#xff0c;按IE的后退按钮进行再次提交。试试了一下在 .NET中通过如下语句 Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache);就可以使页面的缓存失效&#xff0c;每次都需要获取新页面。 <script>history.for…

3个题目熟悉类和对象基础

1、按要求编写Java应用程序&#xff1a; &#xff08;1&#xff09;编写西游记人物类&#xff08;XiYouJiRenWu&#xff09;其中属性有&#xff1a;身高&#xff08;height&#xff09;&#xff0c;名字&#xff08;name&#xff09;&#xff0c;武器&#xff08;weapon&#x…

按下回车表示确定提交

<body οnkeydοwn"if (event.keyCode13) {document.all.button2.click()}"> 下面的五种方法都可以帮你解决这种问题1.<script languagejavascript>function document.onkeydown(){ if (event.keyCode 13) { if (event.srcElement docum…

A股暴跌,户均亏2万!刚写好的辞职信又撕了……

仅用1天&#xff0c;A股市值单日蒸发达到3.5万亿&#xff0c;人均亏了超2万&#xff01;“芯片龙头”企业中芯国际正式登陆科创板&#xff0c;使得半导体板块整体跌幅较小。中芯国际上市首日涨幅超200%&#xff0c;收报82.92元&#xff0c;总市值达6137.57亿元&#xff0c;成为…

DataList在无数据记录时显示类似GridView空模板(EmptyDataTemplate)

在FooterTemplate加个Label并根据repeater.Items.Count判断是否有记录。HTML代码&#xff1a; <FooterTemplate> <asp:Label ID"lblEmpty" Text"No data recprd exist !" runat"server" Visible<%#bool.Parse((DataList1.I…

QButtonGroup 的使用

1、3以后尽量手写&#xff0c;因为没有现在的控件了 2、 1 // lyy : 2016/8/26 12:17:41 说明:存放radioButton2 QButtonGroup *buttonGroup;3 // lyy : 2016/8/26 11:11:55 说明:radioButton4 buttonGroup new QButtonGroup();5 buttonGroup->addButt…

机器学习算法易受攻击?阿里“安全基建”这样应对AI的不安全

出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;数字基建的浪潮之下&#xff0c;诸多行业领域都在加速融合5G、大数据中心、AI等新技术&#xff0c;向数字化转型。近日&#xff0c;多位全国政协委员、院士和安全行业专家提出&#xff0c;应尽快出台安全基建国家标准&…

不可以输入中文

function checkCH() {var strtxtPwd.value;var c /[/u4e00-/u9fa5]/;if(c.test(str)){alert("不能输入中文。");return false;}return true; }

tomcat虚拟路径的几种配置方法

tomcat配置虚拟路径的4种方法在tomcat中&#xff0c;webapp文件夹默认为web应用的根目录。1.在tomcat\conf\server.xml中找到 host标签&#xff0c;在host标签中增加新的元素<Context/>并设置 Context的元素&#xff0c;其中path元素所设置的值就是在浏览器中所要访问的虚…

hi35183e增加exfat文件系统的支持

64G-128G的tf卡文件系统格式为exfat&#xff0c;而hi3518e默认只支持fat32格式的tf卡。为了挂载64G以上的tf卡&#xff0c;只能将sd卡先格式化成FAT32。鉴于exfat性能比FAT32强&#xff0c;因此考虑移植exfat驱动到海思3518e平台,这样就不用强制格式化tf卡。 拷贝驱动源码到内核…

XML的简单读取与写入

作者&#xff1a;网际浪子专栏&#xff08;曾用名littlehb&#xff09; http://blog.csdn.net/littlehb/我用的是一种很笨的方法&#xff0c;但可以帮助初学者了解访问XML节点的过程。已知有一个XML文件&#xff08;bookstore.xml&#xff09;如下&#xff1a; <?xml ver…

美国 AI 博士一针见血:Python 这样学最容易成为高手!

我见过市面上很多的 Python 讲解教程和书籍&#xff0c;他们大都这样讲 Python 的&#xff1a;先从 Python 的发展历史开始&#xff0c;介绍 Python 的基本语法规则&#xff0c;Python 的 list, dict, tuple 等数据结构&#xff0c;然后再介绍字符串处理和正则表达式&#xff0…

区域链实践第一步——区域链测试环境搭建

区域链光速发展&#xff0c;在许多人的期许下&#xff0c;已经成为了互联网下一个革新点。区块链会成就的未来价值互联网&#xff0c;是新时代的基石。 IBM中国研究院开发的超能云&#xff08;SuperVessel&#xff09;平台提供了给区块链爱好者、开发者的区块链开发测试环境。通…

DataGrid的几个小技巧

作者&#xff1a;网际浪子专栏&#xff08;曾用名littlehb&#xff09; http://blog.csdn.net/littlehb/方法一:使用模版列 我们在绑定好数据的DataGrid增加一个模版列,在列中放置一个按钮<asp:TemplateColumn><ItemTemplate><asp:Button id"btnDelete&q…