Геометрии, использующие пользовательскую систему координат, не проверяются в Oracle 12c

При обновлении нашей базы данных 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 

Кто-нибудь знает причину, по которой наша пользовательская система координат может перестать работать после обновления до 12с?

1 ответ

Решение

Oracle выпустила одноразовое исправление для решения этой проблемы в версии 12.1.0.2. Этот патч можно загрузить со страницы поддержки My Oracle. Идентификатор патча - 28207390.

Важный: README, связанный с этой ошибкой во время написания, не содержит критического шага после установки, без которого применение этого исправления не решит проблему.

После установки патча вам необходимо выполнить следующие шаги:

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

Другие вопросы по тегам