理解ArcSDE和OracleSpatial一点诀窍

0
分享 2015-12-01
众所周知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 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打开后变为:

</a>

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

文章来源:http://blog.csdn.net/liufeng1980423/article/details/6100221

0 个评论

要回复文章请先登录注册