Пространственное преобразование Oracle

У нас есть таблица в базе данных Oracle Spatial, содержащая полигоны (находящиеся в Австрии) в проекции Ламберта (SRID=1000047), которую мы хотим преобразовать в WGS84 (SRID=8307). После выполнения

create table Table2 as (
  select ..., SDO_CS.TRANSFORM(geometry, 8307) as geometry, ...
from Table1)

многоугольники в таблице 2 лежат практически в одной точке к северу от Парижа. Что мы делаем не так?

Изменить. Например, точка [11.26555560027597,53.87928275206266] преобразуется в [2.3069645331040123,49.293822884973984]. Я получаю те же результаты, используя SRID=4326 вместо 8307.

Запрос sqlplus select * from cs_srs where srid=100047 возвращает

PROJCS["LAMBERT",GEOGCS["GCS_MGI",DATUM["D_MGI",SPHEROID["Bessel_1841",6377397.1‌55,299.1528128]], PRIMEM["Greenwich",0],UNIT["Decimal Degree",0.017453292519943295]],PROJECTION["Lambert Conformal Conic"], PARAMETER["False_Easting",400000],PARAMETER["False_Northing",400000], PARAMETER["Central_Meridian",13.33333333333333],PARAMETER["Standard_Parallel_1",‌​46], PARAMETER["Standard_Parallel_2",49],PARAMETER["Scale_Factor",1], PARAMETER["Latitude_Of_Origin",47.5],UNIT["Meter",1]]

person warakawa    schedule 06.05.2014    source источник
comment
Вы пробовали использовать WGS84 SRID 4326? Это EPSG-версия WGS84. Можете ли вы опубликовать пример геометрии?   -  person Ben    schedule 06.05.2014


Ответы (1)


Ваш исходный SRID (1000047) не является ни стандартным кодом EPSG, ни системой координат, поставляемой с любой версией Oracle: он выглядит так, как будто вы определили его самостоятельно. Можете ли вы показать нам определение (выберите * из cs_srs, где srid=1000047)?

Глядя на ваш ввод (11.26555560027597,53.87928275206266) - это не похоже ни на какую проекцию. Мне кажется, что это какие-то геодезические координаты, возможно, в системе отсчета, отличной от WGS84.

Вы используете определение системы координат стандартного SRID 31287:

PROJCS[
  "MGI / Austria Lambert",
  GEOGCS["MGI",
    DATUM["Militar-Geographische Institut",
      SPHEROID[
        "Bessel 1841",
        6377397.155,
        299.1528128,
        AUTHORITY["EPSG", "7004"]],
      TOWGS84[577.326, 90.129, 463.919, 5.137, 1.474, 5.297, 2.4232],
      AUTHORITY["EPSG", "6312"]],
    PRIMEM["Greenwich", 0.000000, AUTHORITY["EPSG","8901"]],
    UNIT["degree (supplier to define representation)", 0.0174532925199433, AUTHORITY["EPSG", "9122"]],
    AXIS["Lat", NORTH],
    AXIS["Long", EAST],
    AUTHORITY["EPSG", "4312"]],
  PROJECTION ["Lambert Conformal Conic"],
  PARAMETER ["Latitude_Of_Origin", 47.5],
  PARAMETER ["Central_Meridian", 13.3333333333333333],
  PARAMETER ["Standard_Parallel_1", 49.0],
  PARAMETER ["Standard_Parallel_2", 46.0],
  PARAMETER ["False_Easting", 400000.0],
  PARAMETER ["False_Northing", 400000.0],
  UNIT["metre", 1.0, AUTHORITY["EPSG", "9001"]],
  AXIS["X", NORTH],
  AXIS["Y", EAST],
  AUTHORITY["EPSG", "31287"]]

Основное отличие от вашего заключается в том, что у вас отсутствуют параметры смещения датума. Другое отличие состоит в том, что стандартные параллели перевернуты: параллель 1 — это 49, а параллель 2 — это 46, а не 46 и 49 в вашем определении.

Вот что я получаю, когда преобразую геометрию, которую вы разместили в качестве примера (закодированную с использованием 31287):

select sdo_cs.transform (
  sdo_geometry(2003,31287,null,sdo_elem_info_array(1, 1003, 1),sdo_ordinate_array(607205.274999979, 528729.87700098, 607052.849999979, 528254.154000983, 607080.702999979, 528224.753000982, 607098.889999979, 528220.193000982, 607113.807999979, 528225.393000979, 607272.533999979, 528720.85100098, 607269.772999979, 528724.96700098, 607205.274999979, 528729.87700098)), 
  4326
) 
from dual;

SDO_GEOMETRY(2003, 4326, NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 1), SDO_ORDINATE_ARRAY(16.1442004, 48.62389, 16.1419009, 48.6196637, 16.1422641, 48.6193904, 16.1425084, 48.6193435, 16.1427132, 48.6193854, 16.1451079, 48.623787, 16.1450725, 48.6238249, 16.1442004, 48.62389))

Результат меня устраивает. Вы можете убедиться, что это так?

Какую именно версию Oracle вы используете? SRID 31287 существует с версии 10gR2.

Самым простым мне кажется использовать для своих данных srid 31287 вместо кастомного 100047.

person Albert Godfrind    schedule 07.05.2014
comment
Данные изначально производились коммерческим инструментом, заказчику известно только, что формат называется Lambert-Auth 47,5. Поиск в Google привел меня к spatialreference.org/ref/epsg/31287, который, я думаю, может быть разумное предположение. Запрос возвращает: CS_NAME=Lambert, SRID=1000047, AUTH-SRID=1000047, AUTH_NAME=NULL, WKTEXT=<LONG>, CS_BOUNDS=NULL, WKTEXT3D=NULL - person warakawa; 07.05.2014
comment
В этом случае правильный SRID для ввода будет 31287. Но опять же, это невозможно, если координаты геометрии такие, как вы их показываете (11.265555560027597,53.87928275206266). Это геодезические координаты, а не проекция. - person Albert Godfrind; 07.05.2014
comment
Можете ли вы показать одну из входных геометрий, чтобы мы могли понять, что у вас есть на самом деле? Подойдет простой SELECT ‹your_geometry_column› FROM ‹your_table› WHERE ROWNUM=1. - person Albert Godfrind; 07.05.2014
comment
Чтобы увидеть определение вашего SRID 100047, используйте sqlplus. Мне нужно увидеть точное содержимое столбца WKTEXT. - person Albert Godfrind; 07.05.2014
comment
Пример ввода: mdsys.sdo_geometry(2003,1000047,mdsys.sdo_point_type(null,null,null),(1, 1003, 1),(607205,274999979, 528729,87700098, 607052,849999979, 528254,154000983, 607080,702999979, 528224,753000982, 607098,889999979, 528220,193000982, 607113,807999979, 528225,393000979, 607272,533999979, 528720,85100098, 607269,772999979, 528724,96700098, 607205,274999979, 528729,87700098)) Какую команду мне нужно запустить в sqlplus? - person warakawa; 07.05.2014
comment
выберите * из cs_srs, где srid=100047; - person Albert Godfrind; 07.05.2014
comment
PROJCS[LAMBERT,GEOGCS[GCS_MGI,DATUM[D_MGI,SPHEROID[Bessel_1841,6377397.155,299.1528128]], PRIMEM[Greenwich,0],UNIT[десятичный градус,0,017453292519943295]],PROJECTION[Lambert Conformal Conic,Fal0se000], PARAMETER0[ ],ПАРАМЕТР[False_Northing,400000], ПАРАМЕТР[Central_Meridian,13.333333333333333],PARAMETER[Standard_Parallel_1,46], PARAMETER[Standard_Parallel_2,49],PARAMETER[Scale_Factor,1], PARAMETER[Latitude_Of_Of_Origin,1,47.5] ] - person warakawa; 09.05.2014
comment
Это точно так же, как SRID 31287. Единственное отличие, которое я вижу в вашем пользовательском определении, заключается в том, что стандартные параллели меняются местами (параллель 1 — 49, а параллель 2 — 46). - person Albert Godfrind; 10.05.2014
comment
Converting the shape you gave as example (using SRID 31287) to 4326 gives: SDO_GEOMETRY(2003, 4326, NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 1), SDO_ORDINATE_ARRAY(16.1442004, 48.62389, 16.1419009, 48.6196637, 16.1422641, 48.6193904, 16.1425084, 48.6193435 , 16.1427132, 48.6193854, 16.1451079, 48.623787, 16.1450725, 48.6238249, 16.1442004, 48.62389)) - person Albert Godfrind; 10.05.2014