现在越来越多的用户使用OracleSpatial进行存储,那么随着之而来的问题就是我的OracleSpatial数据怎么转换到ArcSDE库里面,这个问题有两个理解方式,因为使用Oracle Spatial存储也就是使用SDO_Geometry存储,那么ArcSDE库是ST_Geometry存储,而且ArcSDE库也支持SDO_Geometry进行存储,那么题目的问题可以理解两种方式:
1:纯oracle库里面的Oracle Spatial存储转换到ArcSDE库里面以SDO_Geometry存储
2:纯oracle库里面的Oracle Spatial存储转换到ArcSDE库里面以ST_Geometry存储
一:ArcGIS Desktop10及以上版本
从ArcGIS Desktop10开始有一个新的对象就是QueryLayer,使用这个对象就可以使ArcGIS Desktop直接读取纯Oracle 数据库里面的OracleSpatial数据库,而且在ArcMap里面可以进行图形显示,这样的话,非常简单了,图形显示出来,用户可以将这些数据直接导出成文件GDB,然后在将文件GDB导入到ArcSDE里面,是不是很容易。
相关QueryLayer参考:
二:如果是ArcGIS Desktop 9版本的话
那么还有两个可选项
1:如果用户的桌面软件安装了数据互操作以及有相关的许可,那么可以使用ETL的方式将数据进行转换
2:如果没有(估计大部分用户都没有)
也很容易,我们可以将指定的OracleSpatial数据使用IMP方式将数据导出DMP文件,然后再将这DMP导入到ArcSDE库里面,然后使用sdelayer命令进行注册
C:\Users\Administrator>sdelayer -o register -l zd_1,shape -e a -t SDO_GEOMETRY -i esri_sdeora -u test -p test
ArcSDE 10.0 for Oracle11g Build 2004 Fri Jan 13 11:45:40 2012
Layer Administration Utility
-----------------------------------------------------
Successfully Created Layer.
注册完毕后,我们在ArcMap查看,会报错:
One or more layers failed to draw:
TEST.ZD_1: Underlying DBMS error [ORA-29902: 执行 ODCIIndexStart() 例行程序中出错
ORA-13208: 对运算符 [window SRID does not match layer SRID] 求值时出现内部错误
ORA-06512: 在 "MDSYS.SDO_INDEX_METHOD_10I", line 333
::SELECT SHAPE, TEST.ZD_1.OBJECTID FROM TEST.ZD_1 WHERE mdsys.sdo_filter(TEST.ZD_1.SHAPE, MDSYS.SDO_GEOMETRY(:gtype1,:srid1,NULL,:elem_info1,:ordinates1), 'querytype=window') = 'TRUE'] [TEST.ZD_1]
这是因为没有设置SRID的原因,这里面有一个小小的捷径,我们怎么才能知道我们这个图层的SRID呢,对Oracle Spatial来说,我们知道它的投影信息,那么我们可以使用ArcCatalog新建一个要素类,该要素类的投影与Oracle Spatial的投影一致,而且在存储时我们以SDO_GEOMETRY(选择该关键字即可)进行存储即可,那么我们就可以查看相关的SRID
C:\Users\Administrator>sqlplus sde/sde@orcl
SQL*Plus: Release 11.2.0.1.0 Production on 星期四 5月 24 10:21:47 2012
Copyright (c) 1982, 2010, Oracle. All rights reserved.
连接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> select srid from layers where table_name='ZD_2' and layer_config='SDO_GEOMETRY';
SRID
----------
20
然后我们删除出错的图层,重新导入IMP,重现注册
C:\Users\Administrator>sdelayer -o register -l zd_1,shape -e a -t SDO_GEOMETRY -R 20 -i esri_sdeora -u test -p test
ArcSDE 10.0 for Oracle11g Build 2004 Fri Jan 13 11:45:40 2012
Layer Administration Utility
-----------------------------------------------------
Successfully Created Layer.
这样就可以了
关于SRID
三:使用Oracle自带工具
OracleSpatial自带了sdo2shp来进行转换,可以将Oracle Spatial转换为Shapefile,然后用户使用shapefile导入到ArcSDE里面
相关参考
将ArcSDE的数据导出OracleSpatial
这个也比较容易
1:如果有数据互操作扩展,使用ETL来实现
2:如果没有,可以将你的ArcSDE库里面的数据,以Oracle Spatial方式进行存储,然后通过Oracle的方式IMP等,将DMP文件导入到Oracle数据库里面即可。
3:也可以导出成Shapefile,使用Oracle自带的shp2sdo导入
毕竟ArcGIS没有直接导出Oracle Spatial的接口,所以导出的Oracle Spatial是否有问题就不能保证了.