实用sql 操作Arcgis空间数据

摘要:

访问存储在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)

);


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值