При обновлении нашей базы данных Oracle с 11.2.0.3.0 до 12.1.0.2.0 мы столкнулись с проблемой, когда функция SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT в Oracle Spatial и Graph возвращает результат, не равный 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