视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
ArcGIS10.2发布OracleSpatial存储的FeatureService的编辑问题
2020-11-09 07:39:22 责编:小采
文档


环境: ArcGIS Desktop10.2 ArcGIS Server 10.2 ArcSDE10.2 Oracle 11.2.0.3 问题描述:根据ArcGIS10.2 的新特性,ArcGIS Server10.2可以发布原生的数据库存储的Feature Service。也就是说,我可以发布在没有任何ArcSDE环境下的使用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/

Publishing feature services from databases
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.


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数据的结构:

SQL> desc MDSYS.SDO_GEOMETRY
 名称 是否为空? 类型
 ----------------------------------------- -------- ----------------------------
 SDO_GTYPE NUMBER
 SDO_SRID NUMBER
 SDO_POINT MDSYS.SDO_POINT_TYPE
 SDO_ELEM_INFO MDSYS.SDO_ELEM_INFO_ARRAY
 SDO_ORDINATES MDSYS.SDO_ORDINATE_ARRAY

--------------------------------------------------------------------------------------------

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


但是,在SDE环境下,通过桌面创建的Oracle Spatial数据的结构
SQL> desc wgs_p
 名称 是否为空? 类型
 ----------------------------------------- -------- ----------------------------
 OBJECTID NOT NULL NUMBER(38)
 SHAPE MDSYS.SDO_GEOMETRY
 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存储的表的结构是

    -- Create table
    create table SDO
    (
     OBJECTID INTEGER not null,
     SHAPE MDSYS.SDO_GEOMETRY,
     SE_ANNO_CAD_DATA BLOB
    )
    tablespace SDE
     pctfree 0
     initrans 4
     maxtrans 255;
    -- Create/Recreate indexes 
    create unique index R95_SDE_ROWID_UK on SDO (OBJECTID)
     tablespace SDE
     pctfree 0
     initrans 4
     maxtrans 255;
    
    使用桌面,在非SDE环境下创建的Oracle Spatial存储的要素类的结构是
    -- Create table
    create table AAB
    (
     OBJECTID INTEGER not null,
     SHAPE MDSYS.SDO_GEOMETRY
    )
    tablespace ESRI
     pctfree 10
     initrans 1
     maxtrans 255
     storage
     (
     initial K
     next 1M
     minextents 1
     maxextents unlimited
     );
    -- Add comments to the columns 
    comment on column AAB.OBJECTID
     is 'ESRI auto-incrementing';
    -- Create/Recreate primary, unique and foreign key constraints 
    alter table AAB
     add primary key (OBJECTID)
     using index 
     tablespace ESRI
     pctfree 10
     initrans 2
     maxtrans 255
     storage
     (
     initial K
     next 1M
     minextents 1
     maxextents unlimited
     );
    
    我曾经试图去比较两者的区别,但是感觉有深层次的差别,其实是没有找到具体原因。


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


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

    --------------------------------------------------------------------------------------------

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

    其他扩展:关于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_1FF$ MOVE STORAGE(INITIAL 1M) ;
    ALTER TABLE MDRT_1FF$ 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
    --------------------------------------------------------------------------------------------

    下载本文
    显示全文
    专题