空间图层:Oracle spatial将一张表中单个SDO_GEOMETRY列上的所有对象作为一个空间图层。(例如,customers表中location列内的所有几何对象被作为一个空间图层进行处理。)
描述一个图层的元数据信息包括空间范围和数据采用的坐标系统。或者,换句话说,要想执行与每个空间图层(换句话说,一张表中某个特定的SDO_GEOMETRY列的所有几何对象)有关的验证、索引创建已经空间查询等操作,需要为每个图层指定合适的元数据。它包括以下信息:
- 1. 维度:the number of dimensions
- 2. 每个维度的界限:the bounds for each dimension
- 3. 每个维度的容差:the tolerance for each dimension。例如,如果tolerance指定为0.5,两个点A和B之间的距离如果小于0.5,那么点A和点B就被认为处于同一位置。一般来说,tolerance值得单位与维度界限的单位相同,但是在geodetic坐标系中,tolerance值表示地球表面上两个点之间的最短距离,其单位总是米(因为Oracle需要tolerance在不同维度上具有相同的单位),通常设为0.1或者0.5。
- 4. 坐标系统,有三种类型的坐标系统:
i) Geodetic坐标系统:以角度表示的经纬度,Oracle Spatial支持的geodetic坐标系在MDSYS.GEODETIC_SRIDS视图中可以查到;
ii) 投影坐标系:笛卡尔坐标系统
iii) 本地坐标系:
Oracle Spatial中,通过查看USER_SDO_GEOM_METADATA试图中的DIMINFO属性,可以知道特定图层信息,包括图层每一维度的信息,包括维度的名称(如经度'Latitude')、维度的上下限以及维度的tolerance。
在
Oracle Spatial基本操作中对此有比较详细的介绍,借用一下
快乐自己做主的图(thanks you:):
USER_SDO_GEOM_METADATA元数据视图中,每一条记录描述了一个Oracle Spatial空间图层的信息,包括图层的空间信息(空间坐标范围)和空间坐标系统(SRID)。
因此,创建一个带有地理信息的数据库表后,还需要将其元数据信息记录在元数据表中。
例如customers表中会有字段记录每个顾客的地址信息,在创建customer表后,还要在USER_SDO_GEOM_METADATA视图中插入该表地理相关的元数据,该视图是可修改的,基于MDSYS schema的SDO_INDEX_METADATA_TABLE表。
- INSERT INTO user_sdo_geom_metadata VALUES (
- 'CUSTOMERS',
- 'LOCATION',
- SDO_DIM_ARRAY(
- SDO_DIM_ELEMENT(
- 'LONGITUDE',
- -180,
- 180,
- 0.5
- ),
- SDO_DIM_ELEMENT(
- 'LATITUDE',
- -90,
- 90,
- 0.5
- )
- ),
- 8307
- );
为空间图层设置元数据信息使得我们可以进行验证、空间索引、空间查询和空间分析等操作。此外为空间图层设置元数据也使得Oracle中地图可视化和网络/路径分析等操作成为可能。
通过空间操作符(如SDO_WITHIN_DISTANCE)进行空间查询时需要有空间索引(不过有些空间处理函数可能不需要空间索引,例如叠加分析),如果发现不能为geometry类数据列创建空间索引,错误表现为:
- ERROR at line 1:
- ORA-29855: error occurred in the execution of ODCIINDEXCREATE routine
- ORA-13203: failed to read USER_SDO_GEOM_METADATA view
- ORA-13203: failed to read USER_SDO_GEOM_METADATA view
- ORA-06512: at "MDSYS.SDO_INDEX_METHOD_10I", line 10
- ORA-06512: at line 1
那是因为你没有为它在USER_SDO_GEOM_METADATA中设置元数据。
在空间索引创建时,Oracle会自动检查每个geometry对象的SDO_SRID是否符合USER_SDO_GEOM_METADATA元数据视图中为相应空间图层指定的坐标系。如何不符合,会抛出ora-13365错误。