ORA-13199: the given geometry cannot be rectified &ORA-13000: 维数超出范围 &SDO_MIGRATE. TO_CURRENT

报错信息:

Traceback (most recent call last):
  File "exp_csv.py", line 22, in <module>
    for row_data in curs: # add table rows
cx_Oracle.DatabaseError: ORA-13199: the given geometry cannot be rectified
ORA-06512: 在 "MDSYS.MD", line 1723
ORA-06512: 在 "MDSYS.MDERR", line 17
ORA-06512: 在 "MDSYS.SDO_UTIL", line 1097

截图如下:
在这里插入图片描述
万恶起因皆如上。用py导出一个带有空间GIS列的表,报错如上。

解决方案:

一、ORA-13199: the given geometry cannot be rectified

先尝试用矫正函数进行修复,我综合写了一个procedure,源码暂时不传了,基本上如下几个函数的应用:
SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT
SDO_UTIL.REMOVE_DUPLICATE_VERTICES
SDO_UTIL.RECTIFY_GEOMETRY
SDO_GEOM.SDO_AREA
SDO_UTIL.GETNUMVERTICES

尝试失败:

二、ORA-13000: 维数超出范围

ORA-13000: 维数超出范围
ORA-06512: 在 "MDSYS.SDO_GEOM", line 128
ORA-06512: 在 "MDSYS.SDO_GEOM", line 637
ORA-06512: 在 line 1
ORA-06512: 在 "C##FAST491.TOOL_GEO_CHECK_VAILD_NEW", line 9

在这里插入图片描述
修复不了,只能鬼挡杀鬼了,继续干ORA-13000

原因:
在oracle空间信息管理中,找到了如下:“在SDO_GEOMETRY对象中,SDO_GTYPE值小于10的几何体数据,会导致这个错误。也许是因为早期的Oracle Spatial版本中SDO_GTYPE仅仅包含类型(T)信息。从Oracle 9i开始,SDO_GEOMETRY中的SDO_GTYPE的格式为DOOT,其中D表明维度而T是类型信息。
补救措施:修改你的数据让其符合这一变化。另外一种方法是,使用SDO_MIGRATE. TO_CURRENT函数让Oracle Spatial改变你的数据。该函数同样可以修正多边形几何体的取向。”

总结一下,就是部分数据存储的维度和已有结构不一致,需要用to_current函数修正。

三、SDO_MIGRATE. TO_CURRENT
在oracle官方的文档中,找到了这个函数的使用方法:

25.1 SDO_MIGRATE.TO_CURRENT
Format (Any Object-Relational Model Implementation to Current)

SDO_MIGRATE.TO_CURRENT(
     tabname         IN VARCHAR2      
     [, column_name  IN VARCHAR2]);
or

SDO_MIGRATE.TO_CURRENT(
     tabname       IN VARCHAR2, 
     column_name   IN VARCHAR2 
     [, commit_int IN NUMBER]);
Format (Single Object-Relational Model Geometry to Current)

SDO_MIGRATE.TO_CURRENT(
     geom  IN SDO_GEOMETRY, 
     dim   IN SDO_DIM_ARRAY 
     
) RETURN SDO_GEOMETRY;
Format (Any Relational Model Implementation to Current)

SDO_MIGRATE.TO_CURRENT(
     layer       IN VARCHAR2, 
     newtabname  IN VARCHAR2, 
     gidcolumn   IN VARCHAR2, 
     geocolname  IN VARCHAR2, 
     layer_gtype IN VARCHAR2, 
     updateflag  IN VARCHAR2);

https://docs.oracle.com/database/121/SPATL/sdo_migrate-to_current.htm#SPATL1185

我采用table_name,column_name的方式进行修复。下一个问题不出意外的到来了。
在这里插入图片描述

四、ORA-13203: 无法读取 USER_SDO_GEOM_METADATA 视图

SQL> EXECUTE SDO_MIGRATE.TO_CURRENT('ROAD_CD','GEOM');
begin SDO_MIGRATE.TO_CURRENT('ROAD_CD','GEOM'); end;
ORA-13203: 无法读取 USER_SDO_GEOM_METADATA 视图
ORA-06512: 在 "MDSYS.MD", line 1723
ORA-06512: 在 "MDSYS.MDERR", line 8
ORA-06512: 在 "MDSYS.SDO_MIGRATE", line 353
ORA-06512: 在 "MDSYS.SDO_MIGRATE", line 464
ORA-06512: 在 line 1

脑子瓦特了,没有看to_current的实现方法,搏一搏,结果摩托变单车。
没有空间元数据管理,那我就加上吧。

INSERT INTO USER_SDO_GEOM_METADATA(TABLE_NAME,COLUMN_NAME,DIMINFO, SRID)
VALUES('ROAD_QHD','GEOM',
MDSYS.SDO_DIM_ARRAY(
MDSYS.SDO_DIM_ELEMENT('X',73.246707500,134.998326500,0.005),
MDSYS.SDO_DIM_ELEMENT('Y',15.784052600,53.949988600,0.005)
),4326);

增加之后,再次用to_current进行修复,大部分格式被修复了,部分 GEOM.SDO_SRID还是0,或者2002(我的业务限制只要4326)。

五、手工修改数据:

select * from table_name for update;

PS: GEOM.SDO_SRID 我不会用where 进行筛选,只能手工删除。
这个流程之后,不符合规范的数据就被清理了,后续再研究怎么保留数据,转换格式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值