Oracle SQL 查询 ArcGIS 10.2 的 sde 属性域数据
1) 项目背景
XXXX GIS 系统想要脱离 ArcGIS 平台,采用 Oracle Spatial 存储空间图层数据(例如:林地小班 ,字段都是英文名称,字段值为编码)
字典代码采用单个的属性表来存储(例如:坡度代码表、林场代码表等)
然后通过运维管理系统,设置图层表的字段对应的代码表,建立起中英文翻译关系。
字典注册说明表:T_DICT_TYPE
图层字段关联字典代码关系表: T_M_DICT_FIELD
但是现场现在是通过 ArcCatalog工具处理的数据,存储在ArcSde中,又不想再手动
重复执行上面的数据入库流程,所以需要考虑通过程序来实现自动数据导入转换到oracle spatial中,包括图层矢量数据、属性域数据。
下面介绍的就是怎样通过已 sql语句实现属性域数据的查询。
2 ) 环境介绍
数据库: Oracle 11g
GIS 平台: ArcGIS 10.2
地理数据库 : 采用 ArcCatalog 的 ArcToolbox 创建企业级地理数据库,然后可用 Arccatalog 直连方式连接
3 ) 创建sde 表空间
采用 ArcCatalog 的 ArcToolbox 地理数据库管理 ->创建企业级地理数据库
创建完 sde 表空间后,建立连接,如下图所示:
4) 创建sde 用户下的 属性域
在 sde 表空间下,创建属性域,和向属性域添加编码值,如下图:
或者通过 ‘表转属性域’ 浏览一个 excel 文件,来批量创建属性域和编码值,例如:
创建完属性域后,右键点击刚才新建的数据库连接名-> 属性,可查看到属性域列表:
5) 给 sde 用户下的空间图层的字段,绑定属性域
(二)利用 oracle sql 语句查询前面配置的属性域信息
利用 pl/sql 登录sde 库,执行如下sql 语句
select * fromsde.gdb_items_vw
如果提示执行错误,找不到 dll 库路径,则是因为 sde的 ST_SHAPELIB.dll 文件路径配置不正确,执行 如下sql 语句,查看当前路径
select*from user_libraries
如果路径配置不正确,则执行如下操作:
A、 拷贝 dll 文件到 oracle 安装路径的bin 目录下 , 例如 E:\oracle11g\product\11.2.0\dbhome_1\BIN
B、打开 E:\oracle11g\product\11.2.0\dbhome_1\NETWORK\ADMIN目录下的 listener.ora 文件, 添加 dll 文件的引入配置;
C、 打开 E:\oracle11g\product\11.2.0\dbhome_1\hs\admin 目录下的 extproc.ora 文件,添加 dll 文件的引入配置;
D、 在 pl/sql 中,执行sql 语句,修改dll 路径地址
create orreplace library ST_SHAPELIB
as'E:\\app\\administrator\\product\\11.2.0\\dbhome_1\\BIN\\st_shapelib.dll'
注意:路径写两个反斜杠,同时需要确认这个路径下的 st_shapelib.dll文件与 arcgis版本是否一致。
E、 重启 oracle 服务和监听服务
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
6) Sql 语句查询所有的属性域
执行如下sql 语句,得到ArcCatalog 配置的所有属性域信息(所有者、属性域名称、属性域中文别名、属性域编码、属性域值):
SELECT
EXTRACTVALUE(xmltype(items.definition),'*/Owner') Owner,
items.Name AS domain_name ,
EXTRACTVALUE(xmltype(items.definition),'*/Description')Description,
EXTRACTVALUE(CodedValues.COLUMN_VALUE,
'CodedValue/Code')ASCode,
EXTRACTVALUE(CodedValues.COLUMN_VALUE,
'CodedValue/Name')ASValue
FROM SDE.GDB_ITEMS_VW items
INNERJOIN SDE.GDB_ITEMTYPES itemtypes
ON items.Type= itemtypes.UUID,
TABLE(XMLSEQUENCE(XMLType(Definition)
.Extract('/GPCodedValueDomain2/CodedValues/CodedValue')))
CodedValues
WHERE itemtypes.Name='Coded Value Domain'
7) Sql 语句创建一个视图V_CLASS_DEFS,得到应用了属性域的所有图层
执行如下sql 语句,创建视图:
createorreplaceview V_CLASS_DEFS
AS
SELECT
sde.gdb_items_vw.NameasName,
XMLType(sde.gdb_items_vw.definition)AS definition
FROM
(
selectdistinct(sde.gdb_itemrelationships.OriginID)from
(
SELECT GDB_ITEMS_VW.UUIDAS UUID
FROM sde.gdb_items_vwINNERJOIN sde.gdb_itemtypes
ON sde.gdb_items_vw.Type= sde.gdb_itemtypes.UUID
WHERE
sde.gdb_itemtypes.NameIN('Coded Value Domain','Range Domain')
)
Domain
INNERJOIN sde.gdb_itemrelationships
ON Domain.UUID= sde.gdb_itemrelationships.DestID
) t_originID
INNERJOIN sde.gdb_items_vw
ON sde.gdb_items_vw.UUID= t_originID.OriginID
8) Sql查询得到图层表的那些字段绑定了属性域
提取所有在图层表上使用属性域的项字段名称,执行如下sql 语句:
SELECT
V_CLASS_DEFS.NameAS "Class Name",
EXTRACTVALUE(fields.Column_Value,'/GPFieldInfoEx/Name')AS "Field Name",
EXTRACTVALUE(fields.Column_Value,'/GPFieldInfoEx/AliasName')AS "AliasName",
EXTRACTVALUE(fields.Column_Value,'/GPFieldInfoEx/FieldType')AS "FieldType",
EXTRACTVALUE(fields.Column_Value,'/GPFieldInfoEx/DomainName') AS "Domain Name"
FROM
V_CLASS_DEFS,
TABLE(XMLSEQUENCE(Extract(V_CLASS_DEFS.definition,'/*/GPFieldInfoExs/GPFieldInfoEx'))) fields
whereEXTRACTVALUE(fields.Column_Value,'/GPFieldInfoEx/DomainName')isnotnull
注意:FieldType类型对应的值有 esriFieldTypeSmallInteger、esriFieldTypeString、esriFieldTypeDouble