我有一个包含点
的表格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)
确定它是否在多边形中。基于此,天真的解决方案将在所有点和多边形上进行嵌套循环,但肯定有更有效和正确的方法来实现这一点。
答案 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,但并非所有运算符都具有相同的地理位置类型。