Oracle Spatial图层元数据坐标范围影响R-TREE索引的ROOT MBR吗?
Oracle Spatial的空间索引R-TREE,其实现原理为一级级的MBR(最小定界矩形)。我突然想到一个问题,它的ROOT MBR是怎么确定的?是根据元数据表user_sdo_geom_metadata中的diminfo来确定的吗?
我们知道,diminfo字段记录了坐标系各个维度的范围,那么,R-TREE中的ROOT MBR会参考这里的信息来生成吗?还是实时计算要素集的真实边界范围?带着这个疑问,我做了个小实验。
实验数据的情况如下:
|
表名 |
XZQ130802双桥区20131205 |
|
矢量字段类型 |
SDO_GEOMETRY |
|
空间索引类型 |
R-TREE |
|
要素个数 |
103 |
|
坐标系 |
NULL(图层的实际坐标系为4610(西安80地理坐标系),但由于使用地理坐标系时(即user_sdo_geom_metadata.srid=4610),R-TREE的ROOT MBR其类型为3008,即SOLID,是三维立方体。因此将该字段设为NULL,使ROOT MBR为2003,二维矩形。) |
|
X 坐标真实范围 |
117.838376577036 118.135164523345 |
|
Y 坐标真实范围 |
40.7245342149613 41.1363642171938 |
第一个实验:
将diminfo中的坐标范围改为(-180,180)(-90,90),然后创建空间索引。查看user_sdo_index_metadata中的SDO_ROOT_MBR:

可见ROOT MBR为矩形,左下坐标为117.838377,40.724534,右上坐标为118.135165,41.136364。
第二个实验:
将diminfo中的坐标范围改为(117.838376577036 118.135164523345)(40.7245342149613 41.1363642171938),然后创建空间索引。查看user_sdo_index_metadata中的SDO_ROOT_MBR:

结果与第一个实验完全一致。
结论:在创建R-TREE时,ROOT MBR是根据实时计算要素集的真实范围确定的。与元数据表中记录的范围无关。
然而,实验到此就结束了吗?好像这样轻易得出结论显得不严谨。我也认为不严谨,所以我决定打开会话跟踪,看看create spatial index到底做了些什么。经过整理,发现在确定MBR时,其过程大致是这样的。
1)在SDO_INDEX_METADATA_TABLE中插入记录,此时插入两条

2)创建一个游标,从刚刚插入的记录中查询相关数据,此时仅查询了其中一条

3)在SDO_INDEX_METADATA_TABLE删除刚刚插入的记录,仅删除其中一条

4)创建MDRT~索引表,以及M2~、M1~中间表


在后面的过程中,可知M2~表用于记录第个要素的ROWID和要素MBR、M1~表用于在M2~表的基础上生成统计值,例如图层的MBR、某个坐标维度的合计值、标准差等。
5)将每个要素的ROWID和要素MBR插入到M2~表中

6)在M2~的基础上得到统计值,并插入到M1~中

各绑定变量值为:

X与Y坐标,其范围值和上文实验一、二中得到的已经一致了。
7)用M1~中的范围构建SDO_GEOMETRY,并更新到SDO_INDEX_METADATA_TABLE表中去

至此,分析结束。在创建R-TREE时,ROOT MBR确实是根据实时计算要素集的真实范围确定的。
Oracle Spatial图层元数据坐标范围影响R-TREE索引的ROOT MBR吗?的更多相关文章
- Oracle Spatial GIS相关研究
1.Oracle Spatial 概念相关 Oracle Spatial 是Oracle 数据库强大的核心特性,包含了用于存储矢量数据类型.栅格数据类型和持续拓扑数据类型的原生数据类型.Oracle ...
- Oracle Spatial 中的弧段及弧相关拓扑错误
1.报告说明 此报告用于验证下列问题: ORACLE SPATIAL 0.05m的最小拓扑容差值是否可以被修改 原始数据通过ARCGIS入库数据精度是否有损失 修改ORACLE SPATIAL图层的最 ...
- SQLite R*Tree 模块测试
目录 SQLite R*Tree 模块测试 1.SQLite R*Tree 模块特性简介 2.SQLite R*Tree 模块简单测试代码 SQLite R*Tree 模块测试 相关参考: MySQL ...
- shp转oracle spatial
2010年12月1日 终于搞定了shp到oracle spatial,说下步骤和感受吧! 1 XP系统:转换工具的下载(shp2sdo.exe ):下载后把此文件复制到PATH变量包含的目录下(E: ...
- Oracle Spatial中的空间索引
转自cryolite原文 Oracle Spatial中的空间索引 Oracle Spatial可对空间数据进行R-tree索引,每个空间图层(Spatial Layer)的空间索引元信息都可以在US ...
- Oracle Spatial操作geometry方法
Oracle Spatial中SDO_GEOMETRY类型: CREATE TYPE SDO_GEOMETRY AS OBJECT( SDO_GTYPE NUMBER,--几何类型,如点线面 SDO_ ...
- C#读取Oracle Spatial的sdo_geometry
oracle的sdo_geometry中内置get_wkt和get_wkb两个方法. 以数据库表geoms为例,此表中有id和geometry两列 try { OracleConnection con ...
- Oracle spatial与arcsde 的关系
有一些同事问过我下面这些问题: 我们用了oracle spatial sdo_geometry,是不是没用arcsde? 我们到底是使用oracle spatial还是arcsde,有点懵! 执行了c ...
- Oracle Spatial中SDO_Geometry详细说明[转]
在ArcGIS中通过SDE存储空间数据到Oracle中有多种存储方式,分别有:二进制Long Raw .ESRI的ST_Geometry以及基于Oracle Spatial的SDO_Geometry等 ...
随机推荐
- Thinkphp下记录和统计时间(微秒)和内存使用情况
* 记录和统计时间(微秒)和内存使用情况 * 使用方法: * <code> * G('begin'); // 记录开始标记位 * // ... 区间运行代码 * G('end'); // ...
- 学习:C++中的头文件和源文件详解
一.C++编译模式: 通常,在一个C++程序中,只包含两类文件――.cpp文件和.h文件.其中,.cpp文件被称作C++源文件,里面放的都是C++的源代码:而.h文件则被称作C++头文件,里面放的也是 ...
- 纯js房贷计算器开源
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 简易配置中心Confd入手
改成动态更新配置文件,如下每五秒重新生成配置文件 confd与etcd的使用 Add keys This guide assumes you have a working etcd, or consu ...
- WinDbg常用命令系列---线程栈中局部上下文切换.frame
.frame (Set Local Context) .frame命令指定使用哪个本地上下文(作用域)解释本地变量或显示当前本地上下文. .frame [/c] [/r] [FrameNumber] ...
- windbg命令行选项
我们不仅可以通过GUI的方式使用Windbg,还可以通过命令行的方式使用它,且在有些需求和使用场景下,只能使用命令行模式 windbg命令行使用以下语法: windbg [ -server Serv ...
- socket简单实践
目录 socket模块: family(socket家族) fileno=None 请忽略,特殊用途 socket模块: 把tcp/ip协议层的各种数据封装啦.数据发送.接收等通过代码已经给你封装 应 ...
- 修改elementUI源码新增组件/修改组件
前言 经常我们会遇到elementUI组件库期间有5%达不到我们想要的需求,第一我们重新写组件,第二我们改源码 安装element https://github.com/ElemeFE/element ...
- AT1879 2 つの山札
题面 题解 直接求解比较麻烦,考虑将问题进行转化. 设序列\(a = \{3, 1, 4, 2, 5\}, b = \{3, 2, 4, 1, 5\}\),那么我们构造一个正方形方格,将\(a\)放在 ...
- 在安卓手机下按钮会悬浮在键盘上,怎么解决vue.js
data里面 screenHeight: window.innerHeight mounted里面 mounted () { var that = this var u = navigator.use ...