2009-12-09 103 views
15

我正在使用帶有GIS擴展的PostgreSQL來存儲地圖數據,以及OpenLayers,GeoServer等。我需要找到存儲在多邊形內的某些表格(例如交通信號燈,餐館)中的所有LAT/LONG點。或者,給定一組多邊形,我希望找到每個多邊形內的點集(例如GROUP BY查詢,而不是遍歷每個多邊形)。在PostGIS中,如何查找多邊形中的所有點?

是這些功能的東西,我需要編程,或存在(如擴展SQL)的功能?請詳細說明。

而且對於簡單的2D數據我有我真正需要的GIS擴展(GPL許可證的限制)或將PostgreSQL的足夠?

謝謝!

回答

11

在PostGIS中您可以使用邊框運營商尋找候選人,這是非常有效的,因爲它使用GiST索引。然後,如果需要嚴格匹配,請使用contains操作符。

喜歡的東西

SELECT 
    points,neighborhood_name from points_table,neighborhood 
WHERE 
    neighborhood_poly && points /* Uses GiST index with the polygon's bounding box */ 
AND 
    ST_Contains(neighborhood_poly,points); /* Uses exact matching */ 

關於如果這是必要的,取決於您的要求。對於上述工作,您肯定需要安裝PostGIS和GEOS。但是,如果邊界框匹配就足夠了,則可以在不需要PostGIS的情況下使用SQL進行編碼。

如果需要精確匹配,包含算法是公開的,但實現它們有效地需要一些努力在圖書館實現它這將隨後從SQL(就像GEOS)調用。

+1

另請參閱[ST_DWithin](http://www.postgis.org/docs/ST_DWithin.html)。 – 2012-09-18 10:35:26

4

我相信ST_Contains自動重寫使用要點索引邊框查詢,因爲它指出:

「調用該函數將自動 包括邊框比較可知 會利用任何在幾何圖形上可用的索引是 。要避免使用 索引,請使用函數 _ST_Contains。「

http://postgis.refractions.net/docs/ST_Contains.html

+0

這是一個比答案更多的評論。 – RickyA 2013-07-11 09:28:52

+0

這是根據SO常見問題解答的答案。 – IamIC 2016-04-13 10:45:48

2

ST_Contains將解決您的問題。

SELECT 
polygon.gid, points.x, points.y 
FROM 
    polygons LEFT JOIN points 
ON st_contains(polygon.geom, points.geom) 
WHERE 
    polygon.gid=your_id 
相關問題