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