读书笔记-HBase in Action-第三部分应用-(2)GIS系统
2014-09-19 21:34
316 查看
本章介绍用HBase存储、高效查询地理位置信息。
Geohash的解决思路是将经度和纬度以相同的权重构建空间索引。具体算法如下图:在经度范围[-180,180],纬度范围[-90,90]内不断进行二分查找,如果值位于上半区则记标识位为1,位于下半区则记标识位为0。最终结果由经度纬度标识位交叉组成。(注:在HBase中可以存储标识位的Base32编码串,每个字符是5个bit位的编码结果)
观察以下数据样例,可知geohash较好地反映了空间局部性:数据按照距离远近有序排列,距离相近的点geohash值有着更多的相同前缀。
然而,geohash值也存在一些问题,不能使用简单的前缀匹配扫描来查找邻居,如下图:有限长度的geohash值在地图上表示为一个矩形区域。位于中间的是dr5ruzb区域,它下方的邻居区域和它有着5位长度的相同前缀,而上方的三个区域虽然位置相邻,但只有这2位长度的相同前缀。
所以,如果要查找dr5ruzb的最近k个邻居,保险起见,可以一起查找它周围8个相邻区域的最近k个邻居,然后将所有查找到的点按照距离排序再得出最终结果。伪代码如下:takeN查找某个区域的最近n个点
queryKNN则使用takeN查找四周8个相邻区域的最近n个点,最终再排序取值。
第一步,将区域内查找转化为对一系列geohash索引的扫描。
第二步,判断扫描到的坐标点是否包含在待查找区域多边形内。
工具方面,可以使用JTS Topology Suite(http://tsusiatsoftware.net/jts/main.html),JTS实现了常见几何对象、空间拓扑数据结构和操作算法。使用JTS查找待扫描的geohash坐标具体步骤如下:
根据待查找区域的各个顶点初始化多边形对象Geometry,并得出多边形对象的质心Centroid。
对质心Centorid坐标进行geohash编码,精度取一定位数,如果geohash编码所代表的闭包已经覆盖了待查找多边形对象Geometry,那么直接返回质心作为待扫描的坐标。如果没有覆盖,继续步骤3。
与前一节类似做法找到质心Centroid的四周8个相邻区域,闭包的范围扩大至包含这8个相邻区域顶点,再次判断闭包是否覆盖待查找区域。如果覆盖,那么这9个点一起作为待扫描的坐标返回;如果还是不能覆盖,返回到步骤2,使用更短的geohash编码长度来扩大位置范围,直到覆盖待查找区域为止。
得到待扫描geohash坐标后,使用前一节最近K个邻居查找算法在HBase表中扫描出一系列附近坐标点,最后过滤掉不在待查找区域范围内的坐标点。其中,过滤步骤可以通过Filter过滤器完成,能利用上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位的编码结果)
观察以下数据样例,可知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坐标具体步骤如下:
根据待查找区域的各个顶点初始化多边形对象Geometry,并得出多边形对象的质心Centroid。
对质心Centorid坐标进行geohash编码,精度取一定位数,如果geohash编码所代表的闭包已经覆盖了待查找多边形对象Geometry,那么直接返回质心作为待扫描的坐标。如果没有覆盖,继续步骤3。
与前一节类似做法找到质心Centroid的四周8个相邻区域,闭包的范围扩大至包含这8个相邻区域顶点,再次判断闭包是否覆盖待查找区域。如果覆盖,那么这9个点一起作为待扫描的坐标返回;如果还是不能覆盖,返回到步骤2,使用更短的geohash编码长度来扩大位置范围,直到覆盖待查找区域为止。
得到待扫描geohash坐标后,使用前一节最近K个邻居查找算法在HBase表中扫描出一系列附近坐标点,最后过滤掉不在待查找区域范围内的坐标点。其中,过滤步骤可以通过Filter过滤器完成,能利用上HBase的分布式并行处理能力,减少到客户端的数据传输量。
相关文章推荐
- 读书笔记-HBase in Action-第三部分应用-(1)OpenTSDB
- 读书笔记-HBase in Action-第二部分Advanced concepts-(3)非Java客户端
- 读书笔记-HBase in Action-第二部分Advanced concepts-(2)Coprocessor
- 读书笔记-HBase in Action-第四部分-(2)运维
- 读书笔记-HBase in Action-第二部分Advanced concepts-(1)HBase table design
- 读书笔记-HBase in Action-第二部分Advanced concepts-(3)非Javaclient
- 读书笔记-HBase in Action-第二部分Advanced concepts-(1)HBase table design
- 读书笔记-HBase in Action-第二部分Advanced concepts-(2)Coprocessor
- 读书笔记-HBase in Action-第四部分-(1)部署
- 读书笔记之: 操作系统概念(第6版)-第三部分 存储管理2(文件系统接口, 文件系统实现)
- [资源共享]C#+AE构建GIS桌面端应用系统框架-全代码
- 如何应用设计模式设计你的足球引擎(第三、四部分)完
- [转]如何使用国际开源项目构建一个完整的GIS(地理信息)应用系统
- [资源共享]C#+AE构建GIS桌面端应用系统框架-全代码
- 使用开源项目打造GIS应用系统
- 用Mochiweb打造百万级Comet应用,第三部分(续2)
- 《城市规划》(清华谭纵波著)读书笔记之第三部分
- 小型GIS在电力系统中的管理应用
- 用Mochiweb打造百万级Comet应用,第三部分 (待续)
- Bash 示例,第三部分 ebuild 系统探秘