【问题标题】:In PostGIS, how do I find all points within a polygon?在 PostGIS 中,如何找到多边形内的所有点?
【发布时间】:2010-12-24 18:58:51
【问题描述】:

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

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

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

谢谢!

【问题讨论】:

    标签: polygon postgis


    【解决方案1】:

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

    【讨论】:

    • neighborhood_poly && points 检查现在是多余的。 ST_Contains 现在自动使用索引。我不确定具体更改了哪个版本,但我认为它是从 1.3.0 开始的(“添加了对关系函数的内联索引支持(ST_Disjoint 除外)”)。
    【解决方案2】:

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

    "这个函数调用会自动 包括一个边界框比较 将使用任何索引 可用于几何图形。避免 索引使用,使用函数 _ST_Contains。”

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

    【讨论】:

    • 这更像是一个评论而不是一个答案。
    • 这是 SO FAQ 中的答案。
    • 它不会“重写”。 ST_Contains 被重新定义为调用 SQL geomA && geomB AND _ST_Contains(geomA, geomB) 的普通 SQL 函数,_ST_Contains 映射到执行实际包含检查的编译二进制函数。大多数其他关系函数也以类似方式重新定义。
    【解决方案3】:

    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
    

    【讨论】:

      猜你喜欢
      • 2018-02-28
      • 2015-03-06
      • 2012-02-18
      • 2018-11-12
      • 2019-11-07
      • 1970-01-01
      • 2011-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多