# 矢量数据中间件

# 相关主题

# ArcSDE中间件

ArcSDE 地理数据库指在关系数据库中以表的形式保存的各种类型的 GIS 数据集的集合,包括了Oracle、SQLServer、DB2等多种企业级数据库。

MapGIS中可配置ArcSDE中间件,直接连接ArcSDE 地理数据库,读取其中的地理空间数据。连接ArcSDE数据库流程如下:

提示:

目前MapGIS 通过ArcSDE中间件仅支持ArcGIS Oracle数据库,SQLServer、DB2等数据库目前暂不支持。

# 安装配置ArcSDE数据库

ArcGIS Oracle数据库的安装配置步骤可参考ArcGIS相关安装部署手册,此处以ArcMap为例,简单讲解ArcGIS Oracle数据库的安装配置方法,其基本流程包括如下六个步骤:

在ArcGIS 中配置Oracle数据库时,需先安装Oracle服务器端、客户端,并在Oracle服务器端初始化实例。具体步骤可参考Oracle数据库官方操作手册。

提示:

ArcGIS 客户端与软件需安装在同一台客户机上,且如果从 32 位 ArcGIS 客户端进行连接,则必须安装 32 位 Oracle 客户端。

(一)、配置Oracle代理

安装Oracle客户端后,还需在 Oracle 中配置 extproc 以访问 ST_Geometry(具体可参考官方手册:https://desktop.arcgis.com/zh-cn/arcmap/latest/manage-data/gdbs-in-oracle/configure-oracle-extproc.htm (opens new window))。

1. 拷贝ArcGIS客户端Oracle版的ST_SHAPELIB.dll文件到 oracle服务端安装路径的bin 目录下(如 E:\oracle11g\product\11.2.0\dbhome_1\BIN);

2. 修改oracle服务端配置文件“\NETWORK\ADMIN\listener.ora”和“\hs\admin\extproc.ora”:

提示:

Windows下有些Oracle服务器端版本安装完后,extproc.ora文件中不存在对EXTPROC_DLLS的设置,此时可以不设置。

3. 利用ArcSDE用户,执行如下SQL语句,创建ST_SHAPELIB library的dll路径(其中,D:\Oracle11\product\11.2.0\dbhome_1为Oracle服务端路径):

create or replace library ST_SHAPELIB as 'D:\Oracle11\product\11.2.0\dbhome_1\BIN\st_shapelib.dll';

4. SDE用户执行如下SQL语句设置ST_SHAPELIB library生效。

alter package sde.st_geometry_shapelib_pkg compile reuse settings;

5. 重启Oracle监听服务(如OracleOraDb11g_home1TNSListener服务)和 Oracle数据库服务(如OracleServiceORCL服务)。

配置Oracle代理成功后,可通过如下方式检验是否成功:

在 Oracle 中,ST_Geometry的 SQL 函数使用通过Oracle的外部过程代理(即extproc)访问的共享库,且必须存在于 Oracle 服务器上。

1. SDE用户执行SQL语句查询user_libraries查看dll 库路径,查看st_shapelib.dll库路径是否为Oracle服务端路径。

select * from user_libraries;

2. 若第一步查询的st_shapelib.dll路径存在,则利用 pl/sql 软件登录SDE用户,执行SQL语句检查Oracle代理配置是否有效:

select * from sde.gdb_items_vw;

如果提示执行失败提示如下错误,则是因为 sde的ST_SHAPELIB.dll 文件路径没有配置或者配置不正确,否则如果执行成功代表外部代理配置成功。

(二)创建企业级地理数据库

1. 启动【创建企业级地理数据库】功能,弹出如下所示对话框:

  • 【数据库平台】:选择Oracle;
  • 【实例】:设置实例信息,格式可为“Oracle服务器IP/实例名”;
  • 【管理员密码】:需输入Oracle服务器实例初始化时sys账户的密码;
  • 【地理数据库管理员】:可单独设置ArcGIS Oracle数据库的用户名及密码信息;
  • 【授权文件】:提供授权企业级 ArcGIS for Server 时创建的密钥代码文件的路径和文件名。

2. 点击"确定"后,可在Oracle服务器端中创建ArcGIS Oracle数据库;

(三)连接Oracle数据库

1. 在MapGIS GDBCatalog节点,点击【添加 连接数据库】,选择Oracle平台,输入实例名及用户名密码信息:

2. 确定后,在MapGIS GDBCatalog节点可显示该数据库信息,用户可在数据库节点进行空间数据创建、转换等操作:

# 创建存储过程

# 功能说明

MapGIS通过ArcSDE中间件访问ArcGIS Oracle数据库时,需要先创建一个存储过程mp_GetRDotNum,该存储过程权限仅限于查询数据表,主要用来辅助查询几何图形信息,不会破坏用户现有数据。

提示:

对于大多数数据,不执行此操作,在MapGIS中也可通过ArcSDE中间件直接读取ArcGIS Oracle数据库。但对于部分特殊的区数据,若不创建此存储过程,会导致在MapGIS中无法显示图形。

# 操作说明

用户可通过PL/SQL等开发工具创建存储过程,下面以Oracle自带的SQL Developer工具为例,讲解存储过程mp_GetRDotNum的创建方法。

1. 启动SQL Developer工具,弹出如下所示对话框:

2. 点击,创建数据库连接,输入连接用户名/密码,主机名,实例名等信息:

3. 点击【连接】后,可创建连接,并新建工作表:

4. 输入如下所示的创建存储过程mp_GetRDotNum的SQL语句,点击执行操作:

CREATE OR REPLACE PROCEDURE mp_GetRDotNum ( v_RingDot IN out blob, tabName IN VARCHAR2, strobjName IN VARCHAR2, objID IN int ) AS
i int;
num binary_integer;
v_SQL VARCHAR2 ( 1024 );
v_SQL2 VARCHAR2 ( 1024 );
v_temp blob;
nOutR int;
nInnR int;
nRing binary_integer;
BEGIN
  v_SQL := 'SELECT sde.ST_NumGeometries(shape), sde.ST_NumInteriorRing(shape) FROM ' || tabName || ' WHERE ' || strobjName || '=' || objID;
EXECUTE IMMEDIATE v_SQL INTO nOutR,nInnR;

nRing := nOutR + nInnR;
dbms_lob.createtemporary ( v_RingDot, true );
v_temp := utl_raw.cast_from_binary_integer ( nRing );
dbms_lob.write ( v_RingDot, length( v_temp ), 1, v_temp );
FOR i IN 0..nRing - 1
LOOP
v_SQL2 := 'SELECT sde.st_numpoints (sde.st_interiorringn (SHAPE, ' || i || ')) FROM ' || tabName || ' WHERE ' || strobjName || '=' || objID;
EXECUTE IMMEDIATE v_SQL2 INTO num;
v_temp := utl_raw.cast_from_binary_integer ( num );
dbms_lob.writeappend ( v_RingDot, length( v_temp ), v_temp );

END LOOP;
END;

此时会在登录用户下(如示例中的sde用户)创建存储过程mp_GetRDotNum

5. 若MapGIS中登录ArcSDE的账户不是该登录账户,需要在其它用户下创建一个公共同义词mp_GetRDotNum来进行访问该存储过程。如下所示,通过SDE账户创建存储过程mp_GetRDotNum,通过SDEREAD账户访问ArcSDE,则需通过SDEREAD执行如下命令:

CREATE OR REPLACE PUBLIC SYNONYM MP_GETRDOTNUM FOR SDEREAD.MP_GETRDOTNUM;
GRANT EXECUTE ON MP_GETRDOTNUM TO PUBLIC;

存储过程mp_GetRDotNum创建成功后,可通过如下两种方式检验是否成功:

(1)软件验证

以SQL Developer工具为例,创建成功后,在过程信息中可看到已成功构建的mp_GetRDotNum表信息。注意,若创建失败,图标会显示异常信息。

提示:

仅创建存储过程的账户登录后,可看到mp_GetRDotNum表信息。

(2)SQL语句验证

可通过查询ArcSDE数据库中某条记录成功与否,来判断存储过程是否创建成功:

以SQL Developer工具为例,可通过输入如下查询语句,若有结果返回,则配置成功。

declare
v_blob blob;
begin
  mp_GetRDotNum(v_blob,'类名','对象ID字段名称','ID号');
end;

其中,‘类名’为ArcSDE中某个区数据的的名称,‘对象ID字段名称’默认为‘OBJECTID’,‘ID’号为‘OBJECTID’中存在的记录值信息。

# 安装配置Oracle客户端

# 功能说明

MapGIS使用跨平台ArcSDE中间件需要安装Oracle客户端, Oracle客户端位数需要和MapGIS软件位数一致。具体Oracle客户端安装步骤可参考Oracle数据库官方操作手册。

# 注册中间件

# 功能说明

在使用ArcGIS Oracle数据库前,需先注册ArcSDE中间件。一般情况下,系统已默认添加,若无,用户可手动添加。

# 操作说明

1. 在MapGIS GDBCatalog面板,启动【客户端配置管理】功能,弹出如下所示对话框:

2. 切换到【中间件】页面,点击【注册】,可通过下拉框选择注册中间件类型;

3. 确定后,即可将该类中间件注册为数据源类型。

# 添加数据源

# 功能说明

注册ArcSDE中间件后,可添加数据源,直接使用其中的空间地理数据。

# 操作说明

1. 在MapGIS GDBCatalog面板,启动【客户端配置管理】功能,弹出如下所示对话框:

2. 切换到【数据源】页面,点击"添加",选择“跨平台ARCSDE”,服务名称为ArcGIS Oracle数据库信息,格式为“Oracle服务器IP/实例名”。

3. 添加成功后,在MapGIS GDBCatalog节点,可看到对应的数据源信息;

4. 连接ArcSDE数据源,输入用户名密码信息,可连接ArcGIS Oracle数据库,读取其中空间地理数据。

# ArcGIS PersonalGDB/FileGDB中间件

ArcGIS PersonalGDB和FileGDB都是通过本地文件地理数据库的形式,存储管理空间地理数据。在MapGIS中,可通过对应的中间件,直接连接并使用ArcGIS PersonalGDB/FileGDB数据。

# 注册中间件

# 功能说明

在使用ArcGIS PersonalGDB/FileGDB数据前,需先注册中间件,一般情况下,系统已默认添加,若无ArcGIS PersonalGDB/FileGDB中间件时,用户可手动添加。

# 操作说明

1. 在MapGIS GDBCatalog面板,启动【客户端配置管理】功能,弹出如下所示对话框:

2. 切换到【中间件】页面,点击【注册】,可通过下拉框选择注册中间件类型;

3. 确定后,即可将该类中间件注册为数据源类型。

# 添加数据源

# 功能说明

注册ArcGIS PersonalGDB/FileGDB中间件后,可添加数据源,附加对应的本地数据库文件,直接使用其中的空间地理数据。

# 操作说明

1. 在MapGIS GDBCatalog面板,启动【客户端配置管理】功能,弹出如下所示对话框:

2. 切换到【数据源】页面,点击"添加",选择“跨平台FileGDB”或“跨平台PersonalGDB”,"确定"后,添加数据源;

3. 添加成功后,在MapGIS GDBCatalog节点,可看到对应的数据源信息;

4. 在数据源节点,右键启动【附加数据库】,可关联本地数据库文件。成功后即可将ArcGIS的FileGDB或PersonalGDB添加为数据库节点。