使用用户定义的坐标参考系统的几何在 Oracle 12c 中未验证
Geometries using a user defined coordinate reference system do not validate in Oracle 12c
在将我们的 Oracle 数据库从 11.2.0.3.0 升级到 12.1.0.2.0 时,我们遇到了一个问题,即 Oracle Spatial and Graph 中的 SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT 函数 returns 结果不正确对于使用用户定义的坐标参考系指定的几何。 11g 数据库上的相同几何图形(使用用户定义的坐标系)returns 当通过相同的函数传递时为真。
坐标系定义如下:
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 后我们的用户定义坐标系可能不再工作的原因吗?
Oracle 已经发布了一个一次性补丁来解决版本 12.1.0.2 上的这个问题。可以从 My Oracle Support 页面下载此补丁。补丁 ID 是 28207390.
重要提示:在撰写本文时与此错误相关的自述文件不包含关键的 post 安装步骤,否则应用此补丁将无法解决问题.
安装补丁后,您需要执行以下步骤:
> 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 问题的陈述 returns 正确。
在将我们的 Oracle 数据库从 11.2.0.3.0 升级到 12.1.0.2.0 时,我们遇到了一个问题,即 Oracle Spatial and Graph 中的 SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT 函数 returns 结果不正确对于使用用户定义的坐标参考系指定的几何。 11g 数据库上的相同几何图形(使用用户定义的坐标系)returns 当通过相同的函数传递时为真。
坐标系定义如下:
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 后我们的用户定义坐标系可能不再工作的原因吗?
Oracle 已经发布了一个一次性补丁来解决版本 12.1.0.2 上的这个问题。可以从 My Oracle Support 页面下载此补丁。补丁 ID 是 28207390.
重要提示:在撰写本文时与此错误相关的自述文件不包含关键的 post 安装步骤,否则应用此补丁将无法解决问题.
安装补丁后,您需要执行以下步骤:
> 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 问题的陈述 returns 正确。