众所周知ArcSDE是ESRI公司为访问空间数据所开发的空间数据引擎,OracleSpatial是Oracle公司所开发的空间存储机制,虽然两个产品看似实现了相同的功能,但是实际上两个产品在很多方面存在着不同的地方:从大方面上讲
两个产品的定位不同,ArcSDE定位的领域只是GIS 领域,而OracleSpatial并非只定位于GIS领域,它同时还支持存储别的领域的数据 ,如CAD等工程制图领域。由于定位的不同,导致两个产品对数据的要求级别明显不在一个级别上,ArcSDE要求的级别要比OracleSpaital的高,或者说ArcSDE定义的数据规则要比OracleSpatial的多。
如在两个产品中都规定了一个多边形对象中的一个part是不能自相交的,但是同时ArcSDE中规定一个多边形多个part之间也是不能相交的,但是OracleSpatial确没有这个规则。
现在市场上很多产品都支持向OracleSpatial中添加数据,这其中包括商业的SuperMap, MapInfo以及开源的gdal等等,这些软件在录入数据的时候遵守的是OracleSpatial所指定的规则,同时ArcSDE也支持OracleSpatial的SDO_GEOMETRY的存储格式,但是使用ArcSDE录入数据的时候,在遵守OracleSpatial的规则的同时也要遵守ArcSDE的规则。
这样很多人在混用这些软件的时候会出现一些很奇特的现象,如有些人使用gdal将数据录入到OracleSpatial中后,然后再使用ArcGIS Desktop打开后,会发现有些数据能显示出来,有些数据显示不出来,其中有些显示不出来的数据还是满足ArcSDE的规则的。
当然出现这种现象也是比较正常的,错误也并不是出在两个软件身上,而是在使用这两个软件的人的身上。
为了能够描述出这个现象,我造了两个多边形来重现一下:
第一个多边形,只包括一个part,但是是自相交的,形状如下:
其坐标为
499955.848, 9.835
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是无法做出这样的数据的。
使用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
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
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.
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打开后变为: