Oracle Spatial中SDO_GEOM.SDO_LENGTH报无效SRID的问题求助
Oracle空间几何验证通过但计算长度报ORA-13029错误解析
问题场景
执行拓扑验证SQL:
SELECT t.STREET_ID, t.FC_GEOM.SDO_SRID SRID, SUBSTR(t.FC_GEOM.SDO_GTYPE, 1, 1) DIM_COUNT, SUBSTR(t.FC_GEOM.SDO_GTYPE, 4, 1) GTYPE, SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT(t.FC_GEOM, 0.05) VALIDATION_RES FROM ST_SEGMENT t WHERE t.STREET_ID = 'STEID5005';
返回的74行结果中,VALIDATION_RES字段全部为TRUE,但执行长度计算SQL时:
SELECT t.STREET_ID, SDO_GEOM.SDO_LENGTH(t.FC_GEOM, 0.005, 'KM') FROM ST_SEGMENT t WHERE t.STREET_ID = 'STEID5005';
触发ORA-13029错误:
ORA-13029: Invalid SRID in the SDO_GEOMETRY object ORA-06512: at "*****.MD", line 1723 ORA-06512: at "*****.MDERR", line 8 ORA-06512: at "*****.SDO_GEOM", line 2217 ORA-06512: at "*****.SDO_GEOM", line 2149 ORA-06512: at line 1 13029. 00000 - "Invalid SRID in the SDO_GEOMETRY object" *Cause: There is an invalid SDO_SRID in the SDO_GEOMETRY object. The specified SRID may be outside the valid SRID range. *Action: Verify that the geometries have valid SRIDs.
根因分析
拓扑验证函数的校验范围有限
SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT仅校验几何对象的拓扑合法性(如是否存在自相交、环是否闭合等),不会验证SDO_SRID是否在Oracle Spatial的空间参考系统注册表中有效。哪怕SRID是未注册值或0,只要拓扑结构正确,函数就会返回TRUE。长度计算对SRID的严格要求
SDO_GEOM.SDO_LENGTH需要基于SRID对应的空间参考系统(投影/地理坐标系)进行距离换算,因此会严格检查SRID是否存在于SDO_COORD_REF_SYS表中,且状态为有效。如果几何对象的SDO_SRID未注册、已注销,或是0(未定义空间参考),就会触发无效SRID错误。常见触发场景
你的数据中FC_GEOM.SDO_SRID大概率是0,或是一个未在SDO_COORD_REF_SYS中注册的数值——这类SRID能通过拓扑验证,但无法支持空间计算。
解决方法
检查SRID有效性
执行以下SQL确认目标SRID是否在系统中注册:SELECT COORD_REF_SYS_NAME, COORD_REF_SYS_KIND, IS_LEGACY FROM SDO_COORD_REF_SYS WHERE SRID = (SELECT DISTINCT FC_GEOM.SDO_SRID FROM ST_SEGMENT WHERE STREET_ID = 'STEID5005');若无返回结果,说明该SRID未注册。
修正SRID值
- 如果几何对象实际对应已注册的SRID,直接更新数据:
UPDATE ST_SEGMENT SET FC_GEOM.SDO_SRID = 你的有效SRID数值 WHERE STREET_ID = 'STEID5005'; COMMIT; - 若需使用自定义空间参考,需先以DBA权限在
SDO_COORD_REF_SYS中注册该SRID,再执行长度计算。
- 如果几何对象实际对应已注册的SRID,直接更新数据:
处理SRID为0的情况
若SRID是0,说明几何对象未关联空间参考,需明确其对应的坐标系并设置正确的SRID,否则无法进行真实距离的计算。
内容的提问来源于stack exchange,提问作者Behseini
相关产品推荐
相关产品推荐

