当前位置: 首页 > 知识库问答 >
问题:

PostgreSQL/PostGIS:ST_距离查询应仅返回“最近的”结果

令狐和裕
2023-03-14

我想查询表A中每个点(id)到表B中每个多边形(id)的距离。对于距离计算,我使用ST_距离。但是,ST_Distance(显然)返回到每个多边形的距离。但我只需要每个点的“最接近”结果。到目前为止,我尝试了下面的查询,它返回了正确的结果,但是(当然)只返回了一个点。

SELECT polygons.id, points.id, ST_Distance(points.geom, polygons.geom) 
FROM table_A AS points, table_B AS polygons 
ORDER BY st_distance ASC LIMIT 1

结果应该是这样的:

polygon_id | point_id | min(distance)
-------------------------------------
1234       |   876    |   54.32
...        |   ...    |    ...
-------------------------------------

你有什么提示吗?非常感谢你。

更新1

WITH CTE AS
       (SELECT polygons.id as poly_id, points.id as point_id, 
        ST_Distance(points.geom, polygons.geom) as thedistance , 
        row_number() OVER
              (PARTITION BY points.id ORDER BY ST_Distance(points.geom, polygons.geom)) 
    FROM 
        table_A AS points
    INNER JOIN table_B AS polygons
    ON ST_DWithin(points.geom, polygons.geom, 100)) SELECT * FROM CTE WHERE row_number = 1

运行上述查询(3h 24m)后,返回的结果为空。然而,应该有一个结果。括号可能有问题吗?

更新2

SRID为4326(WGS84),多边形为OSM建筑多边形,点为同一城市中的任意点。

共有1个答案

壤驷子安
2023-03-14
WITH CTE AS
   (select polygons.id as poly_id, points.id as point_id, 
    ST_Distance(points.geom, polygons.geom) as thedistance , 
    row_number() OVER
          (PARTITION BY points.id ORDER by ST_Distance(points.geom, polygons.geom) ) 
FROM 
 table_A AS points, table_B AS polygons )
 select poly_id, point_id, thedistance from CTE where row_number = 1

然而,如果你有很多分数,这可能会很慢。如果您大致知道点与多边形之间的距离,您可以通过在使用索引的连接中使用st_dwithin来加快速度。只需设置距离参数,这样你就可以抓住每一点:

WITH CTE AS
   (select polygons.id as poly_id, points.id as point_id, 
    ST_Distance(points.geom, polygons.geom) as thedistance , 
    row_number() OVER
          (PARTITION BY points.id ORDER by ST_Distance(points.geom, polygons.geom) ) 
FROM 
    table_A AS points
INNER JOINT table_B AS polygons
ON st_Dwithin(points.geom, polygons.geom, 5000 )) -- assumes you have a metres projection, limit to 5KM
select * from CTE where row_number = 1

确保你的两个GEOM列都有GIST索引

 类似资料:
  • 问题内容: 简而言之,当不使用_geo_distance排序时,是否有一种方法可以返回地理距离? 更新:为澄清起见,我希望结果按随机顺序排列并包含距离。 问题答案: 是的,您可以使用脚本字段。 例如,假设您的文档具有一个名为的地理位置字段,则可以使用以下内容: (请注意,只是一个转义的单引号,所以真的是) 如果还希望返回该字段,则可以如下指定:

  • 我创建了一个表,其中包含位置及其空间坐标(纬度、经度(度数)),以postgres表示。我用于相同用途的命令有: 我在postgres中插入了空间坐标(经度、纬度) 我创建了一个表,其中包含位置及其空间坐标(纬度、经度(度数)),以postgres表示。我用于相同用途的命令有: testSpatial。csv包含以下值: 现在,我想找到彼此距离在50公里以内的所有空间位置。为此,我使用了以下命令:

  • 问题内容: 我有以下postgresql语法,该语法返回WHERE session_date与$ date_string匹配的值 问题是有时$ date_string在表中不可用,所以我想返回最接近$ date_string的日期。 有什么想法可以做到这一点吗? 问题答案: 如果您想要最近的日期,请按照以下方式进行操作: 之后的最接近日期使用类似的逻辑。 对于最接近的一方:

  • 距离查询 距离查询,是指查询指定几何对象一定距离范围内的地物。对于点几何对象,则查询以该点为圆心,以距离为半径画圆,落在该圆形范围内的地物;对于线和面几何对象,则查询距离对象边界一定范围内的地物。 以 World 数据服务为例。使用接口 ol.supermap.QueryService 在图层 “Capitals@World.1” 中查找距离指定点为10度(地图坐标单位)的矢量要素。 // 添加查

  • 我的申请中有以下实体: 地址 在实体中: 在< code >广告实体中: 完整实体: 我想找到所有的家庭广告实例,其成员的地址在所需地址的20KM以内。 以下是我得出的结论: 但是,似乎我错误地使用了数字路径类,因为我不断得到一个NPE。任何人都可以帮我正确查询吗? 编辑:我已经改变了我的家庭广告实体如下: 我现在得到以下异常: 第64行是这样的: 任何线索现在出了什么问题? edit2:我忘了提

  • 问题内容: 选项 询问 我有一个包含4列的数据库表: 唯一身份 城市名 纬度(纬度) 经度(lng) 我在顶部使用查询返回距指定坐标距离指定英里数内的位置。它似乎可行,但我不确定它的准确性如何。我很想知道查询是否很好,或者您是否有更好的解决方案。 问题答案: 看起来像是正确的大圆距查询。 您对WRT的准确性有何看法?