【问题标题】:How to find all points within polygon in postgis?如何在postgis中找到多边形内的所有点?
【发布时间】:2018-02-28 03:08:44
【问题描述】:

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

SELECT POINT_LOCATION 
FROM LOCATIONS_TABLW 
WHERE ST_Contains(GeomFromEWKT(?), POINT_LOCATION);

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

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

选择 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))')); 这应该返回 False,但它正在返回 true。

【问题讨论】:

    标签: postgresql gis postgis


    【解决方案1】:

    你可以使用

    SELECT POINT_LOCATION 
    FROM LOCATIONS_TABLE 
    WHERE ST_Contains(ST_GEOMFROMTEXT('POLYGON((P1.X P1.Y, P2.X P2.Y, ...))'), LOCATIONS_TABLE.POINT_LOCATION);
    

    注意:多边形必须是闭合的(这意味着最后一个坐标 == 第一个坐标)。第二个参数 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)
    

    之后我在 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  (...)
    

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

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

    SELECT ST_Contains(polygon.geom, point.geom) 
    FROM public."LOCATIONS_TABLE" point, public."POLYGON" polygon
    

    它为内部的 2 个点返回 t,为第三个点返回 false。

    【讨论】:

    • 嗨@Ohlsen1980,我们已经尝试过同样的方法,但它对我们不起作用。
    • 为什么这不起作用?你能具体说明你做了什么吗?
    • 你也可以试试,如果函数 ST_INTERSECTS 会给你正确的结果。在上面的示例中,您只需将 ST_CONTAINS 替换为 ST_INTERSECTS。
    • 嗨@Ohlsen,请参考上面的快照我已经更新了问题
    • 您的点表和多边形使用哪些坐标系?你能发布两个数据集的例子吗?
    猜你喜欢
    • 2010-12-24
    • 2015-03-06
    • 2012-02-18
    • 2018-11-12
    • 2019-11-07
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多