本文主要是介绍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]);
orSDO_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 进行筛选,只能手工删除。
这个流程之后,不符合规范的数据就被清理了,后续再研究怎么保留数据,转换格式。
这篇关于ORA-13199: the given geometry cannot be rectified ORA-13000: 维数超出范围 SDO_MIGRATE. TO_CURRENT的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!