【问题标题】:PostGIS query to Select all Polygons from Polygon table having an intersecting geometry with one or more point in passed list of GeoCoordinatesPostGIS 查询从多边形表中选择所有多边形,该多边形表具有相交的几何图形,在传递的地理坐标列表中具有一个或多个点
【发布时间】:2020-11-14 01:57:47
【问题描述】:

我在 Postgres(使用 PostGIS 扩展)中有一个名为 polygons 的多边形表,它有两个字段(geom,id)。

如果我想查询与输入地理坐标几何相交的多边形的 id,那么我可以使用以下查询来完成。

SELECT id, geom 
FROM polygon 
WHERE ST_Intersects(polygon.%s, ST_GeometryFromText(POINT(latitude logitude), 4326));

但是现在我有一个用例,我在请求中获得了很多地理坐标(~60k),现在我将其分解为每个 1k 地理坐标的列表并查询与每个相交的多边形的 id地理坐标。

我正在为如何写作而苦苦挣扎。对此进行查询,或者如果有人对此有更好的解决方案,请提出建议。

【问题讨论】:

    标签: sql postgresql postgis


    【解决方案1】:

    请记住,坐标对的正确顺序是lon, lat,因此在您的查询中使用lat, lon 创建一个点将返回错误的结果。您的查询还遗漏了 WKT 坐标周围的单引号 ',例如'POINT(1 2)'.

    话虽如此,您可以简单地使用ORDER BYLIMITOFFSET 对结果集进行分页,例如

    获取前 1000 条记录

    SELECT id, geom FROM polygon
    WHERE ST_Intersects(geom, 'SRID=4326;POINT(1 2)')
    ORDER BY id
    LIMIT 1000 OFFSET 0;
    

    通过更改OFFSET 值,您可以检索下一页。

    LIMIT 1000 OFFSET 1000;
    

    等等..

    LIMIT 1000 OFFSET 2000;
    

    编辑:使用多个输入点应用此查询的一种方法是使用CTE / subquery(参见 cmets),例如

    WITH j(g) AS (
      VALUES 
        ('SRID=4326;POINT(1 1)'),
        ('SRID=4326;POINT(1 2)') 
        -- ... add as many geometries as you want
    )
    SELECT id, geom FROM polygon, j
    WHERE ST_Intersects(geom, g::geometry)
    

    【讨论】:

    • 我的应用程序代码中有 lat, lon(List) 的列表,如何使用列表调用查询,并确保查询从列表中一一获取每个点。就像将列表从应用程序传递到数据库一样,数据库然后从列表中逐一获取每个点并找到。每个对应点相交的多边形的 id。
    • 是否可以将此查询放入您的应用程序中的循环中,以便您可以逐点运行查询?或者您需要在一个查询中完成?
    • 我正在寻找一种立即运行的方法(批量 1-2K),以便我有 60k 地理坐标要查询
    • @ShubhamGoyal 我刚刚在我的 amswer 中添加了 CTE。是你要找的吗?
    • 如果输入中有许多几何图形,Postgres 服务器本身是并行执行查询以获得更好的性能还是我们需要指定?
    猜你喜欢
    • 2022-06-22
    • 2013-10-16
    • 1970-01-01
    • 1970-01-01
    • 2013-03-15
    • 1970-01-01
    • 2019-04-26
    • 1970-01-01
    • 2016-04-27
    相关资源
    最近更新 更多