POSTGIS:查找多边形内的所有点

时间:2015-01-07 23:26:07

标签: postgresql postgis polygons point-in-polygon

我有一个包含点

的表格
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)确定它是否在多边形中。基于此,天真的解决方案将在所有点和多边形上进行嵌套循环,但肯定有更有效和正确的方法来实现这一点。

4 个答案:

答案 0 :(得分:4)

这是一种适用于地理类型的方法。 BTW,可能值得阅读几何和地理数据类型的manual。据我所知,有几个可用于几何的函数,但你必须参与投影。最好的选择取决于你正在做什么......

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

答案 1 :(得分:1)

postgresql有polygon @> point

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

答案 2 :(得分:0)

我已经有一段时间了,因为我已经用PostGIS做了一些事情,但是我试试看。

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

答案 3 :(得分:0)

答案就在你的问题中:"在"内。使用ST_DWithin operator

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

最后一个参数0是多边形内的距离。这对于选择例如在多边形10米范围内的点也很有用,如果源数据中存在定位误差,这将非常有用。

ST_Intersects(Points.thePoint, polygons.aPolygon)也应该有用。

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