天天看點

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'