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’;

  • 相关阅读:
    MyEclipse启动时,报错Error:could not open`E:Program FilesJavaJAVAlibamd64jvm.cfg'
    换JDK以后,MyEclipse无法启动,报错:Failed to load the JNI...
    ORA-12514
    java语言
    基本数据类型
    C# 计算时间间隔,两个时间差(年月日时分秒)
    Java的Stream流
    Java的Lambda表达式和函数式接口
    Java中的Log
    Oracle的触发器Trigger
  • 原文地址:https://www.cnblogs.com/zhangjun1130/p/1898908.html
Copyright © 2011-2022 走看看