一、空間操作符的文法 <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'