[ Oracle Spatial 系列 ] 之二 Operator操作子详细说明(ZZ)

SDO_FILTER

格式:

    SDO_FILTER(geometry1, geometry2, params);

描述:

    通过空间索引,根据给定的几何要素检索出具有空间相互关系的空间对象。这里的空间关系是指两个几何不分离,即Non-disjoint。【disjoint:表示两个几何的边和内部都不相交】

    这个Sdo_Filter执行只是初始的空间过滤操作;二次的过滤操作将由SDO_RELATE操作子完成,它能确定空间对象的相交关系。

参数:

geometry1 指需要查询表中几何列,该几何列务必已经建立空间索引。该列的数据类型为:MDSYS.SDO_GEOMETRY

geometry2 它值的可以是表中的几何,也可以是具体的几何对象(包括关联的几何对象变量、通过SDO_GEOMETRY构造函数的几何对象)。该列的数据类型也为:MDSYS.SDO_GEOMETRY

params 决定操作子的行为。数据类型为VARCHAR2

params具体有以下几种:

querytype: 有效的查询类型有:WINDOWJOIN.。这是个必须的参数。

          querytype =’ WINDOW’建议大部分情况下是使用该参数的。WINDOW’表明查询将执行表中所有候选geometry1,与geometry2进行比较。也就是说WINDOW将单个geometry1和所有的geometry2进行空间关系操作,并比较是否满足空间关系。

          querytype =’ JOIN’很少用到。当你想比较该geometry1几何列和另外geometry2表中的几何列的话可使用JOIN。使用JOIN表明该geometry2必须建立的几何索引(具体参考使用说明)。

          idxtab1【可选】:如果存在多个空间索引表,它指的是geometry1空间索引表对应的表名。

idxtab2【可选】:如果存在多个空间索引表,它指的是geometry1空间索引表对应的表名。只有当querytype =’ JOIN’才可以使用该参数。

返回

表达式SDO_FILTER(arg1, arg2, arg3) = ‘TRUE’中的True表明两个几何空间关系为:不相离;否则为False

使用说明

这个SDO_FILTER操作子必须用在Where子句中,在sql语句中使用该格式:SDO_FILTER(arg1, arg2,arg3) = ‘TRUE’.

如果querytype =’ WINDOW’ geometry2可以来自一个表,也可以来自具体的几何对象(包括关联的几何对象变量、通过SDO_GEOMETRY构造函数的几何对象)。

1、如果2个或大于2geometry2几何将在SDO_FILTER中使用的话,geometry2将在from语句的第一个参数。

如果querytype =’ JOIN’

1geometry2必须来自于表;

2、为了更好的执行SQL语句,geometry1geometry2应该使用相同的空间索引类型(R树或者二叉树);如果是二叉树他们应该有相同的sdo_level值。geometry1geometry2不是相同的索引类型,geometry2将按照geometry1索引类型重新构建索引,这样SQL语句的性能就大打折扣。

如果geometry1geometry2是基于不同的坐标参考系统的话,为了   执行操作geometry2将被临时的转换为geometry1的坐标系统。

举例:

1、从Polygons表中选择出满足一定条件的GID。该条件为:选择出的GID对应的几何与query_polys表中GID=1的几何不相离。

SELECT A.gid

FROM Polygons A, query_polys B

WHERE B.gid = 1

AND SDO_FILTER(A.Geometry, B.Geometry, ’querytype = WINDOW’) = ’TRUE’;

///其中A.GeometryPolygons表几何列的列名

2、也是从Polygons表中选择出满足一定条件的GID。不过查询几何被存储到aGeom变量中。

Select A.Gid

FROM Polygons A

WHERE SDO_FILTER(A.Geometry, :aGeom, ’querytype=WINDOW’) = ’TRUE’;

3、也是从Polygons表中选择出满足一定条件的GID。查询几何为sdo_geometry构造函数构造的几何。

Select A.Gid

FROM Polygons A

WHERE SDO_FILTER(A.Geometry, mdsys.sdo_geometry(2003,NULL,NULL,

mdsys.sdo_elem_info_array(1,1003,3),

mdsys.sdo_ordinate_array(x1,y1,x2,y2)),

’querytype=WINDOW’) = ’TRUE’;

4、从Polygons表中选择出满足一定条件的GID,当Polygons表的候选几何与任意一个query_polys的几何对象不相离都将GID选择出。因为多个query_polys中的几何将涉及到(参考使用说明)geometry2将被放到from的第一个参数。

SELECT /*+ ORDERED */

A.gid

FROM query_polys B, polygons A

WHERE SDO_FILTER(A.Geometry, B.Geometry, ’querytype = WINDOW’) = ’TRUE’;

5、从Polygons表中选择出满足一定条件的GID,当Polygons表的候选几何与任意一个query_polys的几何对象不相离都将GID选择出。在这个例子中QUERY_POLYS.GEOMETRY几何列务必建立了空间索引。

SELECT A.gid

FROM Polygons A, query_polys B

WHERE

SDO_FILTER(A.Geometry, B.Geometry, ’querytype = JOIN’) = ’TRUE’;

 

SDO_RELATE

格式:

SDO_RELATE(geometry1, geometry2, params);

描述:

通过空间索引,根据给定的几何要素(如一个多边形)检索出与其有特殊空间关系的几何要素。这个空间关系包括九种:Touch, OVERLAPBDYDisjoint, OVERLAPBDYIntersect, Equal,Inside, CoveredBy, Contains, Covers, AnyInteract, On.。具体图形标识如下:

这个操作子相当于同时执行了第一步(SDO_FILTER的功能)和第二步过滤操作

参数和关键字:

geometry1 指需要查询表中几何列,该几何列务必已经建立空间索引。该列的数据类型为:MDSYS.SDO_GEOMETRY

geometry2 它值的可以是表中的几何,也可以是具体的几何对象(包括关联的几何对象变量、通过SDO_GEOMETRY构造函数的几何对象)。该列的数据类型也为:MDSYS.SDO_GEOMETRY

params 决定操作子的行为。数据类型为VARCHAR2

params具体有以下几种:

Mask:指定了空间关系。这是个必须的参数。有九种关系如上图所示,多种空间关系可以组合:例如:’mask=inside+touch’;

Querytype:可以参考SDO_FILTER中的介绍,在此不累赘。

idxtab1idxtab2 :可以参考SDO_FILTER中的介绍,在此不累赘。

返回

表达式SDO_RELATE(geometry1,geometry2, ’mask = <some_mask_val> ,querytype = <some_querytype>’) = ’TRUE’中的True是指两个几何对象满足<some_mask_val>条件。否则为Flase

举例:

这里的所有要求条件和SDO_FILTER例子一样

1、从Polygons表中选择出满足一定条件的GID。该条件为:选择出的GID对应的几何与query_polys表中GID=1的有任何相交关系。

SELECT A.gid

FROM Polygons A, query_polys B

WHERE B.gid = 1

AND SDO_RELATE(A.Geometry, B.Geometry,

’mask=ANYINTERACT querytype=WINDOW’) = ’TRUE’;

2、也是从Polygons表中选择出满足一定条件的GID。不过查询几何被存储到aGeom变量中。

Select A.Gid

FROM Polygons A

WHERE SDO_RELATE(A.Geometry, :aGeom, ’mask=ANYINTERACT querytype=WINDOW’)= ’TRUE’;

其他的例子里类似,这里也不累赘。

 

下面给出两个操作子结合的SQL语句

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'

 

SDO_WITHIN_DISTANCE

格式:

SDO_WITHIN_DISTANCE(geometry1, aGeom, params);

描述:

通过空间索引,检索出距离给定几何对象(可以是具体的多边形、点等)的一定范围内的所有空间对象。

参数和关键字:

geometry1:一个表中几何列的列名。这列的几何对象如果是在给定对象aGeom的一定范围之内的话,将被检索出来。这个geometry1对应的几何列务必创建空间索引。

该列的数据类型为:MDSYS.SDO_GEOMETRY

aGeom:值根据这个对象和一定距离去检索geometry1。它可以是一个表的几何列(包含对象的变量),也可以是一个具体的几何对象(如通过SDO_GEOMETRY构造函数的几何对象)。

该列的数据类型为:MDSYS.SDO_GEOMETRY

PARAMS:决定操作子的行为。数据类型为VARCHAR2

params具体有以下几种:

         Distance:指距离长度,这是个必须的参数。如果指定过滤的几何有关联的参考坐标,这个距离的单位就是参考坐标的单位。数据类型为Number

         idxtab1:可以参考SDO_FILTER中的介绍,在此不累赘。

         Querytype:设置为’querytype=FILTER’将执行第一步过滤操作。如果querytype没有指定第一步和第二步过滤操作将执行(默认为该种情况)。数据类型为VARCHAR2

         Unit:指定距离单位。例如:unit=’KM’.具体的单位SDO_UNIT 值来之MDSYS.SDO_DIST_UNITS 表。数据类型为Number。默认的单位适合具体的数据关联的,例如数据是投影数据的话,单位为M.

返回

表达式SDO_WITHIN_DISTANCE(arg1, arg2, arg3) = ’TRUE’,为True将返回一定距离子内的所有要素。

举例:

1、得到距离矩形为10单位之内的所有POLYGONS几何的GID

SELECT A.GID

FROM POLYGONS A

WHERE

SDO_WITHIN_DISTANCE(A.Geometry, mdsys.sdo_geometry(2003,NULL,NULL,

mdsys.sdo_elem_info_array(1,1003,3),

mdsys.sdo_ordinate_array(x1,y1,x2,y2)),

’distance = 10’) = ’TRUE’;

2、得到距离 Query_PointsGID = 1对应的几何 10单位之内的所有POLYGONS几何的GID

SELECT A.GID

FROM POLYGONS A, Query_Points B

WHERE B.GID = 1 AND

SDO_WITHIN_DISTANCE(A.Geometry, B.Geometry, ’distance = 10’) = ’TRUE’;

你可能感兴趣的:(oracle)