在将我们的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以来我们的用户定义坐标系可能不再有效的原因吗?
答案 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。