因网上搜索到的相关资料大部分都是关于sdo_geometry的介绍和以及通过sql语句添加要素,查询要素等等。没有找到存储过程相关的例子,所以只好自己动手啦。

准备

环境:windowsxp系统,安装Arcgis 10.1,oracle11g32位,plsql。

数据:通过arcgis直连数据库,导入测试数据,导入时数据类型选择SDO_GEOMETRY。

测试数据包含点线面,点数据MAP_USER_POINT, 线数据MAP_USER_LINE,面数据MAP_USER_POLY。在arcmap中显示如下:

创建存储过程 添加几何要素

创建函数  创建 几何要素

create or replace FUNCTION FUN_CreateGeometry

( wkt IN VARCHAR2

,srid IN NUMBER

) RETURN sdo_geometry AS

BEGIN

RETURN SDO_GEOMETRY(wkt,srid);

END FUN_CreateGeometry;

创建存储过程 向矢量表插入要素

create or replace

PROCEDURE AddNEWPOINT(

OBJECTID IN NUMBER

WKT IN VARCHAR2

,SRID IN NUMBER

) AS

v_Return SDO_GEOMETRY;

BEGIN

v_Return := FUN_CREATEGEOMETRY(

WKT => WKT,

SRID => SRID

);

INSERT INTO MAP_USER_8332(OBJECTID, SHAPE)

VALUES

(OBJECTID, v_Return);

END AddNEWPOINT;

调用存储过程创建几何,注意srid必须一致

Oracle SQL Developter中调用:

DECLARE

OBJECTID NUMBER;

WKT VARCHAR2(200);

SRID NUMBER;

BEGIN

OBJECTID := 100;

WKT := 'POINT (118.731963311458 32.0661417793197) ';

SRID := 4326;

ADDNEWPOINT(OBJECTID, WKT, SRID);

END;

Sql plus中调用:

EXECUTE ADDNEWPOINT(1,’POINT(118 32)’, 4326)

Commit

空间查询

Sql语句给定要素500缓冲区之内的要素,可变部分为输入要素wkt(点,线,面),查询图层,缓存距离,示例如下:

创建包,定义一个cursor

CREATE OR REPLACE

PACKAGE PACKAGE_GEOMETRY AS

TYPE GEOMETRY_CURSOR IS ref cursor;

/* TODO enter package declarations (types, exceptions, methods etc) here */

END PACKAGE_GEOMETRY;

创建存储过程,返回查询结果cursor

create or replace

PROCEDURE SEARCHGEOMETRY(

WKT VARCHAR2

,SRID NUMBER

,buflength VARCHAR2

,p_cursor in out PACKAGE_GEOMETRY.CURSOR_GEOMETRY) AS

srarch_geom SDO_GEOMETRY;

bufferCondition VARCHAR2(35);

BEGIN

srarch_geom := FUN_CREATEGEOMETRY(

WKT => WKT,

SRID => SRID

);

bufferCondition := 'distance=' || buflength;

open p_cursor for SELECT c_c.objectid,c_c.NAME OBJNAME  FROM  MAP_USER_0000008332 c_c

WHERE SDO_WITHIN_DISTANCE(c_c.SHAPE, srarch_geom, bufferCondition) = 'TRUE';

END SEARCHGEOMETRY;

调用存储过程查询要素

Oracle SQL Developter或plSql中调用:

DECLARE

BUFLENGTH VARCHAR2(25);

WKT VARCHAR2(200);

SRID NUMBER;

RESULT_CUR PACKAGE_GEOMETRY.CURSOR_GEOMETRY;

OBJECTID NUMBER;

OBJNAME VARCHAR2(200);

BEGIN

WKT := 'POINT (118.731963311458 32.0661417793197) ';

SRID := 4326;

BUFLENGTH := '500';

SEARCHGEOMETRY(WKT, SRID,BUFLENGTH, RESULT_CUR);

loop

fetch RESULT_CUR

into OBJECTID,OBJNAME;

exit when RESULT_CUR%notfound;

dbms_output.put_line(OBJECTID);

dbms_output.put_line(OBJNAME);

end loop;

CLOSE RESULT_CUR;

END;

空间查询测试

查询点周围500米内的点数据

选取点数据内某一个点获取其wkt坐标:

SELECT CC.SHAPE.GET_WKT() FROM MAP_USER_POINT CC WHERE CC.NAME='湖心花园'

POINT (118.748698730662 32.035395102502)

修改SEARCHGEOMETRY内查询的表名为MAP_USER_POINT,

查询结果:

8

车站小区

9

文体西村

7

蓓蕾小区

11

迎宾村

10

茶亭村

12

湖心花园

19

园中园公寓

Arcmap查询结果:

Plsql查询结果与arcmap查询结果一致。

查询点周围500米内的线数据

选取点数据内某一个点获取其wkt坐标:

SELECT CC.SHAPE.GET_WKT() FROM MAP_USER_POINT CC WHERE CC.NAME='万科金色家园'

POINT (118.759385095746 32.0420345318682)

修改查询参数wkt为’ POINT (118.759385095746 32.0420345318682)’, 修改存储过程SEARCHGEOMETRY内查询的表名为MAP_USER_LINE。

查询结果:

线段2被选中,arcmap中做该点的缓冲区查询,线段2被选中。修改查询缓冲区大小为700米,线段2、3被选中。

Plsql查询结果与arcmap查询结果一致。

查询点周围500米内的面数据

选取点数据内某一个点获取其wkt坐标:

SELECT CC.SHAPE.GET_WKT() FROM MAP_USER_POINT CC WHERE CC.NAME='名湖雅居'

POINT (118.759724313726 32.0354580244683)

修改查询参数wkt为’ POINT (118.759724313726 32.0354580244683)’, 修改存储过程SEARCHGEOMETRY内查询的表名为MAP_USER_POLY。

查询结果:

2
face2
6
face6
7
face7
面2、6、7被选中,arcmap中做该点的500米缓冲区查询,面2、6、7被选中。

Plsql查询结果与arcmap查询结果一致。

查询线周围500米内的点数据

选取线数据内某一条线段获取其wkt坐标:

SELECT CC.SHAPE.GET_WKT() FROM MAP_USER_LINE CC WHERE CC.NAME='line3'

查询所得wkt:

LINESTRING (118.763605759798 32.0391445982447, 118.763755695669 32.0386259340397, 118.763874074329 32.0381089704527, 118.763949962721 32.0377700573423, 118.764039433573 32.0374028695468, 118.764145034666 32.0369562671181, 118.764232941597 32.0365690568166, 118.76430597554 32.0362041074337, 118.764344298351 32.0359930356501, 118.764388237427 32.0357066978059, 118.764487386784 32.0350466349943, 118.764565439843 32.0345753407794, 118.76460084975 32.0343352406788, 118.764633191169 32.0341192388119, 118.764646064065 32.0339927329783, 118.764660872302 32.0337829885941, 118.764663602643 32.0336185295715, 118.764666619869 32.0334691063143, 118.764654318942 32.0330732652191, 118.764633596763 32.032851987929, 118.764589327635 32.0325688795502, 118.764551264729 32.0323638844857, 118.764504484694 32.0321339440263, 118.764435108294 32.0317689748584, 118.764351598148 32.0313420450993, 118.764308733761 32.0311321028643, 118.764242330519 32.0307380145478, 118.76422386474 32.0305728504567)

修改查询参数wkt为上一步查询到的wkt,修改存储过程SEARCHGEOMETRY内查询的表名为MAP_USER_POINT。

查询结果:

5

碧虹苑

6

草根居

22

君园

23

莫愁东寓小区

24

名湖雅居

25

万科金色家园

36

罗廊巷2号小区

37

环宇轩小区

38

中兴新村

39

止马营社区

44

陶李王巷新苑

45

汉中苑物管小区

46

汉中苑物管小区

47

止马村

48

通宇花园

49

韩家苑小区

50

韩家苑小区

在arcmap中通过line3的500米缓冲区查询点要素,查询结果如下图:

Plsql查询结果与arcmap查询结果一致。

查询线周围500米内的线数据

Plsql查询结果与arcmap查询结果一致。

查询线周围500米内的面数据

PLSQL 查询结果:

1
face1
3
face3
6
face6
7
face7

arcmap查询结果如下图:

Plsql查询结果与arcmap查询结果一致。

Oracle 空间查询, 数据类型为 sdo_geometry的更多相关文章

  1. Oracle空间查询 ORA-28595

    可使用数据库管理系统 (DBMS) 的结构化查询语言 (SQL).数据类型和表格式来处理地理数据库或安装了 ST_Geometry 类型的数据库中所存储的信息. 例如,在ArcMap中我们使用&quo ...

  2. Oracle关联查询-数据类型不一致问题 ORA-01722: 无效数字

    一.存在表A和表B,都包含字段user_no,但数据类型不一致,如下: create table A ( user_id varchar2(20), user_no number(12,0), xxx ...

  3. Oracle spatial空间查询的选择度分析

    在上一篇中,我用一个案例演示了对于数值或字符串类型的字段,选择度的计算方法.并证明了当字段值的选择度不同时,将会影响CBO选择最终的执行计划.对于可排序的字段类型,选择度计算模型已经有很多人写博客介绍 ...

  4. oracle 空间大小查询

    一.表空间大小 select b.file_name 物理文件名, b.tablespace_name 表空间, b.bytes / 1024 / 1024 大小M, (b.bytes - sum(n ...

  5. Oracle中查询当前数据库中的所有表空间和对应的数据文件语句命令

    Oracle中查询当前数据库中的所有表空间和对应的数据文件语句命令 ------------------------------------------------------------------ ...

  6. Oracle表和表空间查询

    用户查询 查询和用户相关的数据 创建用户 CREATE USER user IDENTIFIED BY password [DEFAULT TABLESPACE tablespace] [TEMPOR ...

  7. ORACLE表空间查询和管理【转】

    红色是自由指定的~~--查询表空间SELECT D.TABLESPACE_NAME,       SPACE "SUM_SPACE(M)",       SPACE - NVL(F ...

  8. oracle 全部查询和表空间,以及其关系

    select * from dba_users;   查看数据库里面全部用户,前提是你是有dba权限的帐号.如sys,system select * from all_users;     查看你能管 ...

  9. Oracle权限和数据类型

    oracle创建用户: CREATE USER 用户名 IDENTIFIED BY 口令 [ACCOUNT LOCK|UNLOCK] [注]LOCK|UNLOCK创建用户时是否锁定,默认为锁定状态.锁 ...

随机推荐

  1. WCF配置文件与文件下载之坎坷路

    题外话:本以为我会WCF了,精通WCF了,毕竟刚做过一个WCF的项目,不就是写写契约接口,然后实现接口,改下配置.最后用控制台或者服务发布一下,不就能用了.不就是简单ABC吗?不是So Easy吗?做 ...

  2. 小白学习之Code First(二)

    Code First约定: 注:EDMX模板 (SSDL:存储模型=>数据库表 ,CSDL:概念模型=>实体,C-S模型=>存储和概念模型之间的映射关系) System.Data.E ...

  3. java JDBC 数据库链接

    1.准备环境搭建: myeclipse,sql2005,jdbc. 2.都下载完之后开始进行安装 ,前两个是属于数据库软件,正常安装即可(注意数据库登陆不要使用windows验证) <1> ...

  4. [日常] Go语言圣经-WEB服务与习题

    Go语言圣经-web服务 1.Web服务程序,标准库里的方法已经帮我们完成了大量工作 2.main函数将所有发送到/路径下的请求和handler函数关联起来,/开头的请求其实就是所有发送到当前站点上的 ...

  5. MQ与Webservice的区别

    Webservice 和MQ(MessageQueue)都是解决跨平台通信的常用手段,两者有哪些区别呢? 个人认为最本质的区别在于 Webservice近乎实时通信,而MQ却通常是延时通信. 什么意思 ...

  6. 精尽 Kafka 学习指南【优秀学习指南汇总】

    1. 视频 炼石成金 <中间件之 Kafka> 一共有 19P .概念部分讲的蛮细的. 尚硅谷 <大数据视频_Kafka视频教程> 一共 24P .讲的还不错的. 书生小四 & ...

  7. 关于Google圆角高光高宽自适应按钮及其拓展

    关于Google圆角高光高宽自适应按钮及其拓展————源自张鑫旭css讲解 这篇文章发布于 2009年10月24日,星期六,18:08,归类于 css相关. 阅读 48770 次, 今日 1 次 by ...

  8. Spring 、SpringMVC 、Struts2之间的区别

    一.Spring与SpringMVC的区别: spring是一个开源框架,是为了解决企业应用程序开发,功能如下: 功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能 范围:任何Ja ...

  9. Exam E05-001 Information Storage and Management Version 3 Exam

    Emc 考试 e05-001信息存储和管理版本3考试 [总问题:171] 哪种 emc 产品提供软件定义的存储基础架构的自动监视和报告? A. viprSrmB. 斯纳普内C. 阿瓦马尔D. 快速副总 ...

  10. Django之WSGI浅谈

    一.什么是Web框架 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统. 浏览器与服务器之间发起HTTP请求: 1.浏览器发送一 ...