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

本文主要是介绍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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/248397

相关文章

ImportError: cannot import name ‘print_log‘ from ‘logging‘

mmcv升级到2.+后删除了很多 解决 查FAQ文档,找到 添加到mmcv.utils下即可

vue 父组件调用子组件的方法报错,“TypeError: Cannot read property ‘subDialogRef‘ of undefined“

vue 父组件调用子组件的方法报错,“TypeError: Cannot read property ‘subDialogRef’ of undefined” 最近用vue做的一个界面,引入了一个子组件,在父组件中调用子组件的方法时,报错提示: [Vue warn]: Error in v-on handler: “TypeError: Cannot read property ‘methods

ora-01017 ora-02063 database link,oracle11.2g通过dblink连接oracle11.2g

错误图示: 问题解决 All database links, whether public or private, need username/password of the remote/target database. Public db links are accessible by all accounts on the local database, while private

Vue3上传图片报错:Current request is not a multipart request

当你看到错误 "Current request is not a multipart request" 时,这通常意味着你的服务器或后端代码期望接收一个 multipart/form-data 类型的请求,但实际上并没有收到这样的请求。在使用 <el-upload> 组件时,如果你已经设置了 http-request 属性来自定义上传行为,并且遇到了这个错误,可能是因为你在发送请求时没有正确地设置

Unstructured cannot write mode RGBA as JPEG 错误解决

Unstructured cannot write mode RGBA as JPEG 错误解决 0. 错误详细1. 解决方法 0. 错误详细 Image Extraction Error: Skipping the failed imageTraceback (most recent call last):File "/root/miniconda3/envs/learn-y

Cannot read property ‘length‘ of null while opening vscode terminal

同一问题地址:Cannot read property ‘length’ of null while opening vscode terminal 问题描述 One day, 我在ubuntu 18.04下用vscode打开一个项目,并想和往常一样在vscode使用终端,发现报错Cannot read property 'length' of null。 解决 打开setting.jso

The import com.google cannot be resolved

The import com.google cannot be resolved,报错: 第一感觉就是缺少jar包,因为项目用maven管理,所以在pom.xml中添加: <dependency>  <groupId>com.google.code.gson</groupId>  <artifactId>gson</artifactId>  <version>2.3.1</ver

ORA-25150:不允许对区参数执行ALTERING

在用PL/SQL工具修改表存储报错: 百度一下找到原因: 表空间使用本地管理,其中的表不能修改NEXT MAXEXTENTS和PCTINCREASE参数 使用数据自动管理的表空间,其中的表可以修改NEXT MAXEXTENTS和PCTINCREASE参数

ORA-01861:文字与格式字符串不匹配

select t.*, t.rowid from log_jk_dtl t; insert into log_jk_dtl (rq,zy,kssj,jssj,memo)  values (to_date(sysdate,'yyyy-mm-dd'),'插入供应商', to_char(sysdate,'hh24:mi:ss'),to_char(sysdate,'hh24:mi:ss'),'备注'

利用PL/SQL工具连接Oracle数据库的时候,报错:ORA-12638: 身份证明检索失败的解决办法

找到相对应的安装目录:比如:E:\oracle\product\10.2.0\client_1\NETWORK\ADMIN 在里面找到:SQLNET.AUTHENTICATION_SERVICES= (NTS) 将其更改为:SQLNET.AUTHENTICATION_SERVICES= (BEQ,NONE) 或者注释掉:#SQLNET.AUTHENTICATION_SERVICES= (N