Геометрии, использующие пользовательскую систему координат, не проверяются в Oracle 12c - PullRequest
0 голосов
/ 05 июня 2018

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

1 Ответ

0 голосов
/ 28 июля 2018

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.

...