insert语句的等效空间类型

时间:2012-03-19 12:23:40

标签: oracle postgresql postgis

我有许多文件包含大量的Insert语句(由Toad for Oracle生成),我需要在Postgresql数据库上运行。

听起来很简单我知道但是也有oracle特定的空间数据类型阻碍了我的努力。我尝试使用一些工具从SwisSQL到SDO2Shp来迁移数据并且没有任何帮助,所以我唯一的计划是尝试提出一个C#程序打开文件,替换oracle特定类型使用将在postgis中工作的类型,然后再次保存文件。问题是我不知道我可以用Oracle替换哪些类型或我必须使用的格式或语法。

我是postgresql和postgis的新手,我的oracle知识也有限,因为我之前使用的是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 个答案:

答案 0 :(得分:1)

我不知道Oracle GIS实现的工作原理:

但是看看这些数据,我认为转换是不可能的(可能是,但努力可能很大)。

看看PostGIS defines Geometry

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

PostGIS遵循standards关于如何显示/存储数据的方法,并提供方法可以帮助开发人员这样做。此转化主要是with functions,其名称中包含*from*。因此,要从line创建正确的数据,输出类似于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 example

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))