19

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

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

同样对于我拥有的简单 2D 数据,我真的需要 GIS 扩展(GPL 许可证是一个限制)还是 PostgreSQL 就足够了?

谢谢!

4

3 回答 3

13

在 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)。

于 2009-12-09T11:12:49.063 回答
4

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

“此函数调用将自动包含一个边界框比较,该比较将利用几何上可用的任何索引。为避免使用索引,请使用函数 _ST_Contains。”

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

于 2010-06-02T23:24:45.680 回答
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
于 2014-01-13T08:01:26.593 回答