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确实是根据实时计算要素集的真实范围确定的。

posted @ 2016-09-20 15:35  6宇航  阅读(640)  评论(0编辑  收藏  举报