Oracle Spatial详解
转自:https://www.cnblogs.com/frogbag/archive/2007/10/17/926870.html
Step1. 创建一张表,其中shape用来存放空间数据
CREATE TABLE mylake (
feature_id NUMBER PRIMARY KEY,
name VARCHAR2(32),
shape MDSYS.SDO_GEOMETRY);
Step2. 在user_sdo_geom_metadata 表中插入新记录,用于描述空间字段
INSERT INTO user_sdo_geom_metadata VALUES (
'mylake', //---表名
'shape', //---字段名
MDSYS.SDO_DIM_ARRAY(
MDSYS.SDO_DIM_ELEMENT('X', 0, 100, 0.05), //---X维最小,最大值和容忍度。
MDSYS.SDO_DIM_ELEMENT('Y', 0, 100, 0.05) //---Y维最小,最大值和容忍度
),
NULL //---坐标系,缺省为笛卡尔坐标系
);
Step3. 创建空间索引
CREATE INDEX mylake_idx ON mylake(shape)
INDEXTYPE IS MDSYS.SPATIAL_INDEX
Step4. 插入空间数据
Oracle Spatial用MDSYS.SDO_GEOMETRY
来存储空间数据,定义为:CREATE TYPE sdo_geometry AS OBJECT (
SDO_GTYPE NUMBER,
SDO_SRID NUMBER,
SDO_POINT SDO_POINT_TYPE,
SDO_ELEM_INFO MDSYS.SDO_ELEM_INFO_ARRAY,
SDO_ORDINATES MDSYS.SDO_ORDINATE_ARRAY);
SDO_GTYPE:用四个数字定义了所有的形状
第一位:维数
第二位:线性表示。用于3,4维数据,二维为0
最后两位:
Value | Geometry | Description |
---|---|---|
00 |
UNKNOWN_GEOMETRY
|
Spatial ignores this value |
01 |
POINT
|
A single point element |
02 |
LINE or CURVE
|
Contains one line string element that may be linear, curved or both |
03 |
POLYGON
|
Contains one polygon element with or without other polygon elements in it |
04 |
COLLECTION
|
A heterogeneous collection of elements |
05 |
MULTIPOINT
|
Contains one or more points |
06 |
MULTILINE or MULTICURVE
|
Contains one or more line string elements |
07 |
MULTIPOLYGON
|
Contains multiple polygon elements that maybe disjoint |
SDO_SRID:坐标系,NULL为笛卡尔坐标系。
SDO_POINT:Oracle Spatial也可定义单个的点,SDO_POINT的定义:
CREATE TYPE sdo_point_type AS OBJECT (X NUMBER,Y NUMBER,Z NUMBER);
如果是二维,Z为NULL。
SDO_ELEM_INFO:每三个值描述一个元素。
第一个值:第一个顶点在SDO_ORDINATES_ARR开始位置
第二个值:元素类型
第三个值:顶点连接方式:1-通过直线连接,2-通过圆弧连接
定义为
CREATE TYPE sdo_elem_info_array AS VARRAY (1048576) of NUMBER;
SDO_ORDINATES:几何图形所有顶点列表。定义为
CREATE TYPE sdo_ordinate_array AS VARRAY (1048576) of NUMBER;
FONT color=#003366>// 插入包含一个岛屿的湖泊
INSERT INTO mylake VALUES(
10,
'Lake Calhoun',
MDSYS.SDO_GEOMETRY(
2003,
NULL,
NULL,
MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,1, 19,2003,1),
MDSYS.SDO_ORDINATE_ARRAY(0,0, 10,0, 10,10, 0,10, 0,0, 4,4, 6,4, 6,6, 4,6, 4,4)
));
// 插入两艘小船
INSERT INTO mylake VALUES(
11,
'The Windswept',
MDSYS.SDO_GEOMETRY(
2003,
NULL,
NULL,
MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,1),
MDSYS.SDO_ORDINATE_ARRAY(2,2, 3,2, 3,2, 2,3, 2,2)
)
);
INSERT INTO mylake VALUES(
12,
'Blue Crest',
MDSYS.SDO_GEOMETRY(
2003,
NULL,
NULL,
MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,1),
MDSYS.SDO_ORDINATE_ARRAY(7,7, 8,7, 8,7, 7,8, 7,7)
)
);
Step4. 查询
Oracle Spatial查询数据包括二个处理过程:
1.只通过索引查询候选项。通过函数SDO_FILTER实现:
SDO_FILTER(geometry1 MDSYS.SDO_GEOMETRY, geometry2 MDSYS.SDO_GEOMETRY, params VARCHAR2)
geometry1: 必须是被索引的几何数据
geometry2:不一定是表中的空间字段,也不要求被索引
params:Filter类型
querytype=WINDOW:geometry2不要求来自表
querytype=JOIN:geometry2必须来自表
SELECT name boat_name
FROM mylake t
WHERE feature_id = 12
AND SDO_FILTER(t.shape, mdsys.sdo_geometry(2003,NULL,NULL,
mdsys.sdo_elem_info_array(1,1003,1),
mdsys.sdo_ordinate_array(2,2, 5,2, 5,5, 2,5, 2,2)),
'querytype=WINDOW') = 'TRUE';
2.再检查每个候选项是否和条件精确匹配。通过函数SDO_RELATE实现:
SDO_RELATE(geometry1 MDSYS.SDO_GEOMETRY, geometry2 MDSYS.SDO_GEOMETRY, params VARCHAR2)
params:masktype类型
DISJOINT
— the boundaries and interiors do not intersectTOUCH
— the boundaries intersect but the interiors do not intersectOVERLAPBDYDISJOINT
— the interior of one object intersects the boundary and interior of the other object, but the two boundaries do not intersect. This relationship occurs, for example, when a line originates outside a polygon and ends inside that polygon.OVERLAPBDYINTERSECT
— the boundaries and interiors of the two objects intersectEQUAL
— the two objects have the same boundary and interiorCONTAINS
— the interior and boundary of one object is completely contained in the interior of the other objectCOVERS
— the interior of one object is completely contained in the interior of the other object and their boundaries intersectINSIDE
— the opposite ofCONTAINS
.A INSIDE B
impliesB CONTAINS A
.COVEREDBY
— the opposite ofCOVERS
.A COVEREDBY B
impliesB COVERS A
.ON
— the interior and boundary of one object is on the boundary of the other object (and the second object covers the first object). This relationship occurs, for example, when a line is on the boundary of a polygon.ANYINTERACT
— the objects are non-disjoint.// 选择在定义矩形内的所有小船
SELECT name boat_name
FROM mylake t
WHERE feature_id = 12
AND SDO_FILTER(t.shape, mdsys.sdo_geometry(2003,NULL,NULL,
mdsys.sdo_elem_info_array(1,1003,1),
mdsys.sdo_ordinate_array(2,2, 5,2, 5,5, 2,5, 2,2)),
'querytype=WINDOW') = 'TRUE'
AND SDO_RELATE(t.shape, mdsys.sdo_geometry(2003,NULL,NULL,
mdsys.sdo_elem_info_array(1,1003,1),
mdsys.sdo_ordinate_array(2,2, 5,2, 5,5, 2,5, 2,2)),
'masktype=INSIDE querytype=WINDOW') = 'TRUE'// masktype可联合使用
SELECT feature_id id
FROM mylake t
WHERE feature_id = 12
AND SDO_FILTER(t.shape, mdsys.sdo_geometry(2003,NULL,NULL,
mdsys.sdo_elem_info_array(1,1003,1),
mdsys.sdo_ordinate_array(2,2, 5,2, 5,5, 2,5, 2,2)),
'querytype=WINDOW') = 'TRUE'
AND SDO_RELATE(t.shape, mdsys.sdo_geometry(2003,NULL,NULL,
mdsys.sdo_elem_info_array(1,1003,1),
mdsys.sdo_ordinate_array(2,2, 5,2, 5,5, 2,5, 2,2)),
'masktype=INSIDE+TOUCH querytype=WINDOW') = 'TRUE'Oracle Spatial 提供的其他查询函数:
Query Description SDO_NN
Nearest neighbor SDO_SDO_WITHIN_DISTANCE
All geometries with a certain distance Functions Description SDO_GEOM.SDO_MBR
The minimum bounding rectangle for a geometry SDO_GEOM.SDO_DISTANCE
The distance between two geometries SDO_GEOM.SDO_INTERSECTION
Provides the intersection point of two geometries
Oracle Spatial详解相关推荐
- Oracle ASM 详解 收藏
Oracle ASM 详解 ASM:Automatic Storage Management, 是Oracle 主推的一种面向Oracle的存储解决方案, ASM 和 RDBMS 非常相似,ASM 也 ...
- oracle分区表编程,Oracle分区表详解
当前位置:我的异常网» 编程 » Oracle分区表详解 Oracle分区表详解 www.myexceptions.net 网友分享于:2013-10-28 浏览:25次 Oracle分区表详解 ...
- oracle有哪两种内存结构,Oracle体系结构详解(物理构造,内存结构和逻辑结构)...
当前位置:我的异常网» 数据库 » Oracle体系结构详解(物理构造,内存结构和逻辑结构 Oracle体系结构详解(物理构造,内存结构和逻辑结构) www.myexceptions.net 网友分 ...
- Oracle 冷备份详解【实战案例】
Oracle 冷备份详解 --准备工作 select * from v$database; select file_name from dba_data_files; create tablespac ...
- oracle里面asm的作用,Oracle ASM 详解
Oracle ASM 详解 ASM:Automatic Storage Management, 是Oracle 主推的一种面向Oracle的存储解决方案, ASM 和 RDBMS 非常相似,ASM 也 ...
- Oracle 存储过程详解(上)
目录 一.存储过程与存储函数的定义 二.创建 / 执行存储过程所需的权限 1.resource权限 2.create.execute procedure权限 三.创建 / 执行存储过程 四.变量与参数 ...
- Oracle 数据字典详解
Oracle 数据字典详解 什么叫数据字典? 数据字典指的是描述数据的数据. 举个例子:我们在数据库里面创建了一个表,这个表位于哪个数据文件.这个表有哪些列.这个表的每一个列的数据类型.这个表的约束等 ...
- Oracle索引详解(索引的原理,创建索引,删除索引,修改索引等)
Oracle索引详解 一.索引概述 Oracle作为关系型数据库,用户查找数据与行的物理位置无关,表中的每一行均用一个ROWID来标识,当Oracle数据库中存储海量的记录时,就意味着有大量的ROWI ...
- oracle list 分区详解,ORACLE分区表详解
此文从以下几个方面来整理关于分区表的概念及操作:1.表空间及分区表的概念 2.表分区的具体作用 3.表分区的优缺点 4.表分区的几种类型及操作方法 5.对表分区的维护性操作. (1.) 表空间及分区表 ...
- Oracle 体系结构详解
Oracle 体系结构详解 什么是Orcale数据库? Orcale数据库(Oracle DateBase)是一款关系型数据库(这里就不多做介绍了),通常情况下,我们会把承载我们核心数据的系统通称为数 ...
最新文章
- Gradle of Android Example
- Spring注解Annotation
- 推荐算法-聚类-K-MEANS
- docker 运行 php nginx_docker搭建nginx+mysql+php
- 概率论-4.2中心极限定理(待补充)
- python2和python3如何共存,如何安装多版本python python2和python3共存以及pip共存
- 关于PHP默认Expires: Thu, 19 Nov 1981...的故事
- c语言 葬礼分号,其实从C语言用分号结尾开始,就是一个悲剧了……
- ft232h引脚_usb转串口芯片 ft232的奇怪现象
- 二叉树、树和有序树的区别
- matlab实现移动通信的技术,移动通信系统OFDM系统仿真与实现(基于MATLAB)
- Linux安装PHP环境LNMP
- 新型智慧城市顶层规划与设计方案
- 关于Pearson相关性系数、Cosine相似度、欧式距离
- python爬取知乎热门话题及其回答(requests中session保持cookies的应用)
- Intellij (IDEA) 学生认证全流程
- 前端提高篇(十一)JS进阶8函数参数及arguments
- ViKey加密狗对视频文件进行加密
- python-pygame与pymunk-倒塌解压金字塔
- 24点(给出4个1-10的数字,通过加减乘除,得到数字为24就算胜利)
热门文章
- 【OpenGL】室内3D弹球
- WEB前端知识大整合之JS表单验证
- Mac运行ftp报错Error: JAVA_HOME is not defined correctly.
- ybc_art打印艺术字
- 【松果圆桌派】全年线下客流量超4000万,COMMUNE的场景体验式玩法是如何打造的?
- mysql long varchar2_long类型字段转换成varchar2类型
- SqlCommandBuilder 批量更新数据库的怪异问题?
- java美元转换人民币代码,java实现人民币数字转换中文大写的工具实例代码demo分享...
- 读书笔记:《大型网站技术架构:核心原理与案例分析》(李智慧)(一)
- raid缓存策略设置