zoukankan      html  css  js  c++  java
  • [ 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’;

  • 相关阅读:
    SP笔记:交叉实现七行并成一行
    HTML tag 学习
    操作哈希表
    Efficient bipedal robots based on passivedynamic walkers
    Pushing People Around
    ZEROMOMENT PONTTHIRTY FIVE YEARS OF ITS LIFE

    Active Learning for RealTime Motion Controllers
    Accelerometerbased User Interfaces for the Control of a Physically Simulated Character
    Dynamic Response for Motion Capture Animation
  • 原文地址:https://www.cnblogs.com/zhangjun1130/p/1898908.html
Copyright © 2011-2022 走看看