首页 理论教育 空间数据库实验教程:具备有效性验证函数

空间数据库实验教程:具备有效性验证函数

时间:2023-08-29 理论教育 版权反馈
【摘要】:在Oracle Spatial中提供了两个有效性验证函数:第一个函数VALIDATE_GEOMETRY_WITH_CONTEXT有两个版本,针对单个的几何对象进行操作。有效性验证函数用到了一个用户自定义的数值——容忍值来决定一个几何对象是否有效。该表应该在执行有效性检验函数之前创建好。图2-24ovcpolygons有效性检验结果表结果表明,总共对1039个多边形进行了有效性检查,但有三个多边形存在问题。Ora-13356表示的是存在相邻重复点,导致有效性检验通不过的原因也可能是tolerance的值0.05过大。

空间数据库实验教程:具备有效性验证函数

在Oracle Spatial中提供了两个有效性验证函数:

第一个函数VALIDATE_GEOMETRY_WITH_CONTEXT有两个版本,针对单个的几何对象进行操作。第二个函数VALIDATE_LAYER_WITH_CONTEXT针对图层或者说一个数据表中的几何对象进行操作。这两个函数都支持二维和三维几何数据。如果几何数据存在错误,它们都能返回一个错误描述字符串。有效性验证函数用到了一个用户自定义的数值——容忍值(tolerance)来决定一个几何对象是否有效。这个tolerance参数存放在MDSYS方案下的数据表SDO_GEOM_METADATA_TABLE中的SDO_DIMINFO列中。图2-23是ovcdemo数据在该表中的元数据。

图2-23 OVCDEMO数据库的几何元数据

VALIDATE_GEOMETRY_WITH_CONTEXT函数的参数说明:

geometry:输入检验的SDO_GEOMETRY对象。

tolerance:用于检验的容许阈值

diminfo:什么维数信息和容许阈值信息。

如果该函数返回的是字符串“TRUE”,则说明几何对象有效,否则返回“FALSE”,说明几何对象是无效或有错误。

VALIDATE_LAYER_WITH_CONTEXT函数的参数说明:

table_name:存储SDO_GEOMETRY数据的表名称。

column_name:表中存储SDO_GEOMETRY列名称。

result_table:存放有效性检验的结果表的名称。该表应该在执行有效性检验函数之前创建好。其表结构如下:

SDO_ROWID ROWID

STATUS VARCHAR2(2000)(www.xing528.com)

表中的STATUS列,记录的是每行几何对象的有效性检验结果(只记录有问题的行),结果为“FALSE”或错误信息。

commit_interval:每次事物提交检验的几何对象个数。

如果要检验OVCDEMO中ovcpolygons几何对象的有效性,其操作步骤如下:

(1)连接OVCDEMO,新建数据表。

ovcpolygons_validation:

create table ovcpolygons_validation(

sdo_rowid rowid,

status varchar2(2000));

(2)执行有效性检验函数。

其显示结果如图2-24所示。

图2-24 ovcpolygons有效性检验结果表

结果表明,总共对1039个多边形进行了有效性检查,但有三个多边形存在问题。Ora-13349是Oracle的错误编号,表示多边形(Polygon)的边界自相交,可能原因是检测的时候默认的tolerance值过大,可以在SDO_GEOM_METADATA_TABLE表查看ovcpolygons的默认tolerance的值为0.05。Ora-13356表示的是存在相邻重复点,导致有效性检验通不过的原因也可能是tolerance的值0.05过大。可以通过Code_2_2脚本来测试是否是因为tolerance值过大导致的问题。注意,其中的ROWID要和实际运行的真实数据对应,以图2-24中最后一条记录为例。

如果输出的错误和表中一样,则说明在tolerance=0.000 001的情况下多边形本身也是存在自相交的;如果在tolerance=0.000 001的情况下输出的是“TRUE”,则说明该多边形有效。实际运行过程也证实我们的估计是正确的,当tolerance=0.000 001时,该多边形有效;而当tolerance=0.05时,多边形无效。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈