在PostGIS中,如何查找多边形内的所有点?

时间:2009-12-09 10:49:59

标签: polygon postgis

我正在使用带有GIS扩展的PostgreSQL来存储地图数据,以及OpenLayers,GeoServer等。给定一个多边形,例如在邻域中,我需要找到存储在多边形内的某些表格(例如交通信号灯,餐馆)中的所有LAT / LONG点。或者给定一组多边形,我想在每个多边形内找到一组点(比如GROUP BY查询,而不是迭代每个多边形)。

这些功能是我需要编程的,还是可用的功能(作为扩展SQL)?请详细说明。

对于我所做的简单2D数据,我实际上需要GIS扩展(GPL许可是限制)还是PostgreSQL就足够了?

谢谢!

3 个答案:

答案 0 :(得分:12)

在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 :(得分:4)

我相信ST_Contains会自动重写查询以使用GiST索引的边界框,因为它注意到:

  

“此功能调用将自动进行   包括一个边界框比较   将使用任何索引   可用于几何形状。避免   索引使用,使用该功能   _ST_Contains“。

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

答案 2 :(得分: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