Oracle SQL 查询 ArcSde 属性域数据

Oracle SQL 查询  ArcGIS 10.2 的 sde 属性域数据

1)  项目背景

XXXX GIS 系统想要脱离 ArcGIS 平台,采用 Oracle Spatial 存储空间图层数据(例如:林地小班 ,字段都是英文名称,字段值为编码)

 Oracle SQL 查询 ArcSde 属性域数据_第1张图片

字典代码采用单个的属性表来存储(例如:坡度代码表、林场代码表等)

 Oracle SQL 查询 ArcSde 属性域数据_第2张图片

然后通过运维管理系统,设置图层表的字段对应的代码表,建立起中英文翻译关系。

字典注册说明表:T_DICT_TYPE

                    Oracle SQL 查询 ArcSde 属性域数据_第3张图片                

 

图层字段关联字典代码关系表: T_M_DICT_FIELD

 

Oracle SQL 查询 ArcSde 属性域数据_第4张图片

 

但是现场现在是通过 ArcCatalog工具处理的数据,存储在ArcSde中,又不想再手动

重复执行上面的数据入库流程,所以需要考虑通过程序来实现自动数据导入转换到oracle spatial中,包括图层矢量数据、属性域数据。

    下面介绍的就是怎样通过已 sql语句实现属性域数据的查询。

 

 

2 ) 环境介绍

数据库:       Oracle 11g

GIS 平台:     ArcGIS 10.2

地理数据库 : 采用 ArcCatalog 的 ArcToolbox 创建企业级地理数据库,然后可用 Arccatalog 直连方式连接

 

3 )  创建sde 表空间

采用 ArcCatalog 的 ArcToolbox 地理数据库管理 ->创建企业级地理数据库

 Oracle SQL 查询 ArcSde 属性域数据_第5张图片

创建完 sde 表空间后,建立连接,如下图所示:

Oracle SQL 查询 ArcSde 属性域数据_第6张图片

4)  创建sde 用户下的 属性域

在 sde 表空间下,创建属性域,和向属性域添加编码值,如下图:

Oracle SQL 查询 ArcSde 属性域数据_第7张图片

或者通过 ‘表转属性域’ 浏览一个 excel 文件,来批量创建属性域和编码值,例如:

 Oracle SQL 查询 ArcSde 属性域数据_第8张图片

创建完属性域后,右键点击刚才新建的数据库连接名-> 属性,可查看到属性域列表:

Oracle SQL 查询 ArcSde 属性域数据_第9张图片

5)  给 sde 用户下的空间图层的字段,绑定属性域

 

Oracle SQL 查询 ArcSde 属性域数据_第10张图片

 

 

(二)利用 oracle sql 语句查询前面配置的属性域信息

 

利用 pl/sql 登录sde 库,执行如下sql 语句

 

select * fromsde.gdb_items_vw

 

如果提示执行错误,找不到 dll 库路径,则是因为 sde的 ST_SHAPELIB.dll 文件路径配置不正确,执行 如下sql 语句,查看当前路径

select*from user_libraries

 Oracle SQL 查询 ArcSde 属性域数据_第11张图片

 

如果路径配置不正确,则执行如下操作:

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 文件的引入配置;

 Oracle SQL 查询 ArcSde 属性域数据_第12张图片

C、 打开 E:\oracle11g\product\11.2.0\dbhome_1\hs\admin 目录下的 extproc.ora 文件,添加 dll 文件的引入配置;

Oracle SQL 查询 ArcSde 属性域数据_第13张图片

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 服务和监听服务

Oracle SQL 查询 ArcSde 属性域数据_第14张图片


-----------------------------------------------------------------------------------------------------------------------------------------------------------------------

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'

 Oracle SQL 查询 ArcSde 属性域数据_第15张图片

 

 

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

 

Oracle SQL 查询 ArcSde 属性域数据_第16张图片 

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

 

 Oracle SQL 查询 ArcSde 属性域数据_第17张图片

 

注意:FieldType类型对应的值有 esriFieldTypeSmallIntegeresriFieldTypeStringesriFieldTypeDouble

你可能感兴趣的:(数据库,ArcGIS)