使用用户定义的坐标参照系的几何图形不在Oracle 12c中验证

时间:2018-06-05 17:09:17

标签: oracle oracle12c oracle-spatial

在将我们的Oracle数据库从11.2.0.3.0升级到12.1.0.2.0时,我们遇到了以下问题:Oracle Spatial and Graph中的SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT函数为使用用户定义指定的几何返回非TRUE结果坐标参考系。 11g数据库上的相同几何体(使用用户定义的坐标系)在通过相同的函数时返回TRUE。

坐标系定义如下:

INSERT INTO sdo_coord_sys (
  coord_sys_id
, coord_sys_name
, coord_sys_type
, dimension
, information_source
, data_source
)
VALUES (
  1006422
, 'Ellipsoidal 2D CS. Axes: latitude, longitude. Orientations: north, east.  UoM: sec'
, 'ellipsoidal'
, 2
, NULL
, NULL
)
/

INSERT INTO sdo_coord_axes(
  coord_sys_id
, coord_axis_name_id
, coord_axis_orientation
, coord_axis_abbreviation
, uom_id
, "ORDER"
)
VALUES(
  1006422
, 9901
, 'north'
, 'Lat'
, 10003
, 1
)
/

INSERT INTO sdo_coord_axes(
  coord_sys_id
, coord_axis_name_id
, coord_axis_orientation
, coord_axis_abbreviation
, uom_id
, "ORDER"
) VALUES(
 1006422
, 9902
, 'east'
, 'Long'
, 10003
, 2
)
/

INSERT INTO sdo_coord_ref_system (
  srid
, coord_ref_sys_name
, coord_ref_sys_kind
, coord_sys_id
, datum_id
, geog_crs_datum_id
, source_geog_srid
, projection_conv_id
, cmpd_horiz_srid
, cmpd_vert_srid
, information_source
, data_source
, is_legacy
, legacy_code
, legacy_wktext
, legacy_cs_bounds
, is_valid
, supports_sdo_geometry
)
VALUES (
  1004230
, 'ED50 (Decimal Seconds)'
, 'GEOGRAPHIC2D'
, 1006422
, 6230
, 6230
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, 'FALSE'
, NULL
, NULL
, NULL
, 'TRUE'
, 'TRUE'
)
/

当您使用此坐标系使用下面的几何图形在12c数据库上创建和验证几何图形时,会得到ORA-13356(几何中的相邻点是冗余的)错误。如果在11g数据库上使用相同的几何体,则返回TRUE。

SELECT sdo_geom.validate_geometry_with_context(
  mdsys.sdo_geometry(
    2003
  , 1004230
  , NULL
  , sdo_elem_info_array(1, 1003, 1)
  , sdo_ordinate_array(0, 219000, 720, 219000, 720, 219600, 0, 219600, 0, 219000)
  )
, 0.05
)
FROM dual
/

我们已尝试将SPATIAL_VECTOR_ACCELERATION参数设置为TRUE,我们最初将其设置为FALSE,并且几何图形仍未成功验证。

我们定义的坐标系代表ED50十进制秒。我们使用十进制秒而不是十进制度来在操作几何时不会失去精度。下面的示例显示从度,分,秒到十进制度和返回时转换的精度损失。

Degrees, Minutes, Seconds to Decimal Degrees 
50° 22' 00.000"N --> 50.36667°N 

Decimal Degrees to Degrees, Minutes, Seconds 
50.36667°N --> 50° 22' 00.120"N 

由于Oracle不提供小数第二坐标系,我们创建了自己的用户定义坐标系。下面的示例显示从度,分,秒到十进制秒转换回来时没有精度损失

Degrees, Minutes, Seconds to Decimal Seconds 
50° 22' 00.000"N --> 181320"N 

Decimal Seconds to Degrees, Minutes, Seconds 
181320"N --> 50° 22' 00.000"N 

有人知道自升级到12c以来我们的用户定义坐标系可能不再有效的原因吗?

1 个答案:

答案 0 :(得分:0)

Oracle已发布一次性版本来解决版本12.1.0.2上的此问题。可以从My Oracle Support页面下载此补丁。修补程序ID为28207390。

重要提示::在撰写本文时,与此错误相关的自述文件不包含关键的安装后步骤,否则,应用此补丁程序将无法解决问题。

安装补丁后,您需要执行以下步骤:

> cd $ORACLE_HOME/md/admin

> sqlplus / as sysdba

> alter session set current_schema = mdsys; 

> @prvtgeom.plb 

这应该导致以下输出:

Session altered. 

Package body created. 

No errors. 

Synonym created. 

Grant succeeded. 

Grant succeeded. 

Session altered. 

完成这些步骤后,运行问题中的sdo_geom.validate_geometry_with_context语句返回TRUE。