本章介绍用HBase存储、高效查询地理位置信息。

Geohash空间索引

考虑LBS应用中常见的两个问题:1)查找离某地近期的k个地点。2)查找某区域内地点。

假设要用HBase实现高效查找,首先要考虑的是空间局部性(Spatial Locality),即位置上相近的点得物理存储在一起。

最简单的地理位置数据由两个维度组成:经度X和纬度Y。那么相相应最简单的Rowkey也能够由X和Y组成。Rowkey的有序性决定了数据首先依照经度X排序。再依照纬度Y排序,这样的方式最大的问题是经度值相等的A地点和B地点,可能纬度上相差十万八千里。

Geohash的解决思路是将经度和纬度以同样的权重构建空间索引。详细算法例如以下图:在经度范围[-180。180],纬度范围[-90,90]内不断进行二分查找,假设值位于上半区则记标识位为1,位于下半区则记标识位为0。终于结果由经度纬度标识位交叉组成。

(注:在HBase中能够存储标识位的Base32编码串,每一个字符是5个bit位的编码结果)

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaWRvbnR3YW50b2Jl/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

观察下面数据例子。可知geohash较好地反映了空间局部性:数据依照距离远近有序排列,距离相近的点geohash值有着很多其它的同样前缀。

查找近期K个邻居

通过扫描geohash前缀能够高效解决这个问题1:查找离某地近期的k个地点。

当然,须要选择合适的位数来进行前缀匹配扫描。使用较少的位数能降低扫描次数,但可能会返回多余的数据,而使用较多的位数能可能每次扫描返回的结果优先,导致须要多次扫描。

然而,geohash值也存在一些问题,不能使用简单的前缀匹配扫描来查找邻居,例如以下图:有限长度的geohash值在地图上表示为一个矩形区域。位于中间的是dr5ruzb区域,它下方的邻居区域和它有着5位长度的同样前缀,而上方的三个区域尽管位置相邻,但仅仅有这2位长度的同样前缀。

所以,假设要查找dr5ruzb的近期k个邻居,保险起见,能够一起查找它周围8个相邻区域的近期k个邻居。然后将全部查找到的点依照距离排序再得出终于结果。伪代码例如以下:takeN查找某个区域的近期n个点

queryKNN则使用takeN查找四周8个相邻区域的近期n个点。终于再排序取值。

区域内查找

来一个区域内查找的实例:在某某广场内有多少个wifi热点?解决思路分两步:

第一步。将区域内查找转化为对一系列geohash索引的扫描。

第二步。推断扫描到的坐标点是否包括在待查找区域多边形内。

工具方面。能够使用JTS Topology Suite(http://tsusiatsoftware.net/jts/main.html),JTS实现了常见几何对象、空间拓扑数据结构和操作算法。使用JTS查找待扫描的geohash坐标详细过程例如以下:

  1. 依据待查找区域的各个顶点初始化多边形对象Geometry。并得出多边形对象的质心Centroid。
  2. 对质心Centorid坐标进行geohash编码,精度取一定位数,假设geohash编码所代表的闭包已经覆盖了待查找多边形对象Geometry,那么直接返回质心作为待扫描的坐标。假设没有覆盖,继续步骤3。
  3. 与前一节类似做法找到质心Centroid的四周8个相邻区域,闭包的范围扩大至包括这8个相邻区域顶点,再次推断闭包是否覆盖待查找区域。

    假设覆盖,那么这9个点一起作为待扫描的坐标返回;假设还是不能覆盖。返回到步骤2。使用更短的geohash编码长度来扩大位置范围,直到覆盖待查找区域为止。

得到待扫描geohash坐标后,使用前一节近期K个邻居查找算法在HBase表中扫描出一系列附近坐标点,最后过滤掉不在待查找区域范围内的坐标点。当中,过滤步骤能够通过Filter过滤器完毕。能利用上HBase的分布式并行处理能力,降低到client的传输数据量。

读书笔记-HBase in Action-第三部分应用-(2)GIS系统的更多相关文章

  1. HBase in Action前三章笔记

    近期接触HBase,看了HBase In Action的英文版.開始认为还行,做了些笔记.可是兴许看下去,越来越感觉到实战这本书比較偏使用上的细节,对于HBase的具体设计涉及得很少.把前三章的一些笔 ...

  2. 读书笔记-HBase in Action-第一部分 HBase fundamentals

    新项目准备上HBase.HBase眼下由组里某牛负责.本着学会使用HBase的目标,先阅读下HBase in Action,一共十章组织成三部分,须要学习的内容包含HBase基本实现原理,用法,Sch ...

  3. 读书笔记-HBase in Action-第三部分应用-(1)OpenTSDB

    OpenTSDB是基于HBase的开源监控系统,能够支持上万规模集群监控和上亿数据点採集. 当中TSDB代表Time Series Database,OpenTSDB在时间序列数据的存储和查询上都做了 ...

  4. 读书笔记-HBase in Action-第二部分Advanced concepts-(2)Coprocessor

    Coprocessor是HBase 0.92.0引入的特性.使用Coprocessor.能够将一些计算逻辑下推到HBase节点,HBase由一个单纯的存储系统升级为分布式数据处理平台. Coproce ...

  5. Getting Started With Hazelcast 读书笔记(第二章、第三章)

    第二章 起步 本章就相当简单粗暴了,用一个个例子说明hazelcast怎么用. 1.map,set,list这些集合类都是开箱即用的,只要从Hazelcast的实例中获取一份就行. 2.增加了Mult ...

  6. 【读书笔记】.Net并行编程(三)---并行集合

    为了让共享的数组,集合能够被多线程更新,我们现在(.net4.0之后)可以使用并发集合来实现这个功能.而System.Collections和System.Collections.Generic命名空 ...

  7. 【读书笔记】iOS-开发技巧-三种收起键盘的方法

    - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typica ...

  8. 读书笔记-HBase in Action-第二部分Advanced concepts-(1)HBase table design

    本章以山寨版Twitter为例介绍HBase Schema设计模式.广义的HBase Schema设计不仅仅包含创建表时指定项,还应该综合考虑Column families/Column qualif ...

  9. unix-环境高级编程-读书笔记与习题解答-第三篇

    第一章 第五节 进程与控制 该小节比较粗略的阐述了unix操作系统中用于进程控制的三个函数,分别为 : fork , exec, waitpid, 其中 exec 有五种变体, 这些变体实现的功能全部 ...

随机推荐

  1. QT_1

    QT概述 1.1 QT 是一个跨平台的C++图形用户界面应用程序框架 1.2 发展史: 1991奇趣科技 1.3 QT 版本:商业版.开源版 1.4 优点: 1.4.1 跨平台 1.4.2 接口简单 ...

  2. python:第一章

    完成同一个任务,C语言要写1000行代码,Java只需要写100行,而Python可能只要20行. 代码少的代价是运行速度慢,C程序运行1秒钟,Java程序可能需要2秒,而Python程序可能就需要1 ...

  3. Python---哈夫曼树---Huffman Tree

    今天要讲的是天才哈夫曼的哈夫曼编码,这是树形数据结构的一个典型应用. !!!敲黑板!!!哈夫曼树的构建以及编码方式将是我们的学习重点. 老方式,代码+解释,手把手教你Python完成哈夫曼编码的全过程 ...

  4. 函数内部属性之arguments和this

    在函数内部,有两个特殊的对象:arguments和this. 1.arguments arguments是一个类数组对象.包含着传入函数中的所有参数.但这个对象还有一个名叫callee的属性,该属性是 ...

  5. CSS--浮动与定位

    *浮动布局能够实现横向多列布局. 1.在网页中,元素有三种布局模型: 1.流动模型(Flow) 2.浮动模型 (Float) 3.层模型(Layer) 流动(Flow)是默认的网页布局模式.流动布局模 ...

  6. SCI journals on Energy

    SCI journals on Energy Table of Contents 1. SCI- Clarivate - Thomson Reuters 1 SCI- Clarivate - Thom ...

  7. 3. express 框架使用 vue框架 weiUI

    express 1. 安装 npm install express --save 2. 创建项目 vue js 安装Vuejs vue-cli 是一个官方发布 vue.js 项目脚手架,使用 vue- ...

  8. Couchbase第一印象(架构特性)

    Couchbase第一印象(架构特性) 面向文档 保存的字节流总有一个 DOCUMENT ID(Object_ID) 高并发性,高灵活性,高拓展性,容错性好 面向文档的集群存储系统 每个文档用一个唯一 ...

  9. STM32F407 独立看门狗 个人笔记

    什么是看门狗 如果程序跑飞了怎么办? 可以用看门狗来监控. 看门狗是: 一个递减的计数器,如果不按时给计数器赋值,计数器的值减到一定程度,就会使系统复位. 也就是说如果程序运行异常,无法正常给计数器赋 ...

  10. [luoguP1266] 速度限制(spfa)

    传送门 因为到某一没有限速的路径速度会有不同的可能,所以直接用 dis[i][j] 表示到第 i 个点速度为 j 时的最短时间,然后跑spfa. ——代码 #include <queue> ...