Эквивалентные пространственные типы для оператора вставки - PullRequest
0 голосов
/ 19 марта 2012

У меня есть ряд файлов, содержащих огромное количество операторов вставки (которые были сгенерированы Toad для Oracle), которые мне нужно запустить в базе данных Postgresql.

Звучит просто, я знаю, но есть также специфические для оракула типы пространственных данных, которые мешают моим усилиям. Я пытался использовать для этого ряд инструментов от SwisSQL до SDO2Shp для переноса данных, и ни один из них не помог, поэтому мой единственный план - попытаться создать программу на C #, чтобы открыть файл, заменить специфические типы Oracle. с типами, которые будут работать в Postgis, а затем снова сохраните файл. Проблема в том, что я понятия не имею, какие типы я мог бы заменить типами Oracle или какой формат или синтаксис я должен использовать.

Я очень плохо знаком с postgresql и postgis, и мои знания оракула также ограничены, так как я ранее использовал SQL Server.

Вот пример оператора Insert. Все они будут иметь одинаковый формат, так как таблицы одинаковы, но с разными данными для разных уровней масштабирования на карте.

Insert into CLUSTER_1000M
(CLUSTER_ID, CELL_GEOM, CELL_CENTROID)
Values
(4410928, 
"MDSYS"."SDO_GEOMETRY"(2003,81989,NULL,
"MDSYS"."SDO_ELEM_INFO_ARRAY"(1,1003,3,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
"MDSYS"."SDO_ORDINATE_ARRAY"(80000,106280,81000,107280,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL)), 
"MDSYS"."SDO_GEOMETRY"(2001,81989,
"MDSYS"."SDO_POINT_TYPE"(80500,106780,NULL),NULL,NULL));

Как я могу получить это в формате, который будет работать с postgis?

1 Ответ

1 голос
/ 19 марта 2012

Понятия не имею, как работает реализация Oracle GIS:

Но, глядя на данные, я не думаю, что преобразование будет возможным (возможно, но усилия могут быть огромными).

Посмотрите, как PostGIS определяет геометрию

INSERT INTO geotable ( the_geom, the_name )
  VALUES ( ST_GeomFromText('POINT(-126.4 45.32)', 312), 'A Place');

PostGIS следует стандартам о том, как отображать / хранить данные, и предлагает методы, которые помогают разработчику в этом. Это преобразование в основном с функциями , которые имеют *from* в названии. Таким образом, чтобы создать правильные данные из строки , результат будет похож на aline

SELECT ST_LineFromWKB(ST_AsBinary(ST_GeomFromText('LINESTRING(1 2, 3 4)'))) AS aline,
        ST_LineFromWKB(ST_AsBinary(ST_GeomFromText('POINT(1 2)'))) IS NULL AS null_return;

aline                            | null_return
------------------------------------------------
010200000002000000000000000000F ... | t

Судя по вашему примеру вывода из Oracle, формат довольно отличается и может не быть конвертируемым (если Oracle не нарушает то, что может придерживаться стандарта).

С другой стороны, если посмотреть на пример Oracle

INSERT INTO cola_markets VALUES(
  1,
  'cola_a',
  SDO_GEOMETRY(
    2003,  -- two-dimensional polygon
    NULL,
    NULL,
    SDO_ELEM_INFO_ARRAY(1,1003,3), -- one rectangle (1003 = exterior)
    SDO_ORDINATE_ARRAY(1,1, 5,7) -- only 2 points needed to
          -- define rectangle (lower left and upper right) with
          -- Cartesian-coordinate data
  )
);

вы можете заменить некоторые имена Oracle на имена для PostGIS, поэтому SDO_ORDINATE_ARRAY(1,1, 5,7) может превратиться в нечто вроде ST_GeomFromText(LINESTRING(1 1, 5 7))

...