http://www.gissky.net- GIS空间站

我要投稿 投稿指南 RSS订阅 网站资讯通告:
搜索: 您现在的位置: GIS空间站 >> 技术专栏 >> ArcGIS >> ArcGIS Server >> 正文

ArcGIS10.2发布Oracle Spatial存储的Feature Service的编辑问题

作者:尤文G斯    文章来源:尤文G斯    点击数:    更新时间:2013-12-17
摘要:问题描述:根据ArcGIS10.2 的新特性,ArcGIS Server10.2可以发布原生的数据库存储的Feature Service。也就是说,我可以发布在没有任何ArcSDE环境下的使用Oracle Spatial存储的数据的Feature Service,直接编辑Oracle Spatial数据。但是我发布完相关服务,可以进行数据删除,在进行新增数据的时候没有反应。

环境:

ArcGIS Desktop10.2

ArcGIS  Server 10.2

ArcSDE10.2

Oracle 11.2.0.3


问题描述:根据ArcGIS10.2 的新特性,ArcGIS Server10.2可以发布原生的数据库存储的Feature Service。也就是说,我可以发布在没有任何ArcSDE环境下的使用Oracle Spatial存储的数据的Feature Service,直接编辑Oracle Spatial数据。但是我发布完相关服务,可以进行数据删除,在进行新增数据的时候没有反应。查看浏览器的F12信息,

报:Rowbuffer creation failed.



但是,通过ArcGIS10.2连接非ArcSDE环境的数据库,也可以创建Oracle Spatial存储的数据,这个数据发布Feature Service 编辑数据没有任何问题。


帮助上如下所示:

http://resources.arcgis.com/en/help/main/10.2/index.html#/What_s_new_in_ArcGIS_10_2/016w0000005s000000/

  1. Publishing feature services from databases  
  2. Prior to 10.2, you could only publish a map service with feature access enabled (a feature service) to ArcGIS Server if the database contained a geodatabase. At 10.2, you can publish editable feature services from supported database management systems. See the ArcGIS database management system requirements for a list of supported databases and spatial data types.  
  3.   
  4.   
  5. Beginning with ArcGIS 10.2, you should use ArcGIS Server feature services to publish data from a database rather than using ArcGIS Spatial Data Server feature services, as these have been deprecated.  

延伸阅读:

也就是说,我在不用安装ArcSDE库的情况下,可以使用ArcGIS Server10.2发布Oracle(Oracle Spatial)、SQLServer(Geometry、Geography)、PostgreSQL(PostGIS Geometry)存储的Feature Service。


非常纳闷,这本来是ArcGIS10.2的新特性,怎么就不能编辑呢?


经过N天的沟通和研究,我发现了一个问题。而问题出在我自己的数据上。

我的Oracle有两个实例,一个实例安装了SDE库,另一个实例就是一个非SDE库的环境,我构造的Oracle Spatial数据,是使用ArcGIS Desktop连接SDE库,创建了SDO_Geometry的要素类,然后通过Oracle的EXP/IMP的方法导入到非SDE库,这样也能达到模拟Oracle Spatial数据存储的环境,但是正是这个数据导致了相关问题。


首先我们看一下原生的Oracle Spatial数据的结构:

  1. SQL> desc  MDSYS.SDO_GEOMETRY  
  2.  名称                                      是否为空? 类型  
  3.  ----------------------------------------- -------- ----------------------------  
  4.  SDO_GTYPE                                          NUMBER  
  5.  SDO_SRID                                           NUMBER  
  6.  SDO_POINT                                          MDSYS.SDO_POINT_TYPE  
  7.  SDO_ELEM_INFO                                      MDSYS.SDO_ELEM_INFO_ARRAY  
  8.  SDO_ORDINATES                                      MDSYS.SDO_ORDINATE_ARRAY  

--------------------------------------------------------------------------------------------
版权所有,文章允许转载,但必须以链接方式注明源地址,否则追究法律责任!

Blog:               http://blog.csdn.net/linghe301
Weibo:            http://www.weibo.com/linghe301
--------------------------------------------------------------------------------------------


但是,在SDE环境下,通过桌面创建的Oracle Spatial数据的结构
  1. SQL> desc wgs_p  
  2.  名称                                      是否为空? 类型  
  3.  ----------------------------------------- -------- ----------------------------  
  4.  OBJECTID                                  NOT NULL NUMBER(38)  
  5.  SHAPE                                              MDSYS.SDO_GEOMETRY  
  6.  SE_ANNO_CAD_DATA                                   BLOB  


ArcGIS不光创建了MDSYS.SDO_GEOMETRY以外,还创建了一个SE_ANNO_CAD_DATA字段。


Tips:如果存储 CAD 和注记属性,则会向业务表中添加一个附加列。
SDO_GEOMETRY 类型无法存储 ArcGIS 存储必定支持的所有类型的几何元素。当需要存储这些元素时(由创建要素类时所指定的几何类型标记决定),ArcGIS 会向业务表中添加名为 SE_ANNO_CAD_DATA 的列。

每当 ArcGIS 检测到数据源中含有 CAD 数据时,ArcGIS 就会将 CAD 数据的简单几何表示写入 SDO_GEOMETRY 值中并将未修改的 CAD 数据写入 SE_ANNO_CAD_DATA 值中。如果数据源中不含 CAD 数据,ArcGIS 会将 SE_ANNO_CAD_DATA 值设置为 NULL。SE_ANNO_CAD_DATA 属性包含来自大量 ArcGIS 组件的数据:

  • 来自 ArcSDE CAD 客户端的 AutoCAD 或 MicroStation 数据 
  • 来自 ArcMap 的三次样条和贝塞尔曲线等参数对象 
  • 来自 ArcGIS Spatial Analyst 扩展模块的表面片 
我尝试是否是这个字段导致的问题,进行相关测试,该字段并不是导致该问题的原因。

而且我还发现,使用桌面在SDE环境下创建的带有Oracle Spatial存储的表的结构是

  1. -- Create table  
  2. create table SDO  
  3. (  
  4.   OBJECTID         INTEGER not null,  
  5.   SHAPE            MDSYS.SDO_GEOMETRY,  
  6.   SE_ANNO_CAD_DATA BLOB  
  7. )  
  8. tablespace SDE  
  9.   pctfree 0  
  10.   initrans 4  
  11.   maxtrans 255;  
  12. -- Create/Recreate indexes   
  13. create unique index R95_SDE_ROWID_UK on SDO (OBJECTID)  
  14.   tablespace SDE  
  15.   pctfree 0  
  16.   initrans 4  
  17.   maxtrans 255;  
使用桌面,在非SDE环境下创建的Oracle Spatial存储的要素类的结构是
  1. -- Create table  
  2. create table AAB  
  3. (  
  4.   OBJECTID INTEGER not null,  
  5.   SHAPE    MDSYS.SDO_GEOMETRY  
  6. )  
  7. tablespace ESRI  
  8.   pctfree 10  
  9.   initrans 1  
  10.   maxtrans 255  
  11.   storage  
  12.   (  
  13.     initial 64K  
  14.     next 1M  
  15.     minextents 1  
  16.     maxextents unlimited  
  17.   );  
  18. -- Add comments to the columns   
  19. comment on column AAB.OBJECTID  
  20.   is 'ESRI auto-incrementing';  
  21. -- Create/Recreate primary, unique and foreign key constraints   
  22. alter table AAB  
  23.   add primary key (OBJECTID)  
  24.   using index   
  25.   tablespace ESRI  
  26.   pctfree 10  
  27.   initrans 2  
  28.   maxtrans 255  
  29.   storage  
  30.   (  
  31.     initial 64K  
  32.     next 1M  
  33.     minextents 1  
  34.     maxextents unlimited  
  35.   );  
我曾经试图去比较两者的区别,但是感觉有深层次的差别,其实是没有找到具体原因。


也就是说,非SDE环境下(ArcGIS Desktop或者SQL语句)创建的OracleSpatial存储的数据可以发布要素服务,而且可以编辑,但是在SDE环境下发布的要素类,将该表迁移到非SDE环境下发布Feature Service服务,编辑就报错。


最后,解决方法:使用该功能,建议在非SDE环境下直接创建,而不能是其他迁移过来的数据。

其他扩展:关于Oracle Spatial

将数据以Oracle Spatial进行存储,Oracle也有一个关于投影的系统表,还有一个管理这些空间数据的系统表。


关于空间数据系统表

 将 SDO_GEOMETRY 列添加到业务表时,它还会将所需的 Oracle Spatial 元数据记录添加到 USER_SDO_GEOM_METADATA 视图。此元数据包括表名称、SDO_GEOMETRY 列名称、空间参考 ID 和坐标维度信息。


关于投影的系统表,可以查看MDSYS.CS_SRS,相关的SRID信息必须在该表里面,如果没有,你的数据显示就会有相关问题。



关于Oracle Spatial的空间索引:

数据库中有好多的MDRT打头的表,而这些表的字段都是一样的,那这些表是做什么用呢?


MDRT_<>$: 用来存储与空间索引相关的信息。这些表与常规表不一样,不能做复制,删除,新建等。如果对这些表进行操作后,会导致其对应的空间索引无效,因此必须重新将该索引删除重建。
    SQL> ALTER TABLE MDRT_1F89F$ MOVE STORAGE(INITIAL 1M) ;
            ALTER TABLE MDRT_1F89F$ MOVE STORAGE(INITIAL 1M)
           ORA-30967: 不允许在路径表上直接执行操作
具体如下:


    不应当将MDRT表从一个表空间移动到另一个表空间:如果这样做,相应的空间索引将不可用,所有基于表索引的空间操作符都将失效。在这种情况下,恢复的唯一方法就是删除并重建空间索引。为了避免这些问题,应确保数据库管理员知道这个限制并在执行一些优化时不要移动MDRT表。可以在创建空间索引时使用tablespace参数来指定MDRT表需要的表存储空间。
    
    不应该删除/修改MDRT表或MDRS序列:当它们与任何空间索引都不关联时(在正常的情况下,这种情况是不能发生的),可以删除它们。可以通过检查USER_SDO_INDEX_METADATA视图来确定所有的MDRT表与用户的空间索引是否相关联。
  SQL> SELECT sdo_index_name, sdo_index_table, sdo_rtree_seq_name  FROM USER_SDO_INDEX_METADATA; 


    不应当显式地导出MDRT表:当导入一个表时,如含有空间索引的customers表,相应的空间索引信息同样被导出。在导入的过程中,空间索引(和相应的MDRT表)将被重建。不需要导入或导出任何MDRT表(或MDRS序列)。


    不应当将MDRT表复制到一个复制型数据库中:如果想复制一个用户表,如customers表,所有你要复制的就是那个customers表。你需要显式地在复制实例上创建空间索引。
 

--------------------------------------------------------------------------------------------
版权所有,文章允许转载,但必须以链接方式注明源地址,否则追究法律责任!

Blog:               http://blog.csdn.net/linghe301
Weibo:            http://www.weibo.com/linghe301
--------------------------------------------------------------------------------------------

Tags:ArcGIS,Oracle Spatial  
责任编辑:gissky
关于我们 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 中国地图