文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/

1.背景

在之前的博客中,我分别介绍了基于网格的空间索引(http://www.cnblogs.com/naaoveGIS/p/5148185.html)以及四叉树和网格结合的联合索引(http://www.cnblogs.com/naaoveGIS/p/6641449.html),要解决的问题均是判断一个点落在了面图层中的哪个面要素中。单从算法层面上分析,以上两种索引均有一些弊端:

a.网格索引由于对整个空间进行网格划分,如果划分粒度太细容易出现索引冗余,如果划分粒度太大则索引效率又大幅度下降。

b.四叉树索引同样存在一个图元标识被多个区域所关联,相应地存储在多个叶子节点上,这样就存在索引的冗余,与网格索引存在同样的弊端。

为进一步优化索引,我们决定采用R树来进行优化。

2.R树介绍

R树主要运用空间分割的理念,即采用MBR(Minimal Bounding Rectangle,最小边界矩形)的方法,从叶子结点开始用矩形(rectangle)将空间框起来,结点越往上,框住的空间就越大,以此对空间进行分割:

所有的原始空间要素均是叶节点,这样便不会出现如四叉树索引和网格索引中出现的空间要素被多个索引段指引,进而出现大量冗余索引的问题。

3.基于JTS的具体实现

JTS中提供了构建索引的方法,其可以构建四叉树索引、R树索引、KD索引等。这里,我们直接使用JTS来构建R树索引。

JTS的介绍:https://en.wikipedia.org/wiki/JTS_Topology_Suite

JTS的源码下载:https://sourceforge.net/projects/jts-topo-suite/?source=navbar

3.1R树的构建

利用GT读取到本地的SHP,获取到所有的要素集,然后遍历要素将envelope和要素信息一一插入至StrTree中,构建R树:

3.2基于R树的查询

将查询的空间条件构造成一个Envelope在R树中查询,对查询出来的结果再次进行点面关系判断:

4.优化

在我们之前的两种索引方法中,我们均将索引文件保存到了本地,每次调用时去加载索引,如此IO是一个很大的瓶颈。现在我们创建一个容器,将StrTree保存至该容器中。查询时,直接从内存中获取到该树。

5.效率对比

5.1查询效率对比

在测试数据中选中一个特殊点(多个多边形的交接处):

分别对使用的三种索引进行了性能对比:

a.本地网格索引:

b.本地混合索引(四叉树与网格索引整合):

c.内存R树索引:

可见查询效率快了一倍左右。

5.2索引构建效率对比

样本数据有2000多个面要素,之前的两种索引均使用本地工具构建,时间大约是1S上下(没有具体统计)。现在使用JTS构建R树索引,效率为:

5.3占用的内存效率

此索引的优化中,我们将数据全部存入了内存。这里必须观察内存的占用量有多大。

一般监控内存有两种方式,通过工具查看或者代码段编写。代码段编写可以通过应用SizeOf.jar实现,工具查看可以通过jvisualvm实现:

原始的本地SHP数据大小为:3.8M。

网格索引大小为:4.4M。

混合索引文件的大小为:8.4M。

而读入内存中的R树索引的大小为:4.3M。

由于我们存储了要素所包含的所有信息,理论上,如果我们将存储信息进一步减少,内存占用会更小。目前来看,SHP数据本身的大小,会跟存入内存的信息大小有直接关系。

6.总结

目前索引方式任然有几点不足:

a.索引构建中的要素获取方式为本地SHP读取,需要扩展成对第三方服务数据的支持。

b.当R数查询命中只有一个要素时,因为最小矩形的范围是大于等于实际要素范围的,所以还要进行一次点面判断。如此,当图层要素个数本身不多时,建立索引不一定可以加速。

                             -----欢迎转载,但保留版权,请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/

        如果您觉得本文确实帮助了您,可以微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^

                     

基于R树索引的点面关系判断以及效率优化统计的更多相关文章

  1. 空间数据索引RTree(R树)完全解析及Java实现

    第一部分 空间数据的背景介绍 空间数据的建模 基于实体的模型(基于对象)Entity-based models (or object based) 常用的空间数据查询方式 空间数据获取的方法 R树 简 ...

  2. Bw树:新硬件平台的B树(内存数据库中的b树索引)

    Bw树:新硬件平台的B树 Bw树:新硬件平台的B树 1. 概述 1.1 原子记录存储(Atomic Record Stores) 1.2 新的环境 1.3 实现 2 Bwtree的体系结构 2.1 现 ...

  3. MySQL的B树索引与索引优化

    MySQL的MyISAM.InnoDB引擎默认均使用B+树索引(查询时都显示为"BTREE"),本文讨论两个问题: 为什么MySQL等主流数据库选择B+树的索引结构? 如何基于索引 ...

  4. B树索引与索引优化

    B树索引与索引优化 MySQL的MyISAM.InnoDB引擎默认均使用B+树索引(查询时都显示为“BTREE”),本文讨论两个问题: 为什么MySQL等主流数据库选择B+树的索引结构? 如何基于索引 ...

  5. 从B 树、B+ 树、B* 树谈到R 树

    从B 树.B+ 树.B* 树谈到R 树 作者:July.weedge.Frankie.编程艺术室出品. 说明:本文从B树开始谈起,然后论述B+树.B*树,最后谈到R 树.其中B树.B+树及B*树部分由 ...

  6. R树空间索引

    R树在数据库等领域做出的功绩是非常显著的.它很好的解决了在高维空间搜索等问题.举个R树在现实领域中能够解决的例子吧:查找20英里以内所有的餐厅.如果没有R树你会怎么解决?一般情况下我们会把餐厅的坐标( ...

  7. 从B树、B+树、B*树谈到R 树

    从B 树.B+ 树.B* 树谈到R 树 作者:July.weedge.Frankie.编程艺术室出品. 说明:本文从B树开始谈起,然后论述B+树.B*树,最后谈到R 树.其中B树.B+树及B*树部分由 ...

  8. B树,B+树,B*树以及R树的介绍

    https://blog.csdn.net/peterchan88/article/details/52248714 作者:July.weedge.Frankie.编程艺术室出品. 说明:本文从B树开 ...

  9. [转载]从B 树、B+ 树、B* 树谈到R 树

    从B 树.B+ 树.B* 树谈到R 树 作者:July.weedge.Frankie.编程艺术室出品. 说明:本文从B树开始谈起,然后论述B+树.B*树,最后谈到R 树.其中B树.B+树及B*树部分由 ...

随机推荐

  1. 1789: [Ahoi2008]Necklace Y型项链

    1789: [Ahoi2008]Necklace Y型项链 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 421  Solved: 258[Submit] ...

  2. 一个想法照进现实-《IT连》创业项目:三天的风投对接活动内幕分享

    前言: 话说出来创业的,都有一颗寻找风投的心,只因都有一个共同的特征:缺钱. 有的只是缺几十万,有的缺几百万,有的缺几千万,有的缺几个亿. 中国的市场,只要有需求,就有服务,只要有服务,就多了套路. ...

  3. 九度OJ题目1076:N的阶乘 (java)运用BigInteger的例子。

    题目描述: 输入一个正整数N,输出N的阶乘. 输入: 正整数N(0<=N<=1000) 输出: 输入可能包括多组数据,对于每一组输入数据,输出N的阶乘 样例输入: 4 5 15 样例输出: ...

  4. 升级后 VTE 类虚拟终端不工作

    故障现象 运行 vte 终端,如 gnome terminal.sakura 等光标不出来.xterm 可以运行. 在 xterm 终端中运行 gnome terminal 出现一下错误: grant ...

  5. linux计算程序运行时间

    转自: http://www.cnblogs.com/NeilHappy/archive/2012/12/08/2808417.html #include <sys/time.h> int ...

  6. ubuntu firefox上看视频,安装flash啊

    这是针对于直接硬盘安装的linux系统: u盘安装选择了安装第三方软件的话就不会存在这种问题 flash的安装其实也不是很难的,有点耐心就ok了 总结一下: 1:肯定是下载最新版的flash啦,注意看 ...

  7. JVM中GC浅解:垃圾回收的了解

    1.为什么要有GC 没有GC的世界,我们需要手动进行内存管理,但是内存管理是纯技术活,又容易出错.但是我们写码的目的是为了解决业务问题,所以可以把这种纯技术活自动化,当然自动化也是有代价的. 2.垃圾 ...

  8. ubuntu nsight上链接OpenGL

    写一个需要使用OpenGL的程序,右击该程序名,此处需要OpenGL库的程序为Julia-C 右击,选择属性,弹出属性对话框,在左边选择build下的设置,中间窗格中选择GCC C++ Linker下 ...

  9. javaScriptCore 实战 与 小结

      源码在这,看不懂的直接撸源码就行,转载声明出处 原生调用JS的大致流程,做了个思维简图 这是代码流程 // JS数据 func getJSVar() { let context: JSContex ...

  10. JQ实战一之烟花

    本次的效果大概为当用户点击网页时,网页下方弹出一个类似烟花的长条条,然后在桌面上散开以达成类似烟花的特效.话不多说先上图. 首先布局,布局很简单 <style> body { backgr ...