我在PostGIS中有两个点表,比如A和B,我想知道,对于A中的每个点,距离B中最近点的距离是多少。我能够解决这个问题。使用以下查询进行分析:
let headers = ["Authorization": "Token \(token!)"]
但是,我在每个表中都有几百万个点,这个查询无限期地运行。有没有更有效的方法来解决这个问题。我愿意接近一个大致的距离,而不是一个确切的距离。
编辑:对JGH提供的答案进行略微修改,以便在未投影点的情况下以米为单位返回距离而非度数。
SELECT a.id, MIN(ST_Distance_Sphere(a.geom, b.geom))
FROM table_a a, table_b b
GROUP BY a.id;
答案 0 :(得分:4)
您的查询速度很慢,因为它在不使用任何索引的情况下计算每个点之间的距离。如果在order by
子句中使用,您可以重写它以使用使用索引的<->
运算符。
select a.id,closest_pt.id, closest_pt.dist
from tablea a
CROSS JOIN LATERAL
(SELECT
id ,
a.geom <-> b.geom as dist
FROM tableb b
ORDER BY a.geom <-> b.geom
LIMIT 1) AS closest_pt;