在 PostGIS 中使用 ST_Within 显示几个重叠/相交多边形内的点

问题描述

我有一个单独的点和多边形表。多边形彼此重叠或相交。这些点同时位于多个多边形内。我需要开发一个 sql 查询,它应该显示多边形中的点。如果我使用这样的 sql 查询

SELECT point_table.geom,polygon_table.name FROM point_table
INNER JOIN polygon_table on ST_Within(point_table.geom,polygon_table.geom);

它不会遍历所有多边形,而是使用最里面的多边形评估点几何,并且不评估具有其他重叠或相交多边形的点几何。我需要的是评估所有多边形的所有点。因为点可以同时位于多个多边形内。

例如,如果 10 个点在 3 个重叠的多边形内,它应该返回 30 条记录,并且每个记录/行都应该有相应的polygon_table.name。在这种情况下,上面的查询会从最里面的多边形返回 10 条带有polygon_table.name 的记录,即一旦找到匹配项,它就不会针对其他多边形评估这些点。

感谢您对此事的任何帮助。

谢谢。

解决方法

您的查询看起来不错。错误很可能在其他地方。为了使我的观点更清楚,我将添加一个示例,显示两个多边形和四个点,其中三个点位于内部多边形内,一个点位于外部多边形内:

enter image description here

WITH pol(id,geom) AS (
  VALUES (1,'SRID=4326;POLYGON((-4.53 54.21000000000001,-4.51 54.21000000000001,-4.51 54.19,-4.53 54.19,-4.53 54.21000000000001))'::GEOMETRY),(2,'SRID=4326;POLYGON((-4.537478046647734 54.213934294785226,-4.502287464372343 54.213934294785226,-4.502287464372343 54.18506473763151,-4.537478046647734 54.18506473763151,-4.537478046647734 54.213934294785226))'::GEOMETRY)
),poi(id,'SRID=4326;POINT(-4.524700698880288 54.20613765421879)'::GEOMETRY),'SRID=4326;POINT(-4.517588984076674 54.20219317274976)'::GEOMETRY),(3,'SRID=4326;POINT(-4.524762007263298 54.19627574559112)'::GEOMETRY),(4,'SRID=4326;POINT(-4.507098941702792 54.211414844419664)'::GEOMETRY))
SELECT poi.id AS point_id,pol.id AS polygon_id FROM poi
JOIN pol ON ST_Within(poi.geom,pol.geom);

 point_id | polygon_id 
----------+------------
        1 |          1
        1 |          2
        2 |          1
        2 |          2
        3 |          1
        3 |          2
        4 |          2

在结果集中,您可以看到三个点与所有多边形相连,一个点与一个多边形相连,如上图所示。

自己试试:db<>fiddle

如果还是不行,请提供一些示例数据,我们可以测试一下。