I. 空間關係運算
以上兩個章節是必不可少的基礎,涉及到空間資料在資料庫中的儲存和通過索引加速空間資料的擷取。從這句話也可以看出,後續的章節並不是必須的,也就是說某些基於空間資料的應用可能並不需要諸如空間關係判斷、幾何對象處理等功能。這並不是說這些功能就用不著了,而是這些功能並不一定需要在資料庫端執行。比如基於ArcSDE,這些空間演算法和功能在ArcGIS的產品線中無處不在,很多時候都不會把這些功能放到資料庫上去。
· Oracle Spatial
在Oracle Spatial中,主要的空間關係操作在下表中列出:
空間操作 |
描述 |
SDO_FILTER |
主過濾,判斷哪些幾何對象可能和給定的幾何對象相交 |
SDO_JOIN |
基於一定空間關係的表串連 |
SDO_NN |
查詢離某個幾何對象最近的幾何對象 |
SDO_NN_DISTANCE |
查詢離某個幾何對象最近的幾何對象與當前對象的距離 |
SDO_RELATE |
判斷兩個幾何對象是否滿足某種空間關係 |
SDO_WITHIN_DISTANCE |
判斷兩個幾何對象間距離是否小於某給定值 |
其中SDO_RELATE操作比較特殊,它通過mask參數來判斷幾何對象間是否滿足某種空間關係,但是事實上如果都用參數來指定空間關係的話使用上就不太方便,因此,Oracle Spatial還提供了基於SDO_RELATE不同參數代表的不同空間關係的一些操作,如下表:
衍生自SDO_RELATE的空間操作 |
描述 |
SDO_ANYINTERACT |
任意部分有相交 |
SDO_CONTAINS |
|
SDO_COVEREDBY |
SDO_COVERS |
SDO_EQUAL |
SDO_INSIDE |
SDO_ON |
SDO_OVERLAPBDYDISJOINT |
SDO_OVERLAPBDYINTERSECT |
SDO_OVERLAPS |
SDO_TOUCH |
下面我們看一些空間關係操作的大概用法,比如我用一個三角形去查詢所有滿足“INSIDE”關係的幾何對象,我們可以通過以下兩種等價的方式操作:
SQL> select continent from continent where sdo_inside(geom, SDO_GEOMETRY(2003,NULL,NULL,SDO_ELEM_INFO_ARRAY(1,1003,1),SDO_ORDINATE_ARRAY(0,0,180,-90,180,90,0,0)))='TRUE';
CONTINENT
---------------------------------------
Australia
SQL> select continent from continent where sdo_relate(geom, SDO_GEOMETRY(2003,NULL,NULL,SDO_ELEM_INFO_ARRAY(1,1003,1),SDO_ORDINATE_ARRAY(0,0,180,-90,180,90,0,0)), 'mask=INSIDE')='TRUE';
CONTINENT
---------------------------------------
Australia
圖 13 判斷和圖示三角形滿足一定空間關係的幾何對象
雖然有一些比較方便的SDO_RELATE的衍生操作,不過SDO_RELATE支援更靈活的空間關係判斷,比如以下的SQL語句可以查詢和上面的三角形滿足“OVERLAPBDYDISJOINT”關係、“INSIDE”關係及同時滿足這兩種關係的幾何對象:
SQL> select continent from continent where sdo_relate(geom, SDO_GEOMETRY(2003,NULL,NULL,SDO_ELEM_INFO_ARRAY(1,1003,1),SDO_ORDINATE_ARRAY(0,0,180,-90,180,90,0,0)), 'mask=OVERLAPBDYDISJOINT')='TRUE';
CONTINENT
---------------------------------------
North America
SQL> select continent from continent where sdo_relate(geom, SDO_GEOMETRY(2003,NULL,NULL,SDO_ELEM_INFO_ARRAY(1,1003,1),SDO_ORDINATE_ARRAY(0,0,180,-90,180,90,0,0)), 'mask=INSIDE')='TRUE';
CONTINENT
---------------------------------------
Australia
SQL> select continent from continent where sdo_relate(geom, SDO_GEOMETRY(2003,NULL,NULL,SDO_ELEM_INFO_ARRAY(1,1003,1),SDO_ORDINATE_ARRAY(0,0,180,-90,180,90,0,0)), 'mask=INSIDE+OVERLAPBDYDISJOINT')='TRUE';
CONTINENT
---------------------------------------
North America
Australia