理解ArcSDE和OracleSpatial一点诀窍

众所周知ArcSDE是ESRI公司为访问空间数据所开发的空间数据引擎,OracleSpatial是Oracle公司所开发的空间存储机制,虽然两个产品看似实现了相同的功能,可是实际上两个产品在不少方面存在着不一样的地方:从大方面上讲html

两个产品的定位不一样,ArcSDE定位的领域只是GIS 领域,而OracleSpatial并不是只定位于GIS领域,它同时还支持存储别的领域的数据 ,如CAD等工程制图领域。因为定位的不一样,致使两个产品对数据的要求级别明显不在一个级别上,ArcSDE要求的级别要比OracleSpaital的高,或者说ArcSDE定义的数据规则要比OracleSpatial的多。数据库

如在两个产品中都规定了一个多边形对象中的一个part是不能自相交的,可是同时ArcSDE中规定一个多边形多个part之间也是不能相交的,可是OracleSpatial确没有这个规则。oracle

如今市场上不少产品都支持向OracleSpatial中添加数据,这其中包括商业的SuperMap, MapInfo以及开源的gdal等等,这些软件在录入数据的时候遵照的是OracleSpatial所指定的规则,同时ArcSDE也支持OracleSpatial的SDO_GEOMETRY的存储格式,可是使用ArcSDE录入数据的时候,在遵照OracleSpatial的规则的同时也要遵照ArcSDE的规则。ui

这样不少人在混用这些软件的时候会出现一些很奇特的现象,若有些人使用gdal将数据录入到OracleSpatial中后,而后再使用ArcGIS Desktop打开后,会发现有些数据能显示出来,有些数据显示不出来,其中有些显示不出来的数据仍是知足ArcSDE的规则的。spa

固然出现这种现象也是比较正常的,错误也并非出在两个软件身上,而是在使用这两个软件的人的身上。.net

为了可以描述出这个现象,我造了两个多边形来重现一下:code

第一个多边形,只包括一个part,可是是自相交的,形状以下: htm

image

其坐标为对象

499955.848,   9.835ip

499972.572,-12.938

499943.394,-9.024

499974.173,  2.362

499955.848,  9.835

分别使用OracleSpatial和ArcSDE所提供的空间SQL插入该条数据:

OracleSpatial:

 

SQL
> ed
Wrote file
 afiedt.buf
 
  1  insert into
 test10 values
 (SDO_GEOMETRY(3007,NULL
,NULL
,SDO_ELEM_INFO_ARRAY
  2  (1,1003,1),SDO_ORDINATE_ARRAY(499955.848,9.835,0, 499972.572,-12.938,0,499943.394,
  3* -9.04,0,499974.173,2.362,0,499955.848,9.835,0)),2)
SQL
> /
 
1 row
 created.
 
SQL
> commit
;
 
Commit
 complete.
 
SQL
>

插入成功,可是使用OracleSpatial所提供的验证方法进行验证的时候报错:

SQL
> ed
Wrote file
 afiedt.buf
 
  1  select
 sdo_geom.validate_geometry_with_context(t.ora_geometry,0.0001) from
 test10 t
  2* where
 t.objectid=2
SQL
> /
 
SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT(T.ORA_GEOMETRY,0.0001)
--------------------------------------------------------------------------------
13349 [Element <1>] [Ring <1>][Edge <3>][Edge <1>]

13349的错误描述以下:

192.168.100.228 [oracle ~]$ oerr ora 13349
13349, 00000, "polygon boundary crosses itself"
// *Cause: The boundary of
 a polygon intersects itself.
// *Action
: Correct the geometric definition of
 the object
.

 

ArcSDE:

SQL
> ed
Wrote file
 afiedt.buf
 
  1  insert into
 test12 values
 (2,2,st_polygon('polygon((499955.848 9.835, 499972.572 12.938,499943.3
  2* -9.024,499974.173 2.362,499955.848 9.835))',6))
SQL
> /
insert into
 test12 values
 (2,2,st_polygon('polygon((499955.848 9.835, 499972.572 12.938,499943.394
                               *
ERROR at
 line 1:
ORA-20004: Error generating shape from
 text: Self intersecting segments (-111).
ORA-06512: at
 "SDE.ST_GEOMETRY_SHAPELIB_PKG", line 12
ORA-06512: at
 "SDE.ST_POLYGON", line 58

也报自相交的错误。

两个产品都是判断出单个part内自相交的状况,只是表现形式不一样,OracleSpatial的规则是能够添加记录,可是验证失败,ArcSDE是直接不让天际记录。

第二个多边形,包含两个Part,而且两个Part相交, 图形以下:

为了模拟的须要,我本身用程序写了一个SHP文件(SHP文件没有这种规则要求),并用ArcMap打开,若是本身想模拟这种状况,必须本身写SHP,用Destktop是没法作出这样的数据的。

image

使用OracleSpatial的空间SQL插入该数据,以下所示:

SQL
> ed
Wrote file
 afiedt.buf
 
  1  insert into
 test10 values
 (SDO_GEOMETRY(3007, NULL
, NULL
, SDO_ELEM_INFO_ARRAY(1, 1003, 1, 16, 1003,
  2  1), SDO_ORDINATE_ARRAY(499932.134, 58.473, 0, 499932.134, 12.435, 0, 499999.603, 12.435, 0,
  3  499999.074, 60.325, 0, 499932.134, 58.473, 0, 499975.526, 70.644, 0, 499976.145, -9.566, 0, 500023.151,
  4* -8.202, 0, 500019.447, 75.671, 0, 499975.526, 70.644, 0)),3)
SQL
> /
 
1 row
 created.
 
SQL
> commit
;
 
Commit
 complete;
 
对该数据继续使用OracleSpatial所提供的方法进行验证:
 

SQL
> select
 sdo_geom.validate_geometry_with_context(t.ora_geometry,0.0001) from
 test10 t where
 t.objectid=3;
 
SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT(T.ORA_GEOMETRY,0.0001)
--------------------------------------------------------------------------------
TRUE
 
OracleSpatial方法验证结果正确,也就是说OracleSpaital认为该数据为合法数据。
 
 
使用ArcSDE所提供的空间SQL插入该数据,以下所示:
 

SQL
> ed
Wrote file
 afiedt.buf
 
  1  insert into
 test12 values
 (3,3,st_multipolygon('multipolygon(((499932.134 58.473,499999.074 60.325,499999.603 12.435,
  2  499932.134 12.435,499932.134 58.473)),((499975.526 70.644,500019.447 75.671,500023.151 -8.202,
  3* 499976.145 -9.566,499975.526 70.644)))',6))
SQL
> /
insert into
 test12 values
 (3,3,st_multipolygon('multipolygon(((499932.134 58.473,499999.074 60.325,499999.603 12.435,
                               *
ERROR at
 line 1:
ORA-20004: Error generating shape from
 text: Self intersecting segments (-111).
ORA-06512: at
 "SDE.ST_GEOMETRY_SHAPELIB_PKG", line 12
ORA-06512: at
 "SDE.ST_MULTIPOLYGON", line 58
 
ArcSDE仍是报自相交的错误,,咱们把录入数据的方法换成shp2sde看看是否也报这个错误,结果同样:
E:/>shp2sde -o create
 -l test13,shape -f e:/test10.shp -P HIGH -e a -u sde -p sde -s 192.168.100.228
 
ArcSDE 10.0  for
 Oracle10g Build 3073 Mon Nov  1 15:00:58  2010
Shape to
 Layer Loading   Administration Utility
-----------------------------------------------------
Set
 X_offset   =      499932
Set
 Y_offset   =         -10
Set
 XY_scale   =50000000000000
Set
 Grid Size0 =           2
Shape 1 failed initial verification: Ring crosses ring
No
 new
 record generated.
0          features converted.
0          features stored.
 
为了解决这个问题,可使用ArcCatalog来导入该shp文件,使用ArcCatalog导入该shp的过程当中,会将该数据从新组合成可使用的数据,如下的数据是使用ArcCatalog录入的shp文件:
 
其的点串坐标变为:
SQL
> select
 st_astext(shape) from
 test12 ;

ST_ASTEXT(SHAPE)
--------------------------------------------------------------------------------
MULTIPOLYGON ((( 499975.52600000 70.64400000, 499975.61064387 59.67584948, 4999
99.07400000 60.32500000, 499999.60300000 12.43500000, 499975.97521295 12.4350000
0, 499976.14500000 -9.56600000, 500023.15100000 -8.20200000, 500019.44700000 75.
67100000, 499975.52600000 70.64400000)),(( 499932.13400000 58.47300000, 499932.1
3400000 12.43500000, 499975.97521295 12.43500000, 499975.61064387 59.67584948, 4
99932.13400000 58.47300000)))
使用ArcMap打开后变为:

 
从上面两组数据能够看出,ArcSDE的规则更严格,更严格的好处是保证了数据的正确性和一致性。
 
 
 
若是全国二次土地调查的数据按照OracleSpatial的规则录入到数据库中,估计中国的老百姓得每天为了土地的归属权打官司了,因此对于某些厂商所描述的没有使用ArcSDE就能够正常的录入OracleSpaital,而且录入后的数据不使用ArcSDE的检查就能够正常使用,俺实在是不敢苟同了。