【问题标题】:POSTGIS: find all the points within a polygonPOSTGIS:找到多边形内的所有点
【发布时间】:2015-03-06 00:01:05
【问题描述】:

我有一个包含点的表格

CREATE TABLE Points
{
  pointID BIGSERIAL PRIMARY KEY NOT NULL,
  thePoint GEOGRAPHY(POINT)
}

CREATE TABLE Polygons
{
  polygonID BIGSERIAL PRIMARY KEY NOT NULL,
  aPolygon GEOGRAPHY(POLYGON) NOT NULL,
}

我希望找到每个多边形中包含的所有点。 即结果应该是这样的

polygonID| pointID
-------------------
1        | 1
1        | 2
1        | 5
1        | 7
2        | 2
2        | 3
...

我设法逐点检查并使用ST_CoveredBy(thePoint, aPolygon) 确定它是否在多边形中。基于此,简单的解决方案是在所有点和多边形上进行嵌套循环,但肯定有更有效和正确的方法来实现这一点。

【问题讨论】:

    标签: postgresql postgis polygons point-in-polygon


    【解决方案1】:

    你的问题的答案有点像:“在”。使用ST_DWithin operator

    SELECT polygonID, pointID
    FROM Points
    JOIN Polygons ON ST_DWithin(Points.thePoint, polygons.aPolygon, 0);
    

    最后一个参数0 是多边形内的距离。这对于选择例如在多边形 10 m 以内的点也很有用,如果源数据中存在定位错误,这很有用。

    ST_Intersects(Points.thePoint, polygons.aPolygon) 也应该可以工作。

    如果您想详细了解这些运算符的含义,请参阅 DE-9IM,但并非所有运算符都有对应的地理类型。

    【讨论】:

      【解决方案2】:

      这是一种适用于地理类型的方法。顺便说一句,可能值得阅读有关几何和地理数据类型的manual。据我了解,还有更多可用于几何的功能,但您必须参与投影。最好的选择取决于你在做什么......

      SELECT polygonID, pointID
        FROM Points INNER JOIN Polygons 
        ON ST_covers(polygons.aPolygon,Points.thePoint  );
      

      【讨论】:

        【解决方案3】:

        我已经有一段时间没有对 PostGIS 做过任何事情了,但我会试一试。

        SELECT polygonID, pointID FROM Points, Polygons WHERE ST_CONTAINS(Points.thePoint , polygonID.aPolygon);

        【讨论】:

        • ST_CONTAINS 从来没有为我工作总是得到以下错误:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。 ST_CoveredBy 和 ST_Intersects 工作。
        • 好的,我没有测试过这个例子,我可能遗漏了一些东西。使用 CoveredBy 方法有什么问题吗?如果您使用索引(如果您还没有),您可以大大提高您的性能。 PostGIS 中的 ST_* 方法可以自动使用它们。
        • st_contains 仅适用于几何类型,而不适用于地理类型。 @liva 这可能是您错误的原因。还要注意 st_contains 和 st_covers 之间的区别 - lin-ear-th-inking.blogspot.de/2007/06/…。最后,参数的顺序错误 - 即您需要 st_covers(polygons.apolygon, points.thepoint)
        【解决方案4】:

        postgresql 有polygon @> point

        select * from points join polygons on polygons.aPolygon @> points.thePoint;
        

        【讨论】:

        • @> 给了我一个错误。此外,@ 不适用于地理数据类型。最后,@Aleksandar Stojadinovic 是对的 - @ 只考虑边界框...
        猜你喜欢
        • 2010-12-24
        • 2018-02-28
        • 2012-02-18
        • 2018-11-12
        • 2011-03-21
        • 1970-01-01
        • 2019-11-07
        • 1970-01-01
        • 2018-09-22
        相关资源
        最近更新 更多