Изменение SRID SDO_geometry от существующего значения без изменения исходного значения

У меня есть таблица базы данных Oracle со столбцом в типе SDO_GEOMETRY. Я пытаюсь написать представление для этой таблицы и получить столбец SDO_GEOMETRY с другим SRID. Я не хочу изменять исходную таблицу или преобразовывать значение в другой SRID. Я просто хочу получить столбец геометрии с другим SID (те же значения вершин). Как этого добиться?

Таблица такая:

Create Table Locations (CityCode VARCHAR(2), Location SDO_GEOMETRY)

Я пытаюсь создать вид, например, такой:

CREATE OR REPLACE VIEW VW_Locations AS
SELECT 
  CityCode, 
  SDO_GEOMETRY(Location, <NEW_SRID>) 
FROM Locations

Я пытался использовать конструктор для SDO_GEOMETRY, используя WKT в качестве параметра, но я не смог сделать это, потому что значения геометрии в моей таблице являются трехмерными, а Oracle не поддерживает WKT/WKB преобразование значений 3D SDO_GEOMETRY. Этот работает для 2D геометрии:

CREATE OR REPLACE VIEW VW_Locations AS
SELECT 
  CityCode, 
  SDO_GEOMETRY(SDO_UTIL.TO_WKTGEOMETRY(Location), <NEW_SRID>) AS Loc
FROM Locations

1 ответ

Я попробовал тот же подход, что и вы, и у меня была та же проблема (экспорт TO_WKTGEOMETRY работает только для 2D-геометрии).

Мой текущий подход заключается в использовании пользовательской функции для применения SRID через нотацию точки объекта:

CREATE OR REPLACE FUNCTION APPLY_SRID 
(
  GEOM IN OUT MDSYS.SDO_GEOMETRY 
, SRID IN NUMBER DEFAULT 8307 
) RETURN MDSYS.SDO_GEOMETRY AS 
BEGIN
  GEOM.SDO_SRID := SRID;
  RETURN GEOM;
END APPLY_SRID;

В вашем собственном коде вы должны использовать это следующим образом:

CREATE OR REPLACE VIEW VW_Locations AS
SELECT 
  CityCode, 
  APPLY_SRID(Location, <NEW_SRID>) 
FROM Locations
Другие вопросы по тегам