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

Postgresql POSTGIS:查找多边形内的所有点,postgresql,postgis,polygons,point-in-polygon,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, } 我希望找到每个多边形中包含的所有点。 i、 结果应该是这样的 po

我有一张包含点的桌子

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,
}
我希望找到每个多边形中包含的所有点。 i、 结果应该是这样的

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

我用
ST_CoveredBy(thePoint,aPolygon)
一点一点地找出它是否在多边形中。基于此,朴素的解决方案将在所有点和多边形上进行嵌套循环,但肯定有一种更有效、更正确的方法来实现这一点。

postgresql拥有
polygon@>point

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

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

选择polygonID,pointID
从点、多边形

其中ST_包含(点、点、多边形、多边形)

这里有一种方法,适用于地理类型。顺便说一句,可能值得阅读有关几何和地理数据类型的文章。据我所知,几何图形还有很多可用的函数,但你必须参与投影。最好的选择取决于你在做什么

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

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

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

ST_相交(Points.thePoint,polygons.aPolygon)
也应该有效


查看是否要了解这些运算符的更多含义,但并非所有运算符都具有地理类型等效项。

ST_CONTAINS从未为我工作过始终会出现以下错误:没有与给定名称和参数类型匹配的函数。您可能需要添加显式类型转换。ST_CoveredBy和ST_交叉工作。好的,我还没有测试这个例子,我可能遗漏了一些东西。使用CoveredBy方法是否存在任何问题?如果使用索引(如果尚未使用),则可以大大提高性能。PostGIS中的ST_*方法可以自动使用它们。ST_*只包含几何体类型的工作,而不包含地理类型的工作@丽娃,这可能是你犯错误的原因。还要注意st_contains和st_Cover-之间的区别。最后,参数的顺序是错误的-例如,你需要st_覆盖(polygons.apolygon,points.thepoint)@>给了我一个错误。此外,@不适用于地理数据类型。最后,@Aleksandar Stojadinovic是对的-@只考虑边界框。。。
SELECT polygonID, pointID
FROM Points
JOIN Polygons ON ST_DWithin(Points.thePoint, polygons.aPolygon, 0);