基于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/

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

                                                                                         

 

时间: 2024-09-21 01:48:35

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

源代码-关于C语言编程中R树索引的问题

问题描述 关于C语言编程中R树索引的问题 求教有没有大神知道R树索引如何建立.删除.插入等,急需一份源代码参考学习.谢谢啊,好人一生平安... 解决方案 http://www.cnblogs.com/javaspring/archive/2012/08/14/2656223.html

基于KD树和R树的多维云数据索引

基于KD树和R树的多维云数据索引 何婧 吴跃 杨帆 尹春雷 周维 针对云存储系统大多基于键值对key,value模型存储数据,多维查询需要对整个数据集进行完全扫描,查询效率较低的问题,提出了一种基于KD树和R树的多维索引结构(简称KD-R索引).KD-R索引采用双层索引模式,在全局服务器建立基于KD树的多维全局索引,在局部数据节点构建R树多维本地索引.基于性能损耗模型,选取索引代价较小的R树节点发布到全局KD树,从而优化多维查询性能.实验结果表明:与全局分布式R树索引相比,KD-R索引能够有效提

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

转自:http://blog.csdn.net/v_JULY_v/article/details/6530142/ 作者:July.weedge.Frankie.编程艺术室出品. 说明:本文从B树开始谈起,然后论述B+树.B*树,最后谈到R 树.其中B树.B+树及B*树部分由weedge完成,R 树部分由Frankie完成,全文最终由July统稿修订完成. 出处:http://blog.csdn.net/v_JULY_v .   第一节.B树.B+树.B*树 1.前言: 动态查找树主要有:二叉查

MySQL的B+树索引

本文讨论MySQL支持的索引类型及其优缺点.要注意的是:在MySQL中,索引是在存储引擎层而不是服务器 层实现,所以不同存储引擎的索引的工作方式并不一样,也不是所有的存储引擎都支持所有类型的索引. B+树是一种经典的数据结构,由平衡树和二叉查找树结合产生,它是为磁盘或其它直接存取辅助设备而设 计的一种平衡查找树,在B+树中,所有的记录节点都是按键值大小顺序存放在同一层的叶节点中,叶节点间 用指针相连,构成双向循环链表,非叶节点(根节点.枝节点)只存放键值,不存放实际数据.下面看一个2 层B+树的

FAQ系列 | B+树索引和哈希索引的区别

导读 在MySQL里常用的索引数据结构有B+树索引和哈希索引两种,我们来看下这两种索引数据结构的区别及其不同的应用建议. 二者区别 备注:先说下,在MySQL文档里,实际上是把B+树索引写成了BTREE,例如像下面这样的写法: CREATE TABLE t( aid int unsigned not null auto_increment, userid int unsigned not null default 0, username varchar(20) not null default

使用索引的误区之三:基于函数的索引

函数|索引 使用索引的误区之三:基于函数的索引使用基于函数的索引(BFI, Based Function Index): 从Oracle 8i开始,可以使用基于函数的索引来提高查询性能,   使用基于函数的索引,需要几个条件: 1,  用户需要有create index或者create any index权限 2,  用户需要有query rewrite或者global query rewirte权限 3,  设置系统参数 query_rewrite_enabled=TRUE 和 query_r

oracle的B树索引详解

虽然一级或两级索引通常有助于加快查询,但在商用系统中常使用一种更通用的结构.这一通用的数据结构簇称为B树,而最常使用的变体称为B+树.实质上: B树能自动地保持与数据文件大小相适应的索引层次. 对所使用的存储块空间进行管理,使每个块的充满程度在半满与全满之间.这样的索引不再需要溢出块. 在接下来的内容中,我们将讨论"B树",但具体细节都针对B+树这一变体.其他类型的B树在习题中讨论. 1.B树的结构 正如其名称所暗示的那样,B树把它的存储块组织成一棵树.这棵树是平衡的,即从树根到树叶的

数据库-Oracle中重复率很高的字段创建B树索引,为什么性能可以得到大幅提升

问题描述 Oracle中重复率很高的字段创建B树索引,为什么性能可以得到大幅提升 请教一个让我不解的问题: 我有一张表TT,数据大概是240W,其中的一个字段COL1的值只有'0'和'1'两个.现在有如下查询:SELECT COL2,SUM(NVL(COL3,0) * nvl(COL4,0)) FROM TT WHERE COL1 = '0' GROUP BY COL2; 在查询耗时大概是 50s. 为了提高性能,在TT表的COL1字段上创建了位图索引,查询耗时变为 2s 但是由于我需要对TT表

《高并发Oracle数据库系统的架构与设计》一第2章 高效B树索引

第2章 高效B树索引 本章要点: 索引扫描识别,介绍索引的基本概念及展开讨论各种索引的扫描方式. 索引与排序,介绍索引在排序过程中的作用和意义. 索引设计优化,深入解析索引设计的方法技巧,以及设计索引的影响因素. 索引分裂,深入剖析索引树分裂生长原理及因此带来的问题和解决方法. 索引维护,围绕索引重建探讨索引后期维护的方法. 众所周知,索引不论在数据库设计过程中,还是在应用程序开发过程中都是一个至关重要的方面.索引的使用正确与否直接影响到应用程序的性能,并且它是贯穿于设计.开发.运维的各个阶段的