因网上搜索到的相关资料大部分都是关于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查询结果一致。

转载于:https://www.cnblogs.com/telwanggs/p/8440837.html

Oracle 空间查询, 数据类型为 sdo_geometry相关推荐

  1. oracle数据类型查询,Oracle 空间查询, 数据类型为 sdo_geometry

    数据:通过arcgis直连数据库,导入测试数据,导入时数据类型选择SDO_GEOMETRY. 测试数据包含点线面,点数据MAP_USER_POINT, 线数据MAP_USER_LINE,面数据MAP_ ...

  2. oracle空间查询定义,ORACLE SDO_GEOMETRY 空间数据创建查询

    一.Oracle Spatial简介 Oracle 支持自定义的数据类型,可以用数组,结构体或者带有构造函数,功能函数的类来定义自己的对象类型.这样的对象类型可以用于属性列的数据类型,也可以用来创建对 ...

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

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

  4. oracle 经纬度的数据类型,4.2 SDO_GEOMETRY类型、属性和值

    图4-4世界地图的例子,国家的形状和之间的距离都发生了扭曲 怎样才能在没有错误和扭曲的情况下,表示地球表面上的位置呢?在好几个世纪里,这对于很多的地理学家.数学家和发明家都是一个挑战.有好几本书都对这 ...

  5. Oracle Spatial的空间查询,代码操作

    oracle的sdo_geometry中内置get_wkt和get_wkb两个方法. 以数据库表geoms为例,此表中有id和geometry两列 try { OracleConnection con ...

  6. Oracle 语言分类 数据类型 数据类型转换 常用函数 集合操作 子查询

    SQL分类 SQL(Structure Query Language)语言是数据库的核心语言.SQL语言共分为四大类:数据定义语言DDL,数据操纵语言DML,数据查询语言DQL,数据控制语言DCL.1 ...

  7. 表空间oracle查询,Oracle表和表空间查询

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

  8. ArcGIS——数据库空间SQL(一、oracle中使用sql空间查询及st_astext等函数出错问题)

    一.引言 将shp文件导入oracle中就想着直接用sql进行普通查询和空间查询,这样直接通过webserver发布就可以不用arcgis server直接进行接口调用了,感觉这样比较接触底层些,所以 ...

  9. Oracle表空间查询及扩充表空间

    oralce  表空间查询 SQL> select a.tablespace_name,a.bytes / 1024 / 1024 "sum MB",(a.bytes - b ...

最新文章

  1. 繁星代码生成器0.91版 【视频】
  2. 2020 年国外 9 个顶级的 Java 框架,你知道几个?
  3. iOS逆向之深入解析App签名的双向验证机制和原理
  4. 《python 源码剖析》 读后总结(虚拟机综述)
  5. vCenter Converter Standalone使用文档
  6. spark 获取广播变量_spark使用广播变量
  7. ha 配置ssl_haproxy ssl 配置方式-阿里云开发者社区
  8. OAuth2.0认证服务器之客户端相关配置
  9. Spring Boot项目中使用RestTemplate时出现乱码时的解决方案
  10. 如何保养与维护笔记本硬盘
  11. ES6知识整理(2)--变量的解构赋值
  12. [C++项目]C++实现简易的酒店管理系统
  13. macbookwps excel颜色填充快捷键_Excel VBA 实例(31) 为VBA代码自定义快捷键
  14. android 7 sl4a,SL4A 伴随Android7 浴火重生
  15. 怎样设置CCProxy
  16. 一名IT民工开通博客
  17. 机器人轨迹规划(熊友伦)
  18. HyperLynx(十)BoardSim和PCB板级仿真分析(一)
  19. rono在oracle的作用_细节见真章,OPPO Reno多项品质测试,这才是最真实表现
  20. [附源码]java毕业设计旅游网站

热门文章

  1. MapReduce之如何处理失败的task
  2. Spark源码分析之TaskSetManager分析
  3. (88)FPGA乘法器设计(移位相加乘法器)
  4. java centertoscreen_java screen的配置详解及注意事项
  5. stm32f103c8t6 AD DMA连续采集8个通道
  6. C++ 深拷贝和浅拷贝std::move移动构造函数,移动赋值函数
  7. 使用VS2015的Visual Studio Installer打包
  8. win7不显示移动硬盘_win7系统电脑开机不显示桌面?
  9. mysql 表结构监控_性能测试之mysql监控、优化
  10. 三星U-Boot-1.1.6源码分析lowlevel_init.S (board\samsung\smdk6410)