空間查詢
空間查詢是地理數據庫所支持的一種查詢方法。這種查詢與普通的SQL查詢有較大的差別。首先,空間查詢允許用戶使用一些普通數據庫沒有的幾何數據類型,如點類型、線類型與面類型,而普通查詢的操作對象多數為數值、文本等數據。此外,空間查詢有許多與幾何關係有關的運算符,如相鄰、相交,而普通查詢用到的多數都是相等、大於、小於等運算符。
空間查詢類型
空間查詢需要一定的關係運算符來表達幾何體之間的關係。通常,空間查詢分為兩類:空間數量量算與空間幾何關係分析。目前的地理數據庫通常只能處理二維幾何體的空間查詢。不同的數據庫對於空間查詢運算符的名稱有着不同的表達,下面採用的是比較常見的表達方式:
空間數量量算
空間數量量算主要是指對空間對象的幾何參數進行量算,以獲得關於這些幾何體的屬性信息。在地理數據庫中,主要的空間數量量算有:
SQL函數的格式是:函數名(參數1,參數2):返回類型
- Distance(geometry, geometry) : double:兩個幾何體的距離測量
- Length(geometry) : double:幾何測量
- Area(geometry) : double:面積測量
- Buffer(double) : Geometry:緩衝區運算,返回與當前幾何體距離小於或等於某個距離的點的集合。
- ConvexHull( ):Geometry:凸包運算,返回一個包含當前幾何體所有點的凸包。
由於地球是一個橢球體,因此在空間數據庫之中,所有的幾何體都是帶有地圖投影與空間參照系的。空間數量量算都是在一定的投影與參照系下進行。對於若干幾何體,由於不同參照系的橢球參數不同,如果把他們放在不同的空間參照系下進行空間數量量算,會得出不同的結果。
空間幾何關係分析
空間幾何關係分析主要是指使用一些幾何謂詞來對由空間幾何體之間的位置與形狀產生的關係進行推斷。
- Equals(geometry, geometry) : boolean:判定兩個幾何體是否完全相等。這裏的相等的意思是兩個幾何體在空間中所包含的點集完全相同,與他們邊界的坐標順序無關。
- Disjoint(geometry, geometry) : boolean:判定兩個幾何體是否完全相離。兩個幾何體沒有任何共同部分稱為相離。
- Intersects(geometry, geometry) : boolean:判定兩個幾何體是否相交,兩個幾何體如果不是相離,就是相交。其他與「交」有關的空間謂詞,如Touches,Crosses都是Intersects的一個特例。
- Touches(geometry, geometry) : boolean:判定兩個幾何體是否相碰。兩個幾何體的邊界有交集,但內部沒交集則稱為相碰。
- Crosses(geometry, geometry) : boolean:判定兩個幾何體是否相穿。相穿指兩個幾何體的內部有公共部分,且公共部分的維度至少少於其中一個幾何體的維度。
- Overlaps(geometry, geometry) : boolean:判定兩個幾何體是否重疊。重疊指兩個幾何體有公共部分,且公共部分的維度與兩個幾何體相同。
- Within(geometry, geometry) : boolean:判定兩個幾何體中的A是否完全被B包含。
- Contains(geometry, geometry) : boolean:判定兩個幾何體中的A是否完全包含B。
限制
由於算法中實現的難度,在大多數空間數據庫中,大部分空間查詢都只能應用在由折線組成的幾何體之上。一些空間數據庫,例如PostGIS,都不支持對由圓弧和更加複雜的曲線組成的幾何體的空間查詢。
參考
Dimensionally Extended Nine-Intersection Model (DE-9IM) by Christian Strobl