理解ArcSDE和OracleSpatial一点诀窍
来源:互联网 发布:淘宝运营组织架构 编辑:程序博客网 时间:2024/06/11 00:27
众所周知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打开后变为:
- 理解ArcSDE和OracleSpatial一点诀窍
- OracleSpatial存储与ArcSDE存储相互转换
- OracleSpatial存储与ArcSDE存储相互转换
- ArcSDE如何注册MapInfo录入的OracleSpatial数据
- SuperMap iDesktop中OracleSpatial数据源直接及ArcSDE服务连接介绍
- ArcSDE基本概念理解
- 关于空间数据在线编辑和ArcSDE版本管理的一点总结
- 为Oraclespatial表添加记录和创建空间索引
- 为Oraclespatial表添加记录和创建空间索引
- ArcSDE的版本的理解
- ArcSDE版本的理解(转)
- ArcCatalog和ArcSDE
- oracle11g和arcsde
- vi 技巧和诀窍
- wait 和 notify的一点理解
- 滤波器的一点理解和困惑
- 栈和托管堆的一点理解
- 对ANSI和Unicode的一点理解
- 使用FreeMarker生成静态页面,解决中文乱码问题源码
- Com线程模型及工作方式
- fgetops/fsetops 和 ftell/fseek 之间区别
- js刷新页面的方法
- socket通信
- 理解ArcSDE和OracleSpatial一点诀窍
- centOS 下 sendmail邮件服务器搭载smtp和pop3认证的配置方法
- 兄弟连Linux在线课堂:第8讲 Linux进程管理
- 兄弟连Linux在线课堂:第8讲 Linux进程管理
- JS如何实现在一个页面停留1分钟跳转另外一个页面?
- Windows 7样式地址栏(Address Bar)控件实现
- flash 地址
- 连接数据库
- 简单的验证码实现