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:有效的查询类型有:WINDOW和JOIN.。这是个必须的参数。
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个或大于2的geometry2几何将在SDO_FILTER中使用的话,geometry2将在from语句的第一个参数。
如果querytype =’
JOIN’。
1、geometry2必须来自于表;
2、为了更好的执行SQL语句,geometry1和geometry2应该使用相同的空间索引类型(R树或者二叉树);如果是二叉树他们应该有相同的sdo_level值。geometry1和geometry2不是相同的索引类型,geometry2将按照geometry1索引类型重新构建索引,这样SQL语句的性能就大打折扣。
如果geometry1和geometry2是基于不同的坐标参考系统的话,为了
执行操作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.Geometry为Polygons表几何列的列名
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
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’;