Oracle Spatial中SDO_GEOM.SDO_LENGTH存在有效SRID问题

ktecyv1j  于 2022-12-22  发布在  Oracle
关注(0)|答案(1)|浏览(111)

像这样检查几何对象时

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行)TRUE验证结果,如您所见

但是当我试着计算几何对象的长度

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: 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.

为什么我仍然收到此错误?

cbjzeqam

cbjzeqam1#

我很惊讶你的例子中的验证返回TRUE,也就是说没有错误。你应该得到同样的13029错误。例如:

SQL> select sdo_geom.validate_geometry_with_context(sdo_geometry(3001, 82212, sdo_point_type(4675355.17, 5844284.58, 0), null, null),0.05) as result from dual;

RESULT
------
13029

1 row selected.

出现错误的原因是您的数据是3D(在您显示的示例中,SDO_GTYPE3002),但坐标系是2D。请查看计算3D直线长度时发生的情况:

SQL> select sdo_geom.sdo_length (
  2    sdo_geometry(
  3      3002, 82212, null, 
  4    sdo_elem_info_array(1,2,1), 
  5    sdo_ordinate_array(4675355.17,5844284.58,0, 923377.227,3784105.88,0)
  6  ),
  7    0.005, 'KM'
  8 )
  9  from dual;
select sdo_geom.sdo_length (
       *
ERROR at line 1:
ORA-13029: Invalid SRID in the SDO_GEOMETRY object
ORA-06512: at "MDSYS.MD", line 1723
ORA-06512: at "MDSYS.MDERR", line 8
ORA-06512: at "MDSYS.SDO_GEOM", line 2213
ORA-06512: at "MDSYS.SDO_GEOM", line 2145
ORA-06512: at line 1

如果您的数据不是真正的3D(所有Z都是或甚至是NULL),则可以执行以下操作:

select sdo_geom.sdo_length (
  sdo_cs.make_2d (
    sdo_geometry (
      3002, 82212, null, 
      sdo_elem_info_array(1,2,1), 
      sdo_ordinate_array(4675355.17,5844284.58,0, 923377.227,3784105.88,0)
    )
  ),
  0.005, 'unit=KM'
) length
from dual;

请注意,指定单位的正确方式是unit=xxx
结果是:

SQL> select sdo_geom.sdo_length (
  2    sdo_cs.make_2d (
  3      sdo_geometry (
  4        3002, 82212, null, 
  5      sdo_elem_info_array(1,2,1), 
  6      sdo_ordinate_array(4675355.17,5844284.58,0, 923377.227,3784105.88,0)
  7    )
  8  ),
  9    0.005, 'unit=KM'
 10 ) length
 11  from dual;

    LENGTH
----------
4280.38255

1 row selected.

相关问题