如何在postgis中找到多边形内的所有点?

Bri*_*dhi 7 gis postgresql postgis

我的位置存储在 location_table (point_location 几何)中,现在我在谷歌地图上绘制一个多边形并将该多边形(几何)传递到后端,我想找到该多边形内的所有位置。

SELECT POINT_LOCATION 
FROM LOCATIONS_TABLW 
WHERE ST_Contains(GeomFromEWKT(?), POINT_LOCATION);
Run Code Online (Sandbox Code Playgroud)

当我将多边形从谷歌地图传递到后端时,这给了我随机结果。它没有给我完全位于多边形内的所有点。它给我的点甚至在多边形之外。

在postgis中准确找到多边形内所有点(包括边界情况)的正确方法是什么?

我们尝试使用 st_intersects(); 它不起作用。在此输入图像描述

请查找以下查询

SRID=4326;POLYGON((-103.30549637500008 20.852735681153252,-103.08103481249998 20.612974162085475,-101.6261045 20.537532106266806,-99.83567868749998 20.395877027062447,-99.80306537500002 22.0572706994358,-99.64994812500004 28.918636198451633,-121.1212769375 8.69559423007209,-103.30549637500008 20.852735681153252))
SRID=4326;POINT(-103.496956 20.722446)
SRID=4326;POINT(-103.4955 20.723544)


select ST_Intersects(GeomFromEWKT('SRID=4326;POINT(-103.496956 20.722446)'), GeomFromEWKT('SRID=4326;POLYGON((-103.30549637500008 20.852735681153252,-10
3.08103481249998 20.612974162085475,-101.6261045 20.537532106266806,-99.83567868749998 20.395877027062447,-99.80306537500002 22.0572706994358,-99.64994812500004 28.918
636198451633,-121.1212769375 8.69559423007209,-103.30549637500008 20.852735681153252))'));
Run Code Online (Sandbox Code Playgroud)

这应该返回 false,但它返回 true。

Ohl*_*980 6

您可以使用

SELECT POINT_LOCATION 
FROM LOCATIONS_TABLE 
WHERE ST_Contains(ST_GEOMFROMTEXT('POLYGON((P1.X P1.Y, P2.X P2.Y, ...))'), LOCATIONS_TABLE.POINT_LOCATION);
Run Code Online (Sandbox Code Playgroud)

注意:多边形必须是封闭的(这意味着最后一个坐标==第一个坐标)。第二个参数 POINT_LOCATION 必须是点表中的几何列。

更新:我尝试在我的 pg 数据库中重播您的步骤。我创建了 2 个表,LOCATIONS_TABLE (id, geom) 和 POLYGON (id, geom)。之后我用 2 个点填充了 LOCATIONS_TABLE

SRID=4326;POINT(-103.4955 20.723544)
SRID=4326;POINT(-103.496956 20.722446)
Run Code Online (Sandbox Code Playgroud)

之后我将多边形插入 POLYGON 表中

SRID=4326;POLYGON((-103.305496375 20.8527356811533,-103.0810348125 20.6129741620855,-101.6261045 20.5375321062668,-99.8356786875 20.3958770270624,-99.803065375 22.0572706994358,-99.649948125 28.9186361984516,-121.1212769375 8.69559423007209,-103.305496375  (...)
Run Code Online (Sandbox Code Playgroud)

我在qgis中可视化了情况,见下图: 样本

如您所见,这两个点位于多边形内部。所以我手动创建了多边形外的一个点。之后,您可以使用以下 sql 查询来查看这些点是否在多边形内部:

SELECT ST_Contains(polygon.geom, point.geom) 
FROM public."LOCATIONS_TABLE" point, public."POLYGON" polygon
Run Code Online (Sandbox Code Playgroud)

对于内部的 2 个点,它返回 t;对于第三个点,它返回 false。

  • 如果函数 ST_INTERSECTS 给出正确的结果,您也可以尝试。在上面的示例中,您只需将 ST_CONTAINS 替换为 ST_INTERSECTS 即可。 (2认同)