ArcSDE如何注册MapInfo录入的OracleSpatial数据

0
分享 2015-12-18
1 原因
某开发商以前使用的产品是MapInfo,并且以前录入的数据都是使用MapInfo工具录入的,所用的存储格式为OracleSpatial的SDO_GEOMETRY。现在采用ArcSDE来管理空间数据库,由于ArcSDE支持SDO_GEOMETRY存储格式,因此可以管理这部分由MapInfo录入的数据,但是需要做一些特殊的处理。
2 数据
Mapsheet50.dmp
提供着: 开发商
获取方式: 使用oracle的exp工具获得
内容: 图层名称:mapsheet,图层类型:point, 空间类型:sdo_geometry,空间字段名称:geoloc,导出的用户名:ismdata
3 操作构成
3.1 导入数据
将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都看不出来,此时怀疑该表在逻辑上可能是存在问题。
3.2 注册该表为点图层
使用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可以任意的蹂躏这个图层了。
既然点和线的数据都存在,那应该估计也能注册成线图层,现在注册成线图层试试。
3.3 注册表为线图层
先用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直接就可以看到:

文章来源:http://blog.csdn.net/liufeng1980423/article/details/6074527

0 个评论

要回复文章请先登录注册