当前位置: 代码迷 >> 综合 >> ArcGIS10.1——配置ST_GEOMETRY
  详细解决方案

ArcGIS10.1——配置ST_GEOMETRY

热度:74   发布时间:2023-12-16 05:18:32.0

    ArcSDE10.1和10在安装配置上有了些变化,在配置ST_Geometry上总体而言原理是一样的,只是方式步骤上稍有变化,这里以SDE10.1 for Oracle11g R2 64位在windows7上为例来进行配置。

 

    ArcGIS Desktop10.1安装完成后,会将DBMS配置ST_Geometry需要的dll都放在D:\Program Files (x86)\ArcGIS\Desktop10.1\DatabaseSupport\Oracle\下面,比如windows环境可以将里面的st_shapelib.dll拷贝到Oracle服务器端作为外部调用的dll。或者安装了ArcSDE,可以使用D:\Program Files\ArcGIS\ArcSDE\ora11gexe\bin\st_shapelib.dll。

 

    在以前我们配置ST_Geometry的时候,需要在监听中配置extproc以调用外部过程,但在11g的tnsnames.ora文件中已经没有了EXTPROC_CONNECTION_DATA服务名,而是用ORACLR_CONNECTION_DATA代替了,而这个ORACLR_CONNECTION_DATA是不能用于配置ST_Geometry的,因此我们需要手动创建,添加:

 

EXTPROC_CONNECTION_DATA =

(DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = IPC)(Key = EXTPROC1))

    )

    (CONNECT_DATA =

      (SID = PLSExtProc)

      (PRESENTATION = RO)

    )

)

 

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

SID_LIST_LISTENER =

  (SID_LIST =

    (SID_DESC =

      (SID_NAME = CLRExtProc)

      (ORACLE_HOME = D:\app\rockylx\product\11.2.0\dbhome_1)

      (PROGRAM = extproc)

      (ENVS = "EXTPROC_DLLS=ONLY:D:\app\rockylx\product\11.2.0\dbhome_1\bin\oraclr11.dll")

    )

    (SID_DESC =

      (SID_NAME = PLSExtProc)

      (ORACLE_HOME = D:\app\rockylx\product\11.2.0\dbhome_1)

      (PROGRAM = extproc)

      (ENVS="EXTPROC_DLLS=ONLY:D:\Program Files\ArcGIS\ArcSDE\ora11gexe\bin\st_shapelib.dll")

 ) 

 

  )

 

重启监听;

Sde用户进入sqlplus,执行SDE.ST_ASTEXT函数以验证ST_Geometry配置成功:

select AREA_ID,NAME,sde.st_astext(shape) as location from sde.hnsite;

 

 

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

 

如果在配置监听的过程中,修改了st_shapelib.dll的路径,需要重新编译这个包,以确保包的实际路径和设置匹配:

create or replace library ST_SHAPELIB
  as 'D:\Program Files\ArcGIS\ArcSDE\ora11gexe\bin\st_shapelib.dll';
alter package sde.st_geometry_shapelib_pkg compile reuse settings;

 

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

SET EXTPROC_DLLS=ONLY:C:\\Progra~2\\ArcGIS\\Desktop10.1\\DatabaseSupport\\Oracle\\Windows64\\st_shapelib.dll

SET EXTPROC_DLLS=ANY

 

配置完成后可以通过sde用户执行如下sql语句验证:

select AREA_ID,NAME,sde.st_astext(shape) as location from sde.hnsite;

 

常常遇到的问题:

1、在执行ST_Geometry函数的时候报错ORA-28575: unable to open RPC connection to external procedure agent

这个问题基本上都是监听配置有问题导致的,盯着Listener.ora文件想办法:

首先在监听启动后确保PLSExtProc这个调用外部进程的服务是正常的

 


LISTENER_GISDB01 =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
      (ADDRESS = (PROTOCOL = TCP)(HOST = zggisdb01-vip)(PORT = 1521)(IP = FIRST))
      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.96.30.66)(PORT = 1521)(IP = FIRST))
    )
  )

SID_LIST_LISTENER_GISDB01 =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = /oracle/db)
      (PROGRAM = extproc)
         (ENVS="EXTPROC_DLLS=/oracle/esrilib/libst_shapelib.so")
    )
   )

注意:如果没有采用默认的监听名字,如LISTENER_GISDB01,那么监听的实例描述一定要一致,即SID_LIST_监听名,否则PLSExtProc无法正常启动。

(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))中的KEY和tnsnames.ora中的Key要一致;

Listener中的SID_NAME和tnsnames中的CONNECT_DATA下的SID_NAME要一致。

 

2、上述问题都解决后,如果还出现ORA-28595: Extproc agent : Invalid DLL Path类似的错误

那就要仔细检查动态链接库了,windows下是st_shapelib.dll,linux下是libst_shapelib.so,确保包的路径是正确的。

在Linux环境下有时候包的依赖不完整,也会导致问题,通过运行ldd  libst_shapelib.so,查看该包的依赖包是否完整。