R 树利用空间实体外接矩形建立空间索引。R 树空间索引建立每个实体的外接矩形(rectangles,R),通过外接矩形的最大、最小坐标检索空间实体。对这些虚拟矩形建立空间索引,设计虚拟的矩形目录,将空间对象包含它含在矩形内,以虚拟矩形为空间索引,它包含指向所包围的空间实体的指针。为提高检索效率,R 树空间索引还将空间位置相近的实体外接矩形重新组织为更大的虚拟矩形,形成多级空间索引。

R 树空间索引就是按包含实体的矩形来确定的,树的层次表达了分辨率信息,每个实体与R 树结点相联系,这点与四叉树相同。矩形数据结构为RECT (rectangle-ID,type,min-X,min-Y,max- x,max-y )其中: rectangle-ID 为矩形标识符; type 为矩形类别(实体外接矩形还是虚拟矩形) ;min-X、min-Y 为该矩形左下角坐标; max-X,max-Y 为该矩形右上角坐标。

1. R树概念

R-Tree 主要用于索引多维信息(如地理点坐标、矩形或多边形)的一种数据结构。R -Tree是由Guttman在1984年提出的,在理论和应用上都有重要的应用。 R-Tree在现实世界中的一个常见用法是存储空间对象,如餐馆位置或典型地图所用的多边形: 街道、建筑物、湖泊轮廓、海岸线等,然后快速找到问题的答案,如“在我当前位置2公里内找到所有博物馆”、“检索我所在位置2公里内的所有道路段”(将它们显示在导航系统中)或“找到最近的加油站”(尽管没有考虑道路)。R-Tree 还可以加速最近邻搜索各种距离度量,包括大圆距离。

R-Tree其用一个边平行于坐标轴的最小的矩形(MBR,Minimum Bounding Box)框住空间对象。在查询时,只需要先找到空间对象的MBR即可,如下图所示:

与B-Tree类似,R-Tree是一个平衡的多路查找树,在树的节点上利用到了MBR的信息进行查找。

下图显示RTree的树形结构,其中MBR即是(x1,y1,x2,y2),数据都保存在叶子节点(Entry)。

2. 简介

1984年,加州大学伯克利分校的Guttman发表了一篇题为“R-trees: a dynamic index structure for spatial searching”的论文,向世人介绍了R树这种处理高维空间存储问题的数据结构。本文便是基于这篇论文写作完成的,因此如果大家对R树非常有兴趣,我想最好还是参考一下原著:)。为表示对这位牛人的尊重,给个引用先:

Guttman, A.; “R-trees: a dynamic index structure for spatial searching,” ACM, 1984, 14

R树在数据库等领域做出的功绩是非常显著的。它很好的解决了在高维空间搜索等问题。举个R树在现实领域中能够解决的例子:查找20英里以内所有的餐厅。如果没有R树你会怎么解决?一般情况下我们会把餐厅的坐标(x,y)分为两个字段存放在数据库中,一个字段记录经度,另一个字段记录纬度。这样的话我们就需要遍历所有的餐厅获取其位置信息,然后计算是否满足要求。如果一个地区有100家餐厅的话,我们就要进行100次位置计算操作了,如果应用到谷歌地图这种超大数据库中,这种方法便必定不可行了。

R树就很好的解决了这种高维空间搜索问题。它把B树的思想很好的扩展到了多维空间,采用了B树分割空间的思想,并在添加、删除操作时采用合并、分解结点的方法,保证树的平衡性。因此,R树就是一棵用来存储高维数据的平衡树。

OK,接下来,本文将详细介绍R树的数据结构以及R树的操作。至于R树的扩展与R树的性能问题,可以查阅相关论文。

3. 原理介绍

可以借鉴参考下文:

  • 《R树与空间索引》:https://blog.csdn.net/jinking01/article/details/115644016
  • 《空间数据索引RTree(R树)完全解析及Java实现》:https://blog.csdn.net/jinking01/article/details/116040426
  • 《百度百科:R-tree》:https://baike.baidu.com/item/R-tree/3250671?fr=aladdin
  • 《Boost库-功能介绍-Geometry-R树-空间索引》:https://blog.csdn.net/m0_67316550/article/details/124464921

4. 特点

  • R树索引的空间检索效率非常高,检索精度也很高。
  • R树索引的索引数据和地理数据不存储在一起,且R树索引的更新涉及到R树的平衡和分裂,比较复杂,更新速度较慢,大规模编辑后的查询效率降低,需要重建空间索引,适用于只读数据或者不经常进行空间数据编辑的数据。
  • R树索引支持文件型数据源和数据库型数据源,具体类型见本页表一。

5. 适用情况

  • R树索引比较适合静态数据,例如用作底图的数据和不经常编辑的数据(属性数据的编辑除外)推荐建立R树索引。
  • 支持建立R树索引的引擎类型包括:UDB、SQLPlus、PostgreSQL、OraclePlus、OracleSpatial、KingBase、MySQL、BeyonDB、Altibase。

6. R树索引的使用

6.1. Oracle创建R树索引

--创建空间索引步骤:
insert into user_sdo_geom_metadata(table_name,COLUMN_NAME, DIMINFO, SRID)values('t_city','GEOMETRY',MDSYS.SDO_DIM_ARRAY(MDSYS.SDO_DIM_ELEMENT('X',-180,180,0.005),MDSYS.SDO_DIM_ELEMENT('Y',-90,90,0.005)),    8307)CREATE INDEX t_city_SIDX ON t_city(GEOM) INDEXTYPE IS MDSYS.SPATIAL_INDEX;
CREATE INDEX roads_SIDX ON roads(ORA_GEOMETRY) INDEXTYPE IS MDSYS.SPATIAL_INDEX;--==================================================================================================================
--定义空间索引的维度,默认为二维。R-TREE可建立三维或四维空间数据的空间索引,
CREATE INDEX t_city_SIDX ON t_city(GEOM) INDEXTYPE IS MDSYS.SPATIAL_INDEX 例:PARAMETERS ('SDO_INDX_DIMS=3');

6.2. PostGIS创建R树索引

CREATE INDEX spacial_idx ON abc USING RTREE (shape);

6.3. JTS使用R树索引

  • 《【JTS】利用JTS生成R树索引》:https://blog.csdn.net/wk1134314305/article/details/76408181
  • 《geotools的空间索引使用——R树和四叉树》:http://t.zoukankan.com/yinchuanqi-p-5607696.html
/*** 空间索引之st R树*/
public static void stRTreeTest(){String filePath = "E:\gis资料\测试数据\道路中心线.shp";SimpleFeatureCollection sfc = fromShapeFile(filePath);SimpleFeatureIterator iterator = sfc.features();STRtree stRtree = new STRtree(sfc.size());while (iterator.hasNext()){Feature ft = iterator.next();MultiLineString multiLineString = (MultiLineString)((SimpleFeature) ft).getDefaultGeometry();stRtree.insert(multiLineString.getEnvelopeInternal(),ft);}System.out.println("str树深度:"+stRtree.depth());stRtree.build();System.out.println("str树深度:"+stRtree.getRoot().getLevel());GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory();Geometry point =  geometryFactory.createPoint(new Coordinate(120.68,30.76));Envelope search = new Envelope(point.getCoordinate());search.expandBy(0.001);Date start = new Date();List result = stRtree.query(search);// MySizeOf.sizeOf(stRtree);System.out.println("总数据量:"+stRtree.size()+"条");System.out.println("查询结果:"+result.size()+"条");System.out.println("STR树索引查找耗时:"+(new Date().getTime() - start.getTime()));
}/*** 空间索引之st 四叉树* 点索引使用kdtree最好*/
public static void QuadtreeTest(){String filePath = "E:\gis资料\测试数据\道路中心线.shp";SimpleFeatureCollection sfc = fromShapeFile(filePath);SimpleFeatureIterator iterator = sfc.features();GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory();Geometry point =  geometryFactory.createPoint(new Coordinate(120.68,30.76));Quadtree quadtree = new Quadtree();Date start = new Date();while (iterator.hasNext()){Feature ft = iterator.next();MultiLineString multiLineString = (MultiLineString)((SimpleFeature) ft).getDefaultGeometry();/*if(multiLineString.intersects(point)){break;}*/quadtree.insert(multiLineString.getEnvelopeInternal(),ft);}System.out.println("无索引查找耗时:"+(new Date().getTime() - start.getTime()));start = new Date();Envelope search = new Envelope(point.getCoordinate());OctagonalEnvelope searchGeom = new OctagonalEnvelope(point.getCoordinate());searchGeom.expandBy(0.001);search.expandBy(0.001);List result = quadtree.query(search);System.out.println(result.get(0).getClass());List lastRs = new ArrayList();for(Object ob : result){SimpleFeature sft = (SimpleFeature)ob;Geometry lineGeom =  (Geometry)sft.getDefaultGeometry();if(lineGeom.intersects(searchGeom.toGeometry(geometryFactory))){lastRs.add(ob);}}System.out.println("总数据量:"+quadtree.size()+"条");System.out.println("查询结果:"+lastRs.size()+"条");System.out.println("四叉树深度:"+quadtree.depth());System.out.println("四叉树树索引查找耗时:"+(new Date().getTime() - start.getTime()));
}

矢量数据空间索引之R树索引相关推荐

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

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 在之前的博客中,我分别介绍了基于网格的空间索引(http:// ...

  2. geotools应用-JTS生产四叉树索引和R树索引

    微信搜索:"二十同学" 公众号,欢迎关注一条不一样的成长之路 geotools介绍 geotools官网https://geotools.org/ Geotools是一个java类 ...

  3. 如何在vs中创建r树索引代码_线段树详解与实现

    此篇文章用于记录<玩转数据结构>课程的学习笔记 什么是线段树 线段树也被称为区间树,英文名为Segment Tree或者Interval tree,是一种高级的数据结构.这种数据结构更多出 ...

  4. 论文阅读——R树:一种用于空间查找的动态索引结构(算是节译)

    原文地址:http://blog.sina.com.cn/s/blog_672446ba0100t5nx.html 正文之前先吐槽. 这篇文章很老了.最初发表于1984年,比我还大三岁.但它是很多种空 ...

  5. R树 mysql_为什么MySQL使用B+树作为索引

    前言 本文是在讲述什么样的数据结构适合作为索引,以及其适合作为索引的原因.而阅读本文需要对B树和B+树结构有稍微的理解.以及需要对磁盘操作知识有稍微的了解.对于磁盘操作的相关知识,在文章尾部的链接文章 ...

  6. mysql的R树_GIS笔记——R树:一种用于空间查找的动态索引结构(算是节译)

    R树简介. R树是一种与B树类似的高度平衡树.这种索引是动态的,不需要定期重建.索引记录(Index Records)保存在叶节点中,索引记录包含指向数据对象的指针.注意原文中将索引的终端称为索引记录 ...

  7. R树空间索引及其变种

    1.R树及其变种:百度百科 2.R树详介:http://blog.csdn.net/jazywoo123/article/details/7792745 3.R树及变种小结 R树:叶子节点或中间节点都 ...

  8. arcmap创建空间索引_空间GIS索引算法介绍

    先看几个需要空间索引技术的场景: 如何根据给定位置来查询附近1000米的poi? 如何查找给定位置的最近poi? 如何查找给定矩形框内所有link和面数据? 1.用B-tree.B tree或者has ...

  9. 数据结构大总结系列之B树和R树

    原文:http://www.cnblogs.com/javaspring/archive/2012/08/14/2656223.html 一,B-树 B树是为磁盘或其他直接存储辅助存储设备而设计的一种 ...

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

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

最新文章

  1. python可以在linux运行_在linux运行python
  2. php制作明信片,用PS如何制作明信片?PS制作明信片图文介绍
  3. 跟我一起写 Makefile(六)
  4. python django框架如何导出_python框架django的数据库的正向生成和反向生成
  5. PAT乙级 1015 德才论
  6. eclipse jdk配置_第一节:学会Java前提-手把手教你配置JDK环境变量
  7. 怎么用EasyRecovery把文件夹中丢失的数据恢复
  8. Bregman 散度
  9. LeetCode:每日一题(2020.4.15)
  10. openssl 升级
  11. win10安装tensorflow-gpu
  12. 逐步揭示makop.mkp勒索病毒中毒防范恢复解密
  13. Unity换装系统实现
  14. Todd.log - a place to keep my thoughts on programming TF-IDF模型的概率解释
  15. 速览 关于网络安全专业学生的未来职业规划
  16. Java面试题笔试题汇总
  17. 冶化工业计算机模拟仿真工作,工业仿真,工业三维虚拟仿真技术平台 - 【中视典数字科技】...
  18. office连接oracle,office2013怎么连接32位oracle
  19. python高级编程
  20. NLP错别字识别(附代码和模型和服务,可在线测试)

热门文章

  1. 双层PDF的制作——使用PDF4NET 3.3.6 实现
  2. 微信公众号在线答题小程序系统怎么做答题游戏活动
  3. Tomcat8.5访问HTML页面出现乱码
  4. 使用spring data JPA进行类目增删改查测试
  5. android仿微信朋友圈点击评论效果
  6. js清空浏览器cokie缓存_JS设置cookie,删除cookie
  7. snownlp 原理_情感分析snownlp包部分核心代码理解
  8. c语言中负数参与除法,C语言中负数除法与右移取整问题
  9. svn -- 客户端+服务端的下载安装及配置
  10. 分布式事务之TCC事务