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);