时间:2021-07-01 10:21:17 帮助过:50人阅读
环境: 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
--------------------------------------------------------------------------------------------
SQL> desc wgs_p 名称 是否为空? 类型 ----------------------------------------- -------- ---------------------------- OBJECTID NOT NULL NUMBER(38) SHAPE MDSYS.SDO_GEOMETRY SE_ANNO_CAD_DATA BLOB
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 组件的数据:
我尝试是否是这个字段导致的问题,进行相关测试,该字段并不是导致该问题的原因。
而且我还发现,使用桌面在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 64K 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 64K 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_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
--------------------------------------------------------------------------------------------