Oracle存储过程结合ST_Geometry实现根据空间关系建立管点管线属性关联
来源:互联网 发布:网络教育课程是啥子 编辑:程序博客网 时间:2024/06/08 11:59
一、问题背景
某客户单位提供了一批管点管线GIS数据,每个管点具有一个点号字段(EXP_NO,字符类型),管线则具有起始管点、终止管点字段(S_EXP、E_EXP,字符类型。只作区分,不具方向性)。
预处理已经为每个管点生成了点号。管线数据在空间上也大多与管点之间是有关联的,即管点刚好位于管线段的起始或终止点位置。
现在需要对每一条管线段数据进行处理,将管线段端点上的管点的点号字段的值取出来,存放到管线段的起始管点、终止管点字段中。
本例中,使用的范围面数据来自pjrnt图层,管线段数据来自图层piplk,管点数据来自图层mhhpt。图中黄色边框红色阴影部分为所使用的范围面(其objectid=641),蓝色线段即为管线段,黄色黑心加点为管点数据。如图可知,管点具有点号值,但管线的起始点号、终止点号均为null。
二、解决思路
1. 选择工作区范围,进行包含查询,得到位于其中的所有管线段。
2. 循环查询结果,取得每一条管线段的起点、终点、OBJECTID。
3. 对起点、终点分别创建一个极小缓冲区。
4. 在缓冲区内进行包含查询,取得位于缓冲区内的管点。
5. 将管点的起点、终点的点号分别保存到管线段的起始点号、终止点号字段中。
三、所需工具
PL/SQL(本例使用SYDXGH用户以管理员身份登录)
Oracle 11g r2(包括服务器端、客户端)
已经配置了ST_Geometry的ArcSDE环境
已经入库的数据
四、实现代码
DECLARE TYPE cur IS REF CURSOR; temp_cursor cur; aShp sydxgh.piplk.shape%TYPE; aOid integer;BEGIN OPEN temp_cursor FOR SELECT t1.shape AS aShp,t1.objectid AS aOid FROM sydxgh.piplk t1 WHERE sde.st_within(t1.shape,(SELECT t2.shape FROM sydxgh.pjrnt t2 WHERE t2.objectid=641))=1; LOOP FETCH temp_cursor INTO aShp,aOid; EXIT WHEN temp_cursor%NOTFOUND; BEGIN UPDATE sydxgh.piplk t2 SET t2.s_exp = (SELECT t.exp_no FROM sydxgh.mhhpt t WHERE sde.st_within(t.shape,(sde.st_buffer(sde.st_startpoint(aShp),0.01)))=1 AND ROWNUM=1), t2.e_exp = (SELECT t.exp_no FROM sydxgh.mhhpt t WHERE sde.st_within(t.shape,(sde.st_buffer(sde.st_endpoint(aShp),0.01)))=1 AND ROWNUM=1) WHERE t2.objectid=aOid; END; END LOOP; CLOSE temp_cursor;END;
代码说明:
DECLAR中声明了一系列后面将要使用的变量,其中temp_cursor为查询位于工程范围面内的所有管线段所使用的游标,使用该游标可以获得每一条管段数据;
aShp是游标中管线段的图形;
aOid是游标中管线段的OBJECTID(用于确定将更新哪条管段的起始终止点号)。
FOR循环部分,逐条取得管线段记录,使用了最简单的st_within查询,含义是查询位于OBJECTID=641的工程范围面内的管线段图层piplk内的数据。
LOOP部分是对FOR循环的每条结果进行处理。
FETCH行,从游标中取出一条记录的aShp和aOid。
BEGIN和END中对查询结果进行更新,其中st_startpoint、st_endpoint可取得管线段的起点和终点,st_buffer方法建立缓冲区(半径为0.01米),外层的st_within方法查询位于缓冲区内的管线点,并取得其点号即exp_no。
执行完毕后结束循环,关闭游标。
结果验证:
提交事务后,我们在ArcMap中检查发现,所有位于工程范围面内的管线段均已正确设置了起始点号、终止点号。
五、思考总结
St_Geometry本身已经集成了强大的空间查询、处理功能,结合Oracle的存储过程,可以通过简单代码实现复杂的空间运算。有时候一些看似需要进行功能开发的需求,利用现成的工具可以方便地达到我们的目的,并且灵活高效。
- Oracle存储过程结合ST_Geometry实现根据空间关系建立管点管线属性关联
- Oracle11g结合ArcGIS10.2建立空间数据库ST_Geometry类库配置问题
- 在使用 ST_Geometry 空间索引时优化 Oracle 查询性能和存储
- 在使用 ST_Geometry 空间索引时优化 Oracle 查询性能和存储
- oracle根据存储过程中内容查找存储过程名
- Oracle 建立存储过程 以及jdbc调用
- Oracle 中存储过程的建立
- ASP.NET调用Oracle分页存储过程并结合ASPnetpager分页控件 实现分页功能
- oracle 更新空间数据存储过程语句
- oracle 更新空间数据存储过程语句
- 利用ST_GEOMETRY实现按辖区对点数据分类
- ORACLE存储过程两个注意点
- Oracle存储过程实现分页
- Oracle存储过程实现分页
- oracle存储过程实现分页
- Oracle 存储过程实现分页
- oracle存储过程实现分页
- oracle存储过程实现分页
- [Unity] 字符风格shader
- 九九表
- 我的第一个Myeclipse下的web项目
- 定义一个图形类及其子类(三角形类和矩形类),分别计算其面积和周长。
- SDN 下用ODL实现QoS保障(6)-基于Java获取拓扑的封装
- Oracle存储过程结合ST_Geometry实现根据空间关系建立管点管线属性关联
- 5.2从键盘任意输入一个整数,并判断它的奇偶性
- C++接受个数不定的template实参
- 在C++中为LUA添加PATH路径(搜索路径)
- 习题6 6.4
- 2017NOIP前言
- 计算5的阶乘
- MyBatis和Hibernate的五大核心接口,区别
- scrapy框架架构