2011-11-17 57 views
1

我正在開發一個項目,使用PostGIS來保存空間數據,其中包含保存幾何點數據的記錄和保存幾何區域數據的記錄。爲了解決我的問題,我正在尋找兩種可以採用地理形狀而不是幾何形狀作爲參數的查詢。找到與點相交的所有區域 - 反之亦然 - PostGIS

對於查詢A我需要它返回與給定區域相交的所有點。

對於查詢B我需要它返回與給定點相交的所有區域。

回答

3

查詢是相當多的,其曾經向你去,它只是取決於你選擇的標準是相同的,讓我們假設你有如下表:

--------------------------------------------------- 
| id | name | otherdata | geometry(MULTIPOLYGON) | 
--------------------------------------------------- 
| 1 | poly1 | blah  | 1020304050......  | 
--------------------------------------------------- 

使用下列內容:

SELECT * FROM poly_table 

SELECT id,name,otherdata,AsText(geometry) 

將按原樣顯示該表(稍後將給出更多En glish可讀的輸出)

現在如果你也有一個類似的表格,而不是在幾何體中的多邊形,你有點,要對它們進行交叉過濾,你可以使用簡單的連接。

EG:

SELECT points.* FROM points_table points 
INNER JOIN polygon_table polys ON ST_Within(points.geometry,polys.geometry) 
WHERE polys.id = 1 -- Or some other where clause to restrict the polygon area to the one you want. 

這將返回從積分榜落在表示該區域的興趣選擇多邊形內部的所有點

注:我在這裏使用ST_Within,但有PostGIS中的其他幾何操作員可以執行許多其他類型的檢查,這會使您的交叉和/或邊界測量更加準確,但對於所有這些檢查原則都是相同的。

對於你的第二個查詢,所需的GIS-SQL將是非常相似的,但不是返回點對於給定的多,你需要扭轉你的條件來返回多邊形給定點:

SELECT polys.* FROM polygon_table polys 
INNER JOIN points_table points ON ST_Within(points.geometry,polys.geometry) 
WHERE points.id = 1 -- Or some other where clause to restrict the point to the one you want. 

注:我們一直在「ST_Within參數完全相同的順序,因爲ST_Within處理使用以下規則:

returns true IF geometry A is within geometry B 

由於點是2個實體仍然較小那麼我們仍然需要檢查爲相同的空間排序。