基于R树索引的点面关系判断以及效率优化统计
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处: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树索引的点面关系判断以及效率优化统计的更多相关文章
- 空间数据索引RTree(R树)完全解析及Java实现
第一部分 空间数据的背景介绍 空间数据的建模 基于实体的模型(基于对象)Entity-based models (or object based) 常用的空间数据查询方式 空间数据获取的方法 R树 简 ...
- Bw树:新硬件平台的B树(内存数据库中的b树索引)
Bw树:新硬件平台的B树 Bw树:新硬件平台的B树 1. 概述 1.1 原子记录存储(Atomic Record Stores) 1.2 新的环境 1.3 实现 2 Bwtree的体系结构 2.1 现 ...
- MySQL的B树索引与索引优化
MySQL的MyISAM.InnoDB引擎默认均使用B+树索引(查询时都显示为"BTREE"),本文讨论两个问题: 为什么MySQL等主流数据库选择B+树的索引结构? 如何基于索引 ...
- B树索引与索引优化
B树索引与索引优化 MySQL的MyISAM.InnoDB引擎默认均使用B+树索引(查询时都显示为“BTREE”),本文讨论两个问题: 为什么MySQL等主流数据库选择B+树的索引结构? 如何基于索引 ...
- 从B 树、B+ 树、B* 树谈到R 树
从B 树.B+ 树.B* 树谈到R 树 作者:July.weedge.Frankie.编程艺术室出品. 说明:本文从B树开始谈起,然后论述B+树.B*树,最后谈到R 树.其中B树.B+树及B*树部分由 ...
- R树空间索引
R树在数据库等领域做出的功绩是非常显著的.它很好的解决了在高维空间搜索等问题.举个R树在现实领域中能够解决的例子吧:查找20英里以内所有的餐厅.如果没有R树你会怎么解决?一般情况下我们会把餐厅的坐标( ...
- 从B树、B+树、B*树谈到R 树
从B 树.B+ 树.B* 树谈到R 树 作者:July.weedge.Frankie.编程艺术室出品. 说明:本文从B树开始谈起,然后论述B+树.B*树,最后谈到R 树.其中B树.B+树及B*树部分由 ...
- B树,B+树,B*树以及R树的介绍
https://blog.csdn.net/peterchan88/article/details/52248714 作者:July.weedge.Frankie.编程艺术室出品. 说明:本文从B树开 ...
- [转载]从B 树、B+ 树、B* 树谈到R 树
从B 树.B+ 树.B* 树谈到R 树 作者:July.weedge.Frankie.编程艺术室出品. 说明:本文从B树开始谈起,然后论述B+树.B*树,最后谈到R 树.其中B树.B+树及B*树部分由 ...
随机推荐
- java解析上传的excel
file是一个File,是一个excel文件 得到文件流:InputStream in = file.getInputStream() 需要引入的类 import jxl.Cell;import j ...
- Node软件的安装
1.官网网址:https://nodejs.org/en/ 左边被推荐,右边最新 下载完成一键下一步直接安装,当然,如果你想修改安装目录的话当然没问题,注意:不要有英文目录 2.Window+r打开命 ...
- C#与Java区别(一)
最近学了点java,总结了一些和c#的语法区别,欢迎大家指点和补充,如下: 1.java支持跨平台,当然.net core现在也支持. 2.java中用package,c#中用namespace定义空 ...
- Oralce Plsql 中文显示乱码问题无需修改注册表完美解决
此方法在其它版系统也可以解决 win10-64 plsql oracle 11g绿色版客户端 错误现象: 因为oracle用的是绿色版,无法设置注册表,尝试以下方法. 解决方法: 1.在plsql中查 ...
- nao安装中文包教程
本文介绍nao离线安装中文包 相官方索取 .demo 文件夹,里面包含很多的例程和中文包 下载winscp和putty(或者xshell),下载过程和安装我就不多说了,免费 把nao开机,连接路由器等 ...
- Omi v1.0.2发布 - 正式支持传递javascript表达式
原文地址:https://github.com/AlloyTeam/omi/ 写在前面 Omi框架可以通过在组件上声明 data-* 把属性传递给子节点. Omi从设计之初,就是往标准的DOM标签的标 ...
- TFS2017代码搜索功能
当团队或者公司的研发中心的代码库扩展到了一定程度,在代码库中查找一些需要的代码会变的比较困难.比如敏捷模式下的项目小组希望能够找到并重用其他小组开发的一些基础性的功能代码,我们通常需要去找当事人去询问 ...
- linux性能监控分析及通过nmon_analyse生成分析报表
nmon是一款分析 AIX 和 Linux 性能的免费工具 nmon 工具还可以将相同的数据捕获到一个文本文件,便于以后对报告进行分析和绘制图形.输出文件采用电子表格的格式 (.csv). 性能介绍 ...
- 找回mysql数据库root用户的密码
- iOS开发之清除缓存
NSFileManager *mgr = [NSFileManager defaultManager]; NSString *cachePath = [NSSearchPathForDirectori ...