2

我有一个包含点的表

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

4 回答 4

4

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

SELECT polygonID, pointID
  FROM Points INNER JOIN Polygons 
  ON ST_covers(polygons.aPolygon,Points.thePoint  );
于 2015-01-08T08:56:51.993 回答
1

postgresql 有polygon @> point

select * from points join polygons on polygons.aPolygon @> points.thePoint;
于 2015-01-07T23:43:23.437 回答
1

答案有点像你的问题:“内部”。使用ST_DWithin 运算符

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 ,但并非所有运算符都有对应的地理类型。

于 2015-01-08T22:02:29.113 回答
0

自从我用 PostGIS 做任何事情以来已经有一段时间了,但我会试一试。

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

于 2015-01-07T23:46:02.440 回答