摘要:

访问存储在oracle中的ST_Geometry类型数据的SQL函数通过扩展oracle的external procedure agent或者extproc来实现,因此,直接使用这些SQL函数需要配置oracle的listener,让oracle能够找到这些扩展库。如果使用SDE读取这些数据,则不需要配置。

访问存储在oracle中的ST_Geometry类型数据的SQL函数通过扩展oracle的external procedure agent或者extproc来实现,因此,直接使用这些SQL函数需要配置oracle的listener,让oracle能够找到这些扩展库。如果使用SDE读取这些数据,则不需要配置。

 

一、ORACLE 数据库服务器修改

1.1获得ST_Geometry的扩展库(ST_SHAPELIB)

这些对ST_Geometry类型数据进行操作的函数是用PL/SQL实现的,在PL/SQL中其实是转调的使用c语言编写的外部扩展库(ST_SHAPELIB)。

ArcGIS Desktop10.1安装完成后,会将DBMS配置ST_Geometry需要的dll都放在D:\ProgramFiles (x86)\ArcGIS\Desktop10.1\DatabaseSupport\Oracle\下面,比如windows环境可以将里面的st_shapelib.dll拷贝到Oracle服务器端作为外部调用的dll。或者安装了ArcSDE,可以使用D:\ProgramFiles\ArcGIS\ArcSDE\ora11gexe\bin\st_shapelib.dll。第一张图可以看到支持很多系统,以Windows64为例,进入文件夹Windows64,拷贝st_shapelib.dll到Oracle数据库。

我们将st_shapelib.dll拷贝到目录d:\programfiles\arcgis\desktop10.1\DatabaseSupport\Oracle\Windows64\st_shapelib.dll下

1.2配置数据库监听

针对Oracle11g,如果是动态监听,没有listener.ora文件,可以直接修改<ORACLE_HOME>\hs\admin extproc.ora文件来添加外部过程调用。建议采用方法2,用方法1开发环境出现监听启动不了的问题,监听会自动停掉,需重启数据库。

方法1:

在listner.ora文件里SID_LIST_LISTENER项下添加额外的SID_DESC,添加后如下:

在SID_LIST_LISTENER增加以下内容

(SID_DESC =
      (PROGRAM = extproc)
      (ENVS ="EXTPROC_DLLS=ONLY:d:\programfiles\arcgis\desktop10.1\DatabaseSupport\Oracle\Windows64\st_shapelib.dll")
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME =D:\app\Administrator\product\11.2.0\dbhome_1)
    )  
  )

增加

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY =EXTPROC1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST =10.10.128.6)(PORT = 1521))
    )
  )

方法2

针对Oracle11g,如果是动态监听,没有listener.ora文件,可以直接修改<ORACLE_HOME>\hs\adminextproc.ora文件来添加外部过程调用。

 

SET EXTPROC_DLLS=ANY

1.3动态库写入Oracle的libraries包

在安装完sde后,会自动将C:\Progra~2\ArcGIS\Desktop10.1\DatabaseSupport\Oracle\Windows64\st_shapelib.dll动态库写入Oracle的libraries包:

如果是拷贝过来的动态库,可以执行以下命令

create or replace library ST_SHAPELIB
  as 'D:\Program Files\ArcGIS\ desktop10.1\DatabaseSupport\Oracle\Windows64\st_shapelib.dll';
alter package sde.st_geometry_shapelib_pkgcompile reuse settings;

如果注册正常

 

二、客户端配置修改

2.1 修改ORACLE 客户端的tnsnames.ora文件

在11g的tnsnames.ora文件中已经没有了EXTPROC_CONNECTION_DATA服务名,而是用ORACLR_CONNECTION_DATA代替了,而这个ORACLR_CONNECTION_DATA是不能用于配置ST_Geometry的,因此我们需要手动创建EXTPROC_CONNECTION_DATA,添加:

NMGIS =
 (DESCRIPTION =
   (ADDRESS_LIST =
     (ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.128.6)(PORT = 1521))
    )
   (CONNECT_DATA =
     (SERVICE_NAME = nmgis)
    )
  )
 
EXTPROC_CONNECTION_DATA=
 (DESCRIPTION =
   (ADDRESS_LIST=
     (ADDRESS=(PROTOCOL = IPC)(Key=EXTPROC1521))
     (ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.128.6)(PORT = 1521))
    )
  (CONNECT_DATA =
     (SID = PLSExtProc)
     (PRESENTATION=RO)
    )
  )

2.2 测试

1、首先用tsnping命令,检查配置是否正确

2、执行sql

查询金鹰万佳北配电室1#

selectid,name,sde.st_astext(shape)from p_dis_pdzs_p wherename='金鹰万佳北配电室1#';

 

正常结果

 

如果出现如下问题,则表示外部扩展库未获得,需要再次检查监听和libraries包是否包含注册的库:

 

插入线数据如下:我们插入一条电力隧道

insertinto p_fac_pipe_l(OBJECTID,ID,SHAPE,GLOBALID)
VALUES(5,'aaaaaaaabaaaaa',sde.st_geometry('linestring(106.73161167 39.5157,106 39)',4326),'AAbAaA')

 

 

2.3 点、线、多边形数据插入脚本

 

更多脚本,可到Arcgis官方网站查看http://resources.arcgis.com/zh-cn/help/main/10.2/index.html#/na/006z00000050000000/

 

以下脚本需要替换

INSERT INTO GEOMS (id, geometry) VALUES (
1901,
sde.st_geometry ('point (1 2)', 0)
);
 
--To insert the same point using optimizedpoint construction:
INSERT INTO GEOMS (id, geometry) VALUES (
1901,
sde.st_geometry (1,2,null,null,0)
);
 
INSERT INTO GEOMS (id, geometry) VALUES (
1902,
sde.st_geometry ('linestring (33 2, 34 3,35 6)', 0)
);
 
INSERT INTO GEOMS (id, geometry) VALUES (
1903,
sde.st_geometry ('polygon ((3 3, 4 6, 5 3,3 3))', 0)
);