中南大学测绘与国土信息工程系
Oracle Spatial简介
? Oracle Spatial基本概念
? Oracle Spatial对象关系模式
? 空间索引和空间查询
? 坐标系统
? 线性参考系统
要点
? Oracle Spatial
? Object-Relational Model
? Spatial Data,Attribute Data,Geometry Type
? Data Model
? Coordinate System & Tolerance
? Query Model
? Indexing Spatial data
? R-tree Index
? Quadtree Index
? Spatial Relations & Filtering
? Spatial Aggregate Functions
基本概念
? Oracle Spatial,
实现 OracleDB中空间特征集的存储、检索、修改、查询的一个用户模式和
功能,
? 一个用户模式 MDSYS,该模式规定了支持几何数据类型的存储方式、语
法、语义;
? 两种空间索引方法;
? 一套操作和函数集:使用这些操作和函数完成空间查询、空间连接等
空间分析操作;
? 管理工具集。
Oracle Spatial
? Object-Relational Model
? 关系模型 +部分面向对象机制,
抽象数据类型,SDO_GEOMETRY(含成员、方法函数 )
可变数组,SDO_ORDINATES
嵌入对象
? Oracle Spatial使用这样的表结构来组织和存储空间数据,
除了通常的列之外,还含有类型为 SDO_GEOMETRY类型的列 ;
表中每个记录与一几何体对应,在 SDO_GEOMETRY类型的列中存放
空间位置数据,其它列放置属性数据。
Object-Relational Model
GID SHAPE 属性 _1 …… 属性 _n
SDO_GEOMETRY类型
? Spatial Data,
表示现实或概念对象在其现实或概念空间中存在的位置特征,
地理位置数据(经纬度、高程);
CAD/CAM数据。
? Attribute Data,
现实或概念对象的非空间特征,如:地名、人口、零件号等。
? Geometry Type,
几何体是有序的顶点序列,这些顶点通过直线段和圆弧连接起来,Oracle
Spatial支持如下基本类型几何体,
? 点和点集( Points and point clusters),由两个(二维)或三个
(三维)坐标分量标识位置
? 线串 (Line strings),由多个坐标对定义的直线段
? N边形 (n-point polygons),由多个连接的直线段构成的封闭环,通
常指环内部
? 弧线串( Arc line strings)
Spatial & Attribute Data
Spatial & Attribute Data (续)
不用于测量坐标系
? 弧多边形( Arc polygons)
? 组合多边形( Compound polygons)
? 组合线串( Compound line strings)
? 圆( Circles) 和 优化长方形( Optimized rectangles)
Data Model
? Data Model( 数据模型),
Logical View
Map
S p a t ia l D a t a M o d e l
Layer
Geometry
Element
Point
Line
Polygon
Feature
(homogeneous or
heterogeneous
elements.)
geometries
(having same
attribute set)
Oracle Table
SDO_GEOMETRY
Column
SDO_POINT Or
SDO_ORDINATES
Member
?坐标系统( Coordinate System)
给位置分配坐标并建立坐标间相互关系的方式方法,分类,
? 笛卡尔坐标系( Cartesian);
? 大地坐标系( Geodetic coordinate system)
?容忍量 (Tolerance)
描述空间数据的精度(起取值一般为坐标最低有效位的一半),用法,
? 在图层的元数据定义中使用(视图
xxx_SDO_GEOM_METADATA.DIMINFO.SDO_TOLERANCE);
? 作为空间分析函数(如 SDO_GEOM.SDO_DISTANCE)的输入参数(当不
给出此参数或值为 null时,取元数据中定义的容忍量)。
Coordinate system & Tolerance
大的 Tolerance
小的 Tolerance
?主过滤是基于空间索引的,利用几何体的近似逼近得到满足条件的候选集
?某些应用只需要进行主过滤操作
?查询模型( Query Model)
基于主过滤( Primitive filter)和次过滤 (Secondary filter)的两层
空间查询和空间连接,
? 主过滤,快速、低成本、近似计算,输出是精确结果的超集;
? 次过滤,高成本、精确计算,输出是精确结果。
Query Model
Indexing Spatial data
?空间数据索引方法( Indexing of spatial data)
? 索引:缩短搜索路径的方法。
? 空间索引:索引数据是基于几何体的空间数据生成的,是一种逻辑性索
引。空间索引用于,
窗口查询:在一索引过的数据空间中,找到与给定点或区域相互作
用的对象;
空间连结:在两索引过的数据空间中,找到空间相互作用的对象对

? 两种空间索引方式,R-TREE索引和 QUADTREE索引,对空间数据可选择
使用一种或同时使用两种索引方式
Indexing Spatial data (续)
R-TREE索引 QUADTREE索引
不能调整对几何体的逼近
精度
对几何体的逼近精度可通过调整分片级别和分
片数完成
索引的创建和调整容易 索引的调整复杂,并且调整相应参数会明显影
响性能
需较少的存储空间 需较多的存储空间
用于最近相邻查询操作
( SDO_NN),速度较快
用于最近相邻查询操作( SDO_NN),速度较慢
对空间列的修改和插入操
作而言,性能有较大影响
对空间列的修改操作而言,不影响性能
可以索引到四维( LRS) 只能对两维进行索引
R-tree Index
?R-tree索引
使用一最小的矩形( Minimum bounding rectangle,MBR)逼近一几
何体。对于图层中的几何体,R-tree索引是对层中几何体的 MBR作的一
层次化的索引,
?1到 9是图层中相应几何体的 MBR;
?a,b,c,d是 RTREE树的叶结点,含有所包括的几何
体的 MBR和指向该几何体的指针;即 a含 1,2,b含
3,4,c含 5,6,7,d含 8,9;
?A含 a和 b的 MBR,B含 c和 d的 MBR;
?根结点含 A和 B的 MBR。
R-tree Index( 续)
R-tree索引质量,影响到 R-tree索引的插入和删除操作可能会影响 R-tree结构的
质量,从而可能降低查询的性能。对查询而言,R-tree结构的性能与 R-tree结点
的面积和周长有关。级别 0的面积指的是图层中所有几何体的 MBR的面积,级别 1
的面积指的是 R-tree索引的叶结点的面积,依此类推;随着对图层表的修改,根
结点的面积与级别 0的面积的比值会改变,如果此比值发生明显增加,重建此索
引可能会对查询性能的提高有帮助。
Spatial提供了与几个 R-tree索引质量有关的函数和过程( Oracle9i中新增),
SDO_TUNE.ANALYZE_RTREE:提供是否需重建索引的建议,它计算索引的当前
质量分,并与索引得到重建后的质量分进行比较,从而给出建议;
SDO_TUNE.RTREE_QUALITY,计算索引的当前质量分;
SDO_TUNE.QUALITY_DEGRADATION,返回索引的当前质量退化。
R-tree索引数据存储在空间索引表中(可从 USER_SDO_INDEX_METADATA视图的
SDO_INDEX_TABLE列中看出);为了保证并行用户实现对索引的同时修改,R-
tree索引还维护了一序列发生器(可从 USER_SDO_INDEX_METADATA视图的
SDO_RTREE_SEQ_NAME列中看出)。
Quadtree Index
?Quadtree索引
在线性 quadtree索引方法中,对坐标空间执行一种称之为细化(
tessellation) 的过程。该过程得到各几何体的覆盖小片( tile),生成的
这些小片具有排它性和空间彻底性;细化过程是:首先,沿坐标方向平
分,得到 4个小片,对那些与几何体相交的小片再进行沿坐标方向的平
分,如此进行下去,直到确定的结束准则满足为止:设定的片大小或覆
盖几何体的片的最大数量。细化的结果存储在索引表中。
Spatial可以使用固定大小片( fixed-size tile)或可变大小片
(variable-size tile)来逼近几何体,
固定大小片由片分辨率控制,如果分辨率是唯一的控制因素,则对
坐标空间的细化经过特定的次数后就结束,因此片的大小和形状是固定
的;分辨率可由用户使用参数 SDO_LEVEL设定;
可变大小分片是由片的最大数量控制的,如果每个几何体的片数 n
是唯一的控制因素,当已有 n小片 覆盖几何体时,则细化过程结束; 片
的最大数量可由用户使用参数 SDO _NUMTILES设定。
Quadtree Index( 续)
固定大小片越小或可变大小分片越多,则对几何体的逼近效果越好,否
则逼近越粗。
Spatial支持两种 Quadtree索引类型,
? 固定大小片索引:此时 SDO_LEVEL非零非空,并且 SDO_NUMTILES为
零或为空;
? 混合( hybird)索引,此时 SDO_LEVEL既不为零也不为空,并且
SDO_NUMTILES既不为零也不为空;每个几何体产生两组小片。大多数空间
应用不使用混合索引。
特定细化层次上的片,可按如下方式线性编码( Morton码)排列
Quadtree Index (续)
固定大小片索引的特点,
片的大小相同,片编码长度相同;
可以使用标准 SQL的相等操作符进行片的比较;
索引的有效性和效率取决于分片的级数和图层中几何体的大小变化
程度,如果选择小的分片去逼近小的几何体,则用同样大小的片去逼近较大
几何体时,则需要较多的片;相反,则需要较少的片,但较大的片不能很好
地逼近较小的几何体,索引的选择性就较差。
选择性好 选择性差
Quadtree Index (续)
可以使用 SDO_TUNE.ESTIMATE_TILING_LEVEL函数或 OEM的 Spatial Index
Advisor tool帮助决定分片的级别。
?空间关系和过滤( Spatial relations and filtering)
Oracle Spatial使用次过滤( Secondary filtering)来确定数据库中实体
间的空间关系:基于拓扑和距离
Spatial Relations & Filtering
A,B两空间对象间的距离,A内的点与 B内的
点间距离的最小值。
如果 A,B两对象间的距离小于给定值,则称
A在 B的给定距离内;
要确定空间关系,Oracle Spatial提供了次过滤阶段使用的几个操作符,
SDO_RELATE,测试空间对象间是否存在指定的拓扑关系;
SDO_WITHIN_DISTANCE,测试两空间对象是否相互在给定距离内;
SDO_NN,标识一空间对象的位置最近对象,即从一图层中返回指定数
量的与给定几何体最近的对象。
Spatial Relations & Filtering (续)
SDO_RELATE操作符实现了点、线、多边形间的一 9位二进制正交拓扑关系模
型,假设,
空间对象 A有三个组件,分别为,Ab----A的边界,Ai----A的内部,
Ax----A的外部,则两对象的三个组件间就有九种可能的相交关系。 0表示
组件间相交,1表示组件间不相交。
Spatial Relations & Filtering (续)
常用的拓扑关系,
?DISJOINT,两对象边界不相交,内部也不相
交;
?TOUCH,两对象边界相交,但内部不相交;
?OVERLAPBDYDISJOINT,一个对象的内部与另
一对象的内部和边界相交,但边界不相交;
?OVERLAPBDYINTERSECT,两对象边界相交,
内部也相交;
?EQUAL,两对象具有相同的边界和内部;
?CONTAINS,一个对象的边界和内部完全包含
在另一对象内部;
?COVERS,一个对象的内部完全包含在另一对
象内部,并且边界相交;
Spatial Relations & Filtering (续)
?INSIDE,与 CONTAINS相反,即 A CONTAINS B,意味着 B INSIDES
A;
?COVERBDY,与 COVER相反,即 A COVER B,意味着 B COVERBDY A;
?ON,一个对象的内部和边界在另一对象的边界之上;
?ANYINTERSECT,即 non-disjoint的两个对象。
SDO_WITHIN_DISTANCE操作符判断两对象 A和 B,是否相互间在给定的距离内
,其判断方法为,
在 B的周围建立距离缓冲区 Db,如果 A和 Db是 ANYINTERSECT的,则
SDO_WITHIN_DISTANCE返回 TRUE,否则为 FALSE; 建立缓冲区的方法为,
Spatial Aggregate Functions
?空间聚集函数( Spatial aggregate functions)
?Oracle Spatial聚集函数是对 SQL查询查出的几何对象进行聚集,聚集的
结果还是一类型为 SDO_GEOMETRY类型的几何体,如,
?SDOAGGRTYPE对象类型:许多聚集函数有一类型为 MDSYS.SDOAGGRTYPE的输
入参数,其定义为,
Create type SDOAGGRTYPE as object (
geometry MDSYS.SDO_GEOMETRY,
tolerance NUMBER);
Spatial 对象关系模式
? 举例
? SDO_Geometry Object Type
? GEOMETRY元数据结构
? 索引元数据
? 索引数据表
? 测量单位支持
举例
Oracle Spatial的对象关系实现由如下元素组成,
? 一组对象数据类型(含对象方法);
? 使用上述对象类型的操作符( operators),函数( functions),过
程( procedures)。
? 空间索引的创建和维护也是由 DDL和 DML完成的。
?举例
饮料市场:
cola_a,cola_b,cola_c,cola_d
步骤,
? 创建空间数据表
CREATE TABLE cola_markets (
mkt_id NUMBER PRIMARY KEY,
name VARCHAR2(32),
shape MDSYS.SDO_GEOMETRY);
举例(续)
? 插入空间数据
INSERT INTO cola_markets values(1,’cola_a’,MDSYS.SDO_GEOMETRY(
2003,--SDO_GTYPE=2003,即 2维多边形
NULL,--SDO_SRID,即没有指定坐标系统标识
NULL,--SDO_POINT,非点元素
MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,3),
--SDO_ELEM_INFO(SDO_STARTING_OFFSET,SDO_ETYPE,SDO_INTERPRETATION)
--SDO_STARTING_OFFSET,该元素的第一个坐标位置,这里是 1
--SDO_ETYPE,该元素的类型,这里是多边形( 3)外部( 1)
--SDO_INTERPRETATION,长方形( 3)
MDSYS.SDO_ORDINATE_ARRAY(1,1,5,7)));
--SDO_ORDINATES,坐标序列
INSERT INTO cola_markets values(2,’cola_b’,MDSYS.SDO_GEOMETRY(
2003,NULL,NULL,
MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,1),-- SDO_INTERPRETATION为 1,即多边形
MDSYS.SDO_ORDINATES(5,1,8,1,8,6,5,7,5,1)));
举例(续)
INSERT INTO cola_markets values(3,’cola_c’,MDSYS.SDO_GEOMETRY(
2003,NULL,NULL,
MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,1),-- SDO_INTERPRETATION为 1,即多边形
MDSYS.SDO_ORDINATES(3,3,6,3,6,5,4,5,3,3)));
INSERT INTO cola_markets values(4,’cola_d’,MDSYS.SDO_GEOMETRY(
2003,NULL,NULL,
MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,4),-- SDO_INTERPRETATION为 4,即圆
MDSYS.SDO_ORDINATES(8,7,10,9,8,11)));
? 登记元数据
INSERT INTO USER_SDO_GEOM_METADATA VALUES(‘cola_markets’,’shape’,
MDSYS.SDO_DIM_ARRAY(
MDSYS.SDO_DIM_ELEMENT(‘X’,0,20,0.005),
MDSYS.SDO_DIM_ELEMENT(‘Y’,0,20,0.005)),
NULL --SRID
));
举例(续)
? 创建空间索引
CREATE INDEX cola_spatial_idx ON cola_markets(shape)
INDEXTPE IS MDSYS.SPATIAL_INDEX;
? 空间数据查询
求 cola_a和 cola_c两区域的交集,
SELECT SDO_GEOM.SDO_INTERSECTION(a.shape,c.shape,0.005)
FROM cola_markets a,cola_markets c
WHERE a.name=‘cola_a’ AND c.name=‘cola_c’;
两几何体是否有任意的空间关系,
SELECT SDO_GEOM.SDO_RELATE(b.shape,’anyinteract’,d.shape,0.005)
FROM cola_markets b,cola_markets d
WHERE b.name=‘cola_b’ AND d.name=‘cola_d’;
求几何体的面积,
SELECT name,SDO_GEOM.SDO_AREA(shape,0.005) FROM cola_markets;
举例(续)
求两几何体间的距离,
SELECT SDO_GEOM.SDO_DISTANCE(b.shape,d.shape,0.005)
FROM cola_markets b,cola_markets d WHERE b.name=‘cola_b’ AND d.name=‘cola_d’;
检查几何体是否有效,
SELECT name,SDO_GEOM.VALIDATE_GEOMETRY(shape,0.005) FROM cola_markets;
检查图层是否有效,
CREATE TABLE validate_results (mkt_id NUMBER,results VARCHAR2(10));
EXECUTE SDO_GEOM.VALIDATE_LAYER(‘cola_markets’,’shape’,’mkt_id’,
‘validate_results’);
SELECT * FROM validate_results;
SDO_GEOMETRY对象类型
?SDO_GEOMETRY对象类型
在图层表中用 SDO_GEOMETRY类型的列存储对象的空间数据,该类型的定义为,
CREATE TYPE SDO_GEOMETRY AS OBJECT (
SDO_GTYPE NUMBER,--标识几何体类型
SDO_SRID NUMBER,--标识坐标系统
SDO_POINT MDSYS.SDO_POINT_TYPE,--仅用与点几何体
SDO_ELEM_INFO MDSYS.SDO_ELEM_INFO_ARRAY,--
SDO_ORDINATES MDSYS.SDO_ORDINATE_ARRAY); --
此外,SDO_GEOMETRY还有一些方法函数。
? SDO_GTYPE:几何体类型,有 4位数字构成,格式为 dltt,
d:标识维数,可能的取值为 2,3,4;
l:标识一三维线状参考系统( Linear referencing system,LRS)几何体
的 LRS度量维,即哪一维含度量值( measure value),可能的取值为 3,4,对
于非 LRS几何体或者以 ORACLE SPATIAL默认的最后一维为 LRS度量维,则 l取值
为 0;
SDO_GEOMETRY对象类型(续)
tt:标识几何体的类型,有效值为 00至 07。
如下为有效的 SDO_GTYPE值,
值 几何体类型 描述
dl00 UNKNOW_GEOMETRY Oracle Spatial忽略该几何体数据
dl01 POINT 该几何体为一个点
dl02 LINE or CURVE 该几何体为一线串(线串中的段可以为直线段也可
以为弧线断
dl03 POLYGON 该几何体为一多边形,该多边形可有洞也可没有
dl04 COLLECTION 是元素的集合,其中的元素只要是非 COLLECTION
类型的即可
dl05 MULTIPOINT 含一个或多个点的几何体
dl06 MULTILINE or MULTICURVE 含一个或多个线串的几何体
dl07 MULTIPOLYGON 多个 DISJOINT的多边形
此外,一图层中,各几何体的维数必须相同; SDO_GEOMETRY类型提供了 GET_DIMS、
GET_LRS_DIM,GET_GTYPE方法函数得到几何体的 SDO_GTYPE信息。
SDO_GEOMETRY对象类型(续)
? SDO_SRID,标识几何体所关联的坐标系统
如果 SDO_SRID非空,则该值必须来自于 MDSYS.CS_SRS的 SRID列,并且这样的值必须插入到
USER_SDO_GEOM_METADATA视图的 SRID列中,一图层中,各几何体的 SRID值必须相同。
? SDO_POINT,具有数值型成员 X,Y,Z的对象类型
如果 SDO_ELEM_INFO和 SDO_ORDINATES均为 NULL,而 X,Y,Z不为 NULL,则 Spatial将其用
作点几何体的坐标;否则 Spatial忽略 SDO_POINT属性。当图层中全部为点几何体时,建
议使用 SDO_POINT存储坐标数据,而不用 SDO_ELEM_INFO和 SDO_ORDINATES,以得到优化的
性能。
? SDO_ELEM_INFO,是一变长的数值型数组,其用途是该属性给出了
SDO_ORDINATES中坐标的解释方式。 SDO_ELEM_INFO数组中,每三个数值为
一组,用于解释一个元素 (ELEMENT),组中的数值的意义为,
SDO_STARTING_OFFSET:第一个数值,存放该元素的首坐标在
SDO_ORDIANTES中的位置 (从 1开始计 );
SDO_GEOMETRY对象类型(续)
SDO_ETYPE:第二个数值,标识元素的类型,当 SDO_ETYPE取值为,
1,2,1003,2003时,表示该元素是一简单元素,其定义由 SDO_ELEM_INFO中
的一三数值组给出 ;1003表示为多边型环的外部 (坐标按逆时针顺序给出 ),2003表示
为多边型环的内部 (坐标按顺时针顺序给出 );
4,1005,2005时,表示该元素是一组合元素,其定义由 SDO_ELEM_INFO中的
多个三数值组给出,其中第一个三数值组为头三元组; ;1003表示为多边型环的外
部 (坐标按逆时针顺序给出 ),2003表示为多边型环的内部 (坐标按顺时针顺序给出 );
组合元素的子元素是连续的,即子元素的最后一个点是下一元素的第一个点,在
SDO_ORDINATES中无需重复列出点坐标 ;
SDO_INTERPRTATION,
如果 SDO_ETYPE 为 4,1005,2005,则 SDO_INTERPRTATION 规定其后有多少三
数值组用于解释子元素;
如果 SDO_ETYPE 为 1,2,1003,2003,则 SDO_INTERPRTATION 规定该元素的坐
标序列是如何解释的;
SDO_GEOMETRY对象类型(续)
SDO_ETYPE SDO_INTERPRETATION 含义
0 * 非 Oracle Spatial支持的几何类型
1 1 点
1 >1 点集
2 1 直线串
2 2 弧线串 (弧线由起止点及弧上任一点坐标给出,弧线的交点坐标只出现一次 )
1003/2003 1 顶点间通过直线段连成的多边形 (起止顶点坐标相同 )
1003/2003 2 由弧线段连成的封闭图形 (起止顶点坐标相同 )
1003/2003 3 长方形 (由左下角和右上角点坐标给出 ),本类型不用于地理数据
1003/2003 4 圆 (由圆上任意三个点坐标给出 )
4 n>1 同时含直线串和弧线串的线串,n表示这些子线串的个数,即还有 n个
(SDO_STARTING_OFFSET,SDO_ETYPE,SDO_INTERPRETATION)元组定义这些子
元素
1005/2005 n>1 同时含直线串和弧线串的多边形,n表示这些子线串的个数,即还有 n个
(SDO_STARTING_OFFSET,SDO_ETYPE,SDO_INTERPRETATION)元组定义这些子

SDO_GEOMETRY对象类型(续)
? SDO_ORDINATES:变长的数值型数组,用于存放几何对象的点的坐标值
坐标的组织方式由 SDO_ELEM_INFO解释 ; 点坐标维顺序相同,即 X,Y,Z,X,Y,Z,… 坐标分
量不能为空
SDO_GEOMETRY对象类型(续)
GEOMETRY元数据结构
?GEOMETRY元数据结构
MDSYS.SDO_GEOM_METADATA_TABLE table,
ALL_SDO_GEOM_METADATA view
USER_SDO_GEOM_METADATA view
DBA_SDO_GEOM_METADATA view
索引元数据
?索引元数据
索引元数据视图 (用户只读 ),即有关空间索引的描述
索引基本信息视图, 索引详细信息视图,
ALL_SDO_INDEX_INFO view ALL_SDO_INDEX_METADATA view
USER_SDO_INDEX_INFO view USER_SDO_INDEX_METADATA view
DBA_SDO_INDEX_INFO view DBA_SDO_INDEX_METADATA view
xxx_SDO_INDEX_INFO,
INDEX_NAME TABLE_NAME COLUMN_NAME SDO_INDEX_TYPE SDO_INDEX_TABLE
索引元数据 (续)
xxx_SDO_INDEX_METADATA,
一般信息, 属主、索引名、索引表名、索引类型、是否是分
区的索引、索引分区名、索引表的模式名、索引列名、索引列维
数, 图层的类型、创建索引时提交记录的间隔数 ;
R-tree索引信息,树高度、树节点数、索引维数、节点的最
大子节点数、根节点的 ROWID,与此索引相关的序列名、索引节点
中保留空间的最小百分数( PCTFREE);
Quadtree索引信息,SDO_LEVEL,SDO_NUMTILES,
SDO_MAXLEVEL;
索引表的存储信息,表空间、开始盘区大小、下一盘区大小
、盘区大小增长率、最小盘区数、最大盘区数。
索引数据表
?空间索引数据表
? R-tree索引
列名 类型 内容
NODE_ID NUMBER R-tree树中此节点的唯一标识号
NODE_LEVEL NUMBER 节点在树中的层次,叶节点层次为 1
INFO BLOB 节点的其它数据,包括由 (child_mbr,child_rowid)对构成的数组
? Quadtree索引
列名 类型 内容
SDO_CODE RAW 由 SDO_ROWID标识的对象的索引项,即 索引片号
SDO_ROWID ROWID 对象所在图层中的 ROWID
SDO_STATUS VARCHAR2 索引片与对象的关系,‘ I’,在对象内; ‘ B’,在边界上
SDO_GROUPCODE RAW 使用混合索引时,该片所处在 SDO_LEVEL级上的父索引片号
测量单位支持
?测量单位支持
涉及几何测量的函数,都有一可选的参数用来规定进行距离或面积计算
时所用的计量单位。缺省的计量单位是几何体坐标定义中所使用的单位
,如米或平方米。格式,
长度,‘ unit=<unit_name>’
其中,unit_name的值必须来自于表,MDSYS.SDO_DIST_UNITS;
面积,‘ unit=<unit_name>’
其中,unit_name的值必须来自于表,MDSYS.SDO_AREA_UNITS
索引和查询空间数据
?创建空间索引
?查询空间数据
?空间连接
创建空间索引
?创建空间索引
为了有效地存取空间数据,必须创建空间索引,R-tree索引或
Quadtree索引。如果因任何理由,索引没有完全创建,必须使用,
DROP INDEX <index-name> FORCE;
清除此不完全索引。
? 创建 R-tree索引
在创建空间索引的语句中,如果没有任何 Quadtree使用的参数,
Oracle Spatial创建的是 R-tree索引,如,
CREATE INDEX territory_idx ON territories(geom)
INDEXTYPE IS MDSYS.SPATIAL_INDEX;
?如果回滚段不足够大,创建 R-tree索引可能会失败,回滚段大小 >=100*记录行数 ;
?系统参数 SORT_AREA_SIZE(规定用于排序操作的空间大小 )影响创建索引所需的时间,Oracle
Spatial建议 SORT_AREA_SIZE>=1M,ALTER SESSION SET SORT_AREA_SIZE=1000000;
?可用 tablespace关键字规定索引表所在的表空间,该表空间既用于存放索引数据,又用于创建
索引时产生的临时数据 (索引创建后自动释放 ),它们的大小为, 索引表大小约, 70*n; 临时
数据大小约,200*n 其中,n为记录行数
创建空间索引(续)
? 创建 Quadtree索引(不能用于地理测量)
对于 Quadtree索引,CREATE INDEX语句中的 SDO_LEVEL和 SDO_NUMTILES
参数决定了索引创建和维护的分片算法,
SDO_LEVEL SDO_NUMTILES 索引类型
NULL或 0 NULL或 0 B-tree
>=1 NULL或 0 固定大小片 Quadtree
>=1 >=1 混合大小片 Quadtree
NULL或 0 >=1 不支持
?在默认情况下,当对图层中所有几何体完成分片操作后,Oracle Spatail进行数据库提交操作,
这可能会需要一很大的回滚段 ;可通过规定 CREATE INDEX语句中的 SDO_COMMIT_INTERVAL参数设
置提交操作的间隔 ;
?只有那些在几何体内或在几何体边界上的片才记录在空间索引数据表中 ;
?SDO_LEVEL对 固定大小片 Quadtree片大小的影响,
索引片在一维上的长度为,Length=(upper_bound-low_bound)/2n 其中 n=SDO_LEVEL
?限制数据的几何类型
在创建或重建空间索引时,可以限制图层中的几何体必须为某特定类型其方法是,在
CREATE INDEX或 ALTER INDEX REBUILD语句中规定 layer_gtype参数,参数可能的值为:
POINT,MULTIPOINT,LINE,MULTILINE,CURVE,MULTICURVE,POLYGON,MULTIPOLYGON、
COLLECTION
创建空间索引(续)
SDO_LEVEL=1 SDO_LEVEL=2 SDO_LEVEL=3 SDO_LEVEL=n
TILES=2*2 TILES=22*22 TILES=23*23 TILES=2n*2n
创建空间索引(续)
? 使用分区的空间索引
可以在分区的表上创建分区的空间索引,其好处是:减少响应时间、容
易维护索引。
对于分区空间索引存在如下限制,
图层表的分区键必须是简单类型,不能是 SDO_GEOMETRY列 ;
分区类型必须是范围 (RANGE)分区,不能是散列 (hash)分区或组合
(composite)分区 ;
不支持分区的合并 (merging),交换 (exchanging)和从就分区中分离
(splitting)出新分区。
空间分区的创建方法,使用 LOCAL关键字,
CREATE INDEX counties_idx ON COUNTIES(geometry)
INDEXTYPE IS MDSYS.SPATIAL_INDEX LOCAL ; --在默认表空间中建空间索引
创建空间索引(续)
还可以为各空间索引分区指定不同的存储参数,但各分区的空间索引参
数必须相同,格式为,
ID … GEOMETRY
… … …
ID … GEOMETRY
… … …
ID … GEOMETRY
… … …
P1(ID<10000)
P2(ID<20000)
P3
COUNTIES
NODE_ID … INFO
… … …
P1(ID<10000)
P2(ID<20000)
P3
COUNTIES_IDX_RT$
NODE_ID … INFO
… … …
NODE_ID … INFO
… … …
创建空间索引(续)
缺省的分区参数
不管图层是否分区,除了 SDO_NN操作之外,其它的操作符和函数都具有相
同的语义。
查询空间数据
?查询空间数据
?基于主次过滤的查询模型
?空间查询
分片法索引的重要特点:排它性( exclusion):各索引片间不重叠
空间彻底性( exhaustion):索引片完全覆盖了几何对象
查询窗口
(动态或静态的)
查询空间数据(续)
?主过滤( Primary Filter)操作,SDO_FILTER
SDO_FILTER操作符仅使用空间索引数据生成主过滤的候选记录集,语法
格式,
SDO_FILTER(geometry1 MDSYS.SDO_GEOMETRY,
geometry2 MDSYS.SDO_GEOMETRY,params VARCHAR2)
其中,
geometry1是图层中的已建立空间索引几何对象列 ;
geometry2是几何对象,它可以来自于图层,也可以动态创建,可以是索引过的,也可不是 ;
params定义本操作符的过滤准则,querytype=window|join idxtab1=<… > idxtab2=<… >
例, 返回结果是 1013,1243,12,501
动态查询窗,用 SDO_GEOMETRY构造器在内存中创建和索引
查询空间数据(续)
动态查询窗,创建在绑定变量中
静态查询窗,在另一图层中
查询空间数据(续)
当使用静态查询窗时,空间索引的使用方式为,
对 B是否有空间索引

否 在内存中创建
B有与 A的 SDO_LEVEL
值相同的空间索引?


利用此索引

查询空间数据(续)
?主次过滤( Primary and Secondary Filter)操作,SDO_RELATE
SDO_RELATE操作符完成主过滤和次过滤两个过程,语法格式,
SDO_FILTER(geometry1 MDSYS.SDO_GEOMETRY,
geometry2 MDSYS.SDO_GEOMETRY,params VARCHAR2)
其中,
geometry1是图层中的已建立空间索引几何对象列 ;
geometry2是几何对象,它可以来自于图层,也可以动态创建,可以是索引过的,也可不是 ;
params定义本操作符的过滤准则,querytype=window|join idxtab1=<… > idxtab2=<… >
mask=<拓扑关系组合 >
例, 返回结果是 1013,1243
查询空间数据(续)
当使用静态查询窗时,空间索引的使用方式与 SDO_FILTER操作相同,
查询空间数据(续)
?给定距离范围( Within Distance)操作,SDO_WITHIN_DISTANCE
返回落在给定几何体距离范围内的几何体,不适用于空间连接查询。语
法格式,
SDO_WITHIN_DISTANCE(geometry1 MDSYS.SDO_GEOMETRY,
aGeom MDSYS.SDO_GEOMETRY,params VARCHAR2)
其中,
geometry1是图层中的已建立空间索引几何对象列 ;
geometry2是几何对象,它可以来自于图层,也可以动态创建,可以是索引过的,也可不是 ;
params定义本操作符的过滤准则,distance=<number> dxtb1=<… > querytype=‘FILTER’
unit=<长度单位 >
例,
查询空间数据(续)
?最近邻( Nearest Neighbour)操作,SDO_NN
确定与给定几何体距离最近的几何对象。语法格式,
SDO_NN(geometry1 MDSYS.SDO_GEOMETRY,
geometry2 MDSYS.SDO_GEOMETRY,
params VARCHAR2 [,number NUMBER])
其中,
geometry1是图层中的已建立空间索引几何对象列 ;
geometry2是几何对象,它可以来自于图层,也可以动态创建,可以是索引过的,也可不是 ;
params定义本操作符返回的最近邻对象个数,sdo_batch_size=<number>
sdo_num_res=<number> unit=<长度单位 >(与 SDO_NN_DISTANCE操作结合使用 )
number是与 SDO_NN_DISTANCE一起使用的参数。
例,
空间连接
?空间连接( Spatial Join)
ID … SHAPE
1 … Loc1
2 … Loc2
… … …
n … Locn
A Layer
GEOM … ID
Loc1 … 1
Loc2 … 2
… … …
Locn … n
B Layer A Feaure
WINDOWN QUERY Spatial Join
空间连接(续)
?对于窗口查询,分析的是一图层的对象与一几何对象的拓扑关系;空
间连接则是图层对图层的对象间的拓扑关系
?对于窗口查询,选定的空间对象可以是没有空间索引的;参与空间连
接的图层必须有相同类型的空间索引,如果是 Quadtree,还必须具有相
同的 SDO_LEVEL
例,基于主过滤 SDO_FILTER的空间连接,
SELECT A.gid,B.gid FROM parks A,highways B
WHERE SDO_FILTER(A.shape,B.shape,’querytype=join’)=‘TRUE’;
基于主次过滤 SDO_RELATE的空间连接,
SELECT A.gid,B.gid FROM parks A,highways B
WHERE SDO_RELATE(A.shape,B.shape,’mask=ANYINTERACT querytype=join’)=‘TRUE’;
坐标系统
?概念
?坐标系统数据结构
?创建自定义坐标系统
?坐标系统转换函数
概念
?概念
?坐标系统 (Coordinate System)
即,给位置分配坐标和建立这些坐标间相互关系的方法。它使得将坐标解
释为现实世界中位置成为可能。
分类,
笛卡尔坐标( Cartesian Coordiantes):使用过原点的正交轴定义;
测量坐标系( Geodetic Coordinates,即地理坐标):通过特定的地
球测量基准定义,类似于球坐标。用角度标识位置;
投影坐标( Projected Coordinates),将地球表面的点影射到一平面
上得到的笛卡尔坐标;
局部坐标( Local Coordinates),笛卡尔坐标。
测量基准( Geodetic datum)
用于表示地球形状(通常是旋转的扁平椭球)的方法,该方法局部或
全部逼近地球表面
坐标转换( Transformation)
将一种坐标系统下的坐标转化为另一坐标系下的坐标。
坐标系统数据结构
?坐标系统数据结构
?规定有效坐标系统 (MDSYS.CS_SRS)
列 类型 意义
CS_NAME VARCHAR2(68) 坐标系统名称
SRID INTEGER 坐标系统标识号
AUTH_SRID INTEGER 坐标系统来源标识 (Optional)
AUTH_NAME VARCHAR2(256) 坐标系统的权威名称
WKTEXT VARCHAR2(2046) 符合 OpenGis协会规定的 SRS定义
CS_BOUNDS MDSYS.SDO_GEOMETRY NULL
?角度单位 (MDSYS.SDO_ANGLE_UNITS)
列 类型 意义
SDO_UNIT VARCHAR2(32) 保留
UNIT_NAME VARCHAR2(100) 角度单位名称
CONVERSION_FACTOR NUMBER 1单位角度相当的弧度数
坐标系统数据结构(续)
?长度单位 (MDSYS.SDO_DIST_UNITS)
列 类型 意义
SDO_UNIT VARCHAR2 长度单位名称
UNIT_NAME VARCHAR2 长度单位描述
CONVERSION_FACTOR NUMBER 1单位角度相当的米数
?基准 (MDSYS.SDO_DATUMS)
列 类型 意义
NAME VARCHAR2(64) 基准名称
SHIFT_X NUMBER 相对于 WGS84椭球,X轴方向偏移量
SHIFT_Y NUMBER 相对于 WGS84椭球,Y轴方向偏移量
SHIFT_Z NUMBER 相对于 WGS84椭球,Z轴方向偏移量
ROTATE_X NUMBER X轴方向旋转秒数
ROTATE_Y NUMBER Y轴方向旋转秒数
ROTATE_Z NUMBER Z轴方向旋转秒数
SCALE_ADJUST NUMBER 移动和旋转后,用于对 X,Y,X进行调整的值
坐标系统数据结构(续)
?椭球 (MDSYS.SDO_ELLIPSOIDS)
列 类型 意义
NAME VARCHAR2( 64) 椭球名称
SEMI_MAYOR_AXIS NUMBER 长轴半径,单位是米
INVERSE_FLATTENING NUMBER 扁率
?投影 (MDSYS.SDO_PROJECTIONS)
列 类型 意义
NAME VARCHAR2(64) 投影名称
创建自定义坐标系统
?创建自定义坐标系统
通过在 MDSYS.CS_SRS表中加入一行记录,来创建自定义坐标,要求
该记录满足 OpenGis规范要求的 WKTEXT,定义此 WKTEXT时,
在规定角度单位部分,使用 MDSYS.SDO_ANGLE_UNITS表中的值 ;
在规定长度单位部分,使用 MDSYS.SDO_DIST_UNITS表中的值 ;
在规定基准部分,使用 MDSYS.SDO_DATUMS表中的值或自定义的
基准 ;
在规定椭球部分,使用 MDSYS.SDO_ELLIPSOIDS表中的值 ;
在规定投影部分,使用 MDSYS.SDO_PROJECTIONS表中的值。
坐标系统转换函数
?坐标系统转换函数
SDO_CS.TRANSFORM:将一坐标系统下的几何体转换为另一坐标系统
下的几何体 ;
SDO_CS.TRANSFORM_LAYER:将一坐标系统下的图层转换为另一坐标
系统下的图层 ;
SDO_CS.VIEWPORT_TRANSFORM:将一矩行转换为一地理多边行。
线性参照系统
?概念
?LRS数据模型
?LRS空间索引
?LRS操作
概念
线性参考系统 (Linear Referencing System,LRS)是将属性与线特征相关
联的方法,广泛用于交通和传输设施应用系统 (如,公路、铁路、输油管、燃
气管路等)。其优点是能通过一个参数(即其度量,measure) 而不是二个
,来沿着线特征进行定位。在 Oracle Spatial中线的度量信息直接体现在
Oracle Spatial的数据结构中。
?概念
?几何段(即 LRS segment,也就是 LRS基本元素 ),有如下几种类型,
线串( Line string),顺序排列的、无分支的、连续的,如道路;
多线串 (Multiline string),不连接的线串,如由湖泊隔开的高速公
路;
多边形( Polygon),如环形跑道。
每个几何段至少具有起点和终点的度量 (measure),也可以在几何段的被关
注的点上分配度量
概念(续)
?形状点( shape points)
即分配了度量信息的点,这些点用于定义几何段 。使用形状
点有两个目的,
指明几何段的方向
标识需关注度量信息的点
使用 SDO_LRS.DEFINE_GEOM_SEGMENT过程定义几何段,自动生
成形状点的度量信息。
概念(续)
?几何段的方向( Direction of a geometric segment)
从几何段的起点沿几何段到几何段的终点定义为几何段的方
向。沿着几何段的方向,度量值要么递增要么递减。
?度量( measure,linear measure)
在几何段上的点的度量是其距起点或终点沿该几何段的线性
距离( linear distance)。 不要求度量与实际距离之间保持线性
关系;但要求保持一定的影射关系。
?偏离量( offset)
点的偏离量是:沿着一几何段,该点到此几何段的垂直距离;沿着一几何段方向,如果该点在左側,则偏离量为正值,否则
为负值(几何段上的点,其偏离量为零)。
偏离量的单位与几何段所在的坐标系统使用的单位相同。
概念(续)
?度量信息传递( measure populating)
几何段上的任何度量信息都可以通过基于距离的分布自动传递,
根据点的前一点和后一点(
不是几何段的起点和终点)
的度量数据及次点在几何段
上位置自动分配其度量值
概念(续)
度量信息不必反映实际的距离,甚至不必正比与距离,
概念(续)
?几何段的度量范围( RANGE)
几何段的起点和终点度量值定义了该几何段的度量范围。此
几何段上所有点的度量值必须落在此范围内。
?投影( Projection)
一点沿着一几何段的投影是此几何段上距离此点最近的点。
显然,点和其投影点具有相同的度量值。
?LRS点(具有度量信息的点)、线性特征( Linear feature)
LRS数据模型
?LRS数据模型
Oracle Spatial在点的级别上将度量信息作为一数据维加进了
几何体的表达中。该维必须在 Oracle Spatial元数据中作为最后
一维进行说明。如,
INSERT INTO USER_SDO_GEOM_METADATA
VALUES(‘LRS_ROUTES’,’GEOMETRY’,
MDSYS.SDO_DIM_ARRAY(
MDSYS.SDO_DIM_ELEMENT(‘X’,0,100,0,005),
MDSYS.SDO_DIM_ELEMENT(‘Y’,0,100,0.005),
MDSYS.SDO_DIM_ELEMENT(‘M’,0,100,0,005)),
NULL);
形状点( Shape points)
LRS空间索引
?LRS空间索引
对 Quadtree索引,只使用头两维数据作索引 ;
对 R-tree索引,必须在 CREATE INDEX语句中使用 SDO_INDEX_DIMS关
键字规定度量维不参与索引 ;因为在默认情况下,Oracle Spatial
使用所有维进行 R-tree索引的创建,如果是 LRS数据,包含度量维的
R-tree索引不会带来任何益处,相反会增加处理的负担
LRS操作
?LRS操作
?定义一几何段,SDO_LRS.DEFINE_GEOM_SEGMENT
1)利用度量信息直接构造几何段 ;
2)规定起点、终点和 /或其它点的度量信息来定义几何段,此时,将自动传递没有度量信
息的形状点的度量数据,其根据是点的位置和距离分布。
在进行任何 LRS操作之前,LRS几何段必须已经定义好,即起点、终点和形状点的度量数
据已经分配。注意:不要求度量数据与距离成正比
LRS操作(续)
?重新定义一几何段,SDO_LRS.REDEFINE_GEOM_SEGMENT
1)改正直接赋予度量信息操作中的错误 ;
2)实现度量信息与距离的正比关系。
LRS操作(续)
?截取一几何段,SDO_LRS.CLIP_GEOM_SEGMENT
从一已存在的几何段中截取,从而得到一新的几何段
LRS操作(续)
?分离一几何段,SDO_LRS.SPLIT_GEOM_SEGMENT
通过分离一几何段,得到两新的几何段
LRS操作(续)
?合并几何段,SDO_LRS.CONCATENATE_GEOM_SEGMENTS
合并两已存在的几何段,从而得到一新的几何段。该新几何段的方向与第一个几
何段相同。注意:不要求被合并的两几何段空间上是连接的。
LRS操作(续)
?聚合合并几何段,SDO_AGGR_LRS_CONCAT
合并图层中的几何段,从而得到一新的几何段。该新几何段的
方向与第一个几何段相同。
?变换一几何段,SDO_LRS.SCALE_LRS_SEGMENT
对一几何段的度量数据进行线性变换:平移和比例,从而得
到一新的几何段;
可实现:平移度量数据,即比例为零;逆序排列度量数据,
即平移为零但比例为 -1;按比例改变各度量数据,即给定比例值
但平移为零。
LRS操作(续)
?平移一几何段,SDO_LRS.OFFSET_LRS_SEGMENT
平移一几何段,得到一新的几何段
LRS操作(续)
?定位一几何段上的一点,SDO_LRS.LOCATE_PT
通过度量数据和偏移量可定位一几何段上的一点;当偏移量
不为零,并且度量值落在形状点上,则会定位出多个点,此时本
函数仅返回中间点。
LRS操作(续)
LRS操作(续)
?将点投影到一几何段上,SDO_LRS.PROJECT_PT
如果被投影的点在几何段上,其投影就是其自身;如果被投影
的点在形状点的偏离弧上,其投影就是该形状点,并且偏离弧上
的所有点的投影都为该形状点;如果有多个投影点,则返回第一
个点(从几何段的起始点算起)
线性参照系统(续)
?转换几何段
实现标准线串与 LRS线串间的相互转换:可以是单个标准线串
与 LRS线串间的转换( user_sdo_geom_metadata视图中的数据不受
影响),也可以是图层中的标准线串与 LRS线串间的转换
(user_sdo_geom_metadata视图中的数据受影响)
SDO_LRS.CONVERT_TO_LRS_DIM_ARRAY SDO_LRS.CONVERT_TO_STD_DIM_ARRAY
SDO_LRS.CONVERT_TO_LRS_GEOM SDO_LRS.CONVERT_TO_STD_GEOM
SDO_LRS.CONVERT_TO_LRS_LAYER SDO_LRS.CONVERT_TO_STD_LAYER
谢 谢 !