Изменение 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