某开发商以前使用的产品是MapInfo,并且以前录入的数据都是使用MapInfo工具录入的,所用的存储格式为OracleSpatial的SDO_GEOMETRY。现在采用ArcSDE来管理空间数据库,由于ArcSDE支持SDO_GEOMETRY存储格式,因此可以管理这部分由MapInfo录入的数据,但是需要做一些特殊的处理。
Mapsheet50.dmp
提供着: 开发商
获取方式: 使用oracle的exp工具获得
内容: 图层名称:mapsheet,图层类型:point, 空间类型:sdo_geometry,空间字段名称:geoloc,导出的用户名:ismdata
将Mapsheet50.dmp导入到我的已经安装了SDE的数据中,过程如下:
E:/>imp sde/sde file=mapsheet50.dmp fromuser=ismdata touser=sde
Import: Release 10.2.0.4.0 - Production on 星期四 7月 1 13:44:35 2010
Copyright (c) 1982, 2007, Oracle. All rights reserved.
连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
经由常规路径由 EXPORT:V10.02.01 创建的导出文件
警告: 这些对象由 ISMDATA 导出, 而不是当前用户
已经完成 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集中的导入
. 正在将 ISMDATA 的对象导入到 SDE
. . 正在导入表 "MAPSHEET50"导入了 1050 行
成功终止导入, 没有出现警告。
此时到数据库中可以看到这张表已经存在了,其结构为:
名称 是否为空? 类型
----------------------------------------- -------- --------------------------
MAPNO VARCHAR2(15)
OLDNO VARCHAR2(15)
MI_STYLE VARCHAR2(254)
MI_PRINX NOT NULL NUMBER(10)
GEOLOC MDSYS.SDO_GEOMETRY
但是在ArcCatalog中查看其只是一张普通的表,如下图:
并且在preview中连table都看不出来,此时怀疑该表在逻辑上可能是存在问题。
使用sdelayer命令注册该表,使其成为sde能够识别的geodatabase的featureclass.
E:/>sdelayer -o register -l MAPSHEET50,GEOLOC -e l -C MI_PRINX,USER -u sde -p sd
e -i esri_sde -t SDO_GEOMETRY -P HIGH
ArcSDE 9.3 for Oracle10g Build 508 Thu Apr 17 12:23:18 2008
Layer Administration Utility
-----------------------------------------------------
Successfully Created Layer.
注意
I. Sdelayer命令的参数-l用来指定需要注册的表名以及表中的空间字段,而且表明和字段的名称一定要大写,如果小写的话会提示错误。
II. Sdelayer支持注册的空间类型为ST_GEOMETRY和SDO_GEOMETRY两种类型,其它的类型不支持。
III. –e参数用来指定需要注册成what类型,以下是常用的类型:
-e
Entity types allowed (npslaAc3+M).
n
Nil
p
Point features
s
Line (spaghetti) features
l
Simple line (line string) features
a
Area features
A
Annotation
c
CAD data
3
Three-dimensional features can be added to the entity type mask only with the `-o add' operation
+
Multipart features
M
Measures on coordinates. The [-m] option is required to store measure values on each coordinate. Measures can be added to the entity type mask only with the "-o add" operation.
注册成为FeatureClass后,在ArcCatalog看,图标的确是发生了变化,如下图:
图层的类型是点,但是仍然不能显示出来,但是我坚信开发商跟我说的使用MapInfo生成的点,应该是可以的。此时到数据库中查询该表中的第一条记录,结果如下:
SQL> select p.geoloc from mapsheet50 p where rownum<2;
GEOLOC(SDO_GTYPE, SDO_SRID, SDO_POINT(X, Y, Z), SDO_ELEM_INFO, SDO_ORDINATES)
--------------------------------------------------------------------------------
SDO_GEOMETRY(2003, 8307, SDO_POINT_TYPE(121.5, 7.00000002, NULL), SDO_ELEM_INFO_
ARRAY(1, 1003, 1), SDO_ORDINATE_ARRAY(120, 6.00000003, 123, 6.00000003, 123, 8.0
0000001, 120, 8.00000001, 120, 6.00000003))
发现sdo_gtype的值居然是2003,在oraclespatial的规范中表示是line,但是如果表示的是line,那SDO_POINT_TYPE怎么不为空???,不明白MapInfo创建了一个点对象还是线对象,但是既然SDO_POINT_TYPE中是有值的,就说明还是可以注册成点层的,因此把表给改了一把,如下:
SQL> update mapsheet50 p set p.geoloc.sdo_gtype=2001;
update mapsheet50 p set p.geoloc.sdo_gtype=2001
*
第 1 行出现错误:
ORA-29877: failed in the execution of the ODCIINDEXUPDATE routine
ORA-13032: Invalid NULL SDO_GEOMETRY object
ORA-06512: at "MDSYS.SDO_INDEX_METHOD_10I" , line 270
出现错误,忘了删除空间索引了。
SQL> select index_name from user_indexes where table_name='MAPSHEET50' and index
_type='DOMAIN' ;
INDEX_NAME
------------------------------------------------------------
MAPSHEET50_SX
SQL> drop index mapsheet50_sx force;
索引已删除。
SQL> update mapsheet50 p set p.geoloc.sdo_gtype=2001;
已更新1050行。
把类型给改成point.
SQL> commit;
提交完成。
此时能够看到图了,如下图:
重新创建了一下空间索引,但是报错:如下,
从错误描述上应该是sdo_geometry处于一种不正常的状态,然后继续修改,修改如下:
SQL> update mapsheet50 p set p.geoloc.sdo_elem_info=NULL;
update mapsheet50 p set p.geoloc.sdo_elem_info=NULL
*
第 1 行出现错误:
ORA-29861: domain index is marked LOADING/FAILED/UNUSABLE
SQL> drop index mapsheet50_sx force;
drop index mapsheet50_sx force
*
第 1 行出现错误:
ORA-01418: specified index does not exist
SQL> select index_name from user_indexes where table_name='MAPSHEET50' and index
_type='DOMAIN' ;
INDEX_NAME
------------------------------------------------------------
A21_IX1
SQL> drop index a21_idx1 force;
drop index a21_idx1 force
*
第 1 行出现错误:
ORA-01418: specified index does not exist
SQL> drop index a21_ix1 force;
索引已删除。
SQL> update mapsheet50 p set p.geoloc.sdo_elem_info=NULL;
已更新1050行。
SQL> update mapsheet50 p set p.geoloc.sdo_ordinates=NULL;
已更新1050行。
SQL> commit;
提交完成。
继续创建索引,创建成功,此时索引的状态为可用。
SQL> select index_name,status from user_indexes where table_name='MAPSHEET50' an
d index_type='DOMAIN' ;
INDEX_NAME STATUS
------------------------------------------------------------ ----------------
A21_IX1 VALID
到此为止注册点的操作已经完成,使用Desktop可以任意的蹂躏这个图层了。
既然点和线的数据都存在,那应该估计也能注册成线图层,现在注册成线图层试试。
先用ArcCatalog把mapsheet50图层,改个名,改成mapsheet50_p.冲新把再把mapsheet50导入到数据库中,上面有介绍,不再详细介绍,使用sdelayer命令注册,命令如下:
E:/>sdelayer -o register -l MAPSHEET50,GEOLOC -e l -C MI_PRINX,USER -u sde -p sd
e -i esri_sde -t SDO_GEOMETRY -P HIGH -s 192.168.200.224 -i 5151
ArcSDE 9.3 for Oracle10g Build 508 Thu Apr 17 12:23:18 2008
Layer Administration Utility
-----------------------------------------------------
Successfully Created Layer.
注册成line状图层之后在ArcCatalog直接就可以看到: