Oracle_spatial的空间操作符

一、空间操作符的语法
<spatial_operator>
(
  table_geometry      IN SDO_GEOMETRY (或者 ST_GEOMETRY),
  query_geometry      IN SDO_GEOMETRY (或者 ST_GEOMETRY),
  [, parameter_string IN VARCHAR2
     [, tag           IN NUMBER ]]
)
= ‘TRUE’
table_geometry: 空间操作符要运用到的表几何体数据列;
query_geometry: 查询位置,可以是另一个表的几何体数据列,也可以是一个绑定的变量,或者是一个动态创建的几何体对象;
parameter_string: 指定特定的空间操作符参数,有些操作符中是可选的;
tag:在某些特定空间操作符上需要的数值,相关参数只能在parameter_string参数中指定。

 

二、空间操作符分类
按邻近分析的类型可分为:
1. 位置查询:从指定查询位置找出所有特定距离内的所有数据,即within distance操作符(SDO_WITHIN_DISTANCE);
2. 邻近查询:找出指定查询位置附近最近的那些邻居,即最近邻居(nearest-neighbor)操作符(SDO_NN);
3. 相交查询:找出与指定查询位置相交的所有邻居(Find neighbors that interact with or relate to a query location):主

要操作符是SDO_RELATE,更简单的有SDO_FILTER(只是MBR的计算,因此也不需要Geometry Engine操作),此类操作符主要用于区域

分析。此外还有对SDO_RELATE的简化版,如SDO_ANYINTERACT, SDO_CONTAINS, SDO_COVERS, SDO_COVEREDBY, SDO_EQUAL,

SDO_INSIDE, SDO_ON, SDO_OVERLAPS, 和SDO_TOUCH

SDO_WITHIN_DISTANCE 用于判断几何体sdo_Geometry2在指定的距离Distance内周边附近有什么其他几何体集。
eg:选择北京国贸饭店 100米以内的所有道路。

select r.pathname
   from rbeijing r, pbeijing p
  where p.name = '北京国贸饭店'
    and SDO_WITHIN_DISTANCE(r.geoloc, p.geoloc, 'DISTANCE=100 unit=M') = 'TRUE'

 

SDO_NN操作符  按其与查询位置的距离顺序来返回数据。一般通过ROWNUM<N 来约束邻近数量
SDO_BATCH_SIZE参数:空间索引成批返回结果直到WHERE   子句中的所有谓词被满足。
eg:选择北京国贸饭店最近的5个超市

select p1.name
  from pbeijing p1, pbeijing p2
where p2.name = '北京国贸饭店'
   and p1.name like '%超市'
   and SDO_NN(p1.geoloc, p2.geoloc, 'SDO_BATCH_SIZE=100') = 'TRUE'
   and ROWNUM < 5


SDO_FILTER
SDO_FILTER(geometry1, geometry2, params);
querytype: 有效的查询类型有:WINDOW和JOIN.。这是个必须的参数。使用JOIN表明该geometry2必须建立的几何索引
表达式SDO_FILTER(arg1, arg2, arg3) =‘TRUE’中的True表明两个几何空间关系为:不相离;否则为False。
eg:选择拱辰北大街上的所有POI点

SELECT p.Poi_Id, p.name, p.address
  FROM rbeijing r, pbeijing p
  WHERE r.pathname = '拱辰北大街'
   AND SDO_FILTER(p.geoloc, r.geoloc, 'querytype = WINDOW' ) = 'TRUE' ;

SDO_RELATE
 SDO_RELATE(geometry1, geometry2, params); 
过空间索引,根据给定的几何要素(如一个多边形)检索出与其有特殊空间关系的几何要素。这个空间关系包括九种:Touch, OVERLAPBDYDisjoint, OVERLAPBDYIntersect, Equal,Inside, CoveredBy, Contains, Covers, AnyInteract, On。这个操作子相当于同时执行了第一步(SDO_FILTER的功能)和第二步过滤操作。
eg:查询和颐和园任意相交的POI点

SELECT p.Poi_Id, p.name, p.address
  FROM BPbeijing bp, pbeijing p
  WHERE bp.name= '颐和园'   
   AND SDO_RELATE(p.geoloc, bp.geoloc, 'mask=ANYINTERACT  querytype=WINDOW') = 'TRUE';

SDO_CONTAINS  包含
eg:查询包含POI点西堤古桑所属的面

SELECT bp.name
  FROM BPbeijing bp, pbeijing p
  WHERE p.name= '西堤古桑'   
   AND SDO_CONTAINS (bp.geoloc,p.geoloc) = 'TRUE' ;

SDO_EQUAL  相等

select p.Poi_Id, p.name, p.address
    from pbeijing p
   where SDO_EQUAL(p.geoloc,
                   mdsys.sdo_geometry( 2001 ,
                                      8307 ,
                                      SDO_POINT_TYPE( 116.26068278744 ,
                                                     39.9959723157894 ,
                                                     NULL ),
                                      NULL ,
                                      NULL )) = 'TRUE'

SDO_TOUCH  接触
 


转载自:https://blog.csdn.net/cdl2008sky/article/details/8744167

You may also like...