使用 PostGIS 查找最小距离并更新列

Find minimum distance and update column with PostGIS

我需要帮助我的 PostGIS 数据库计算两点之间的距离。 目标是为“Dots”table 中的每一行找到与“reflayer”点中最近点的距离 table 并将其保存在“dist_from_ref”列中的 meter 中.

点数table结构为:

CREATE TABLE dots
(
    dot_id INT,
    site_id INT,
    latitude float ( 6 ),
    longitude float ( 6 ),
    rsrp float ( 6 ),
    dist INT,
    project_id INT,
    dist_from_site INT,
    geom geometry,
    dist_from_ref INT;
);

Relayer结构是:

CREATE TABLE reflayers 
(
    layer_name varchar,
    latitude float ( 6 ),
    longitude float ( 6 ) ,
    geom geometry
);

点table

Reflayer table

有没有人有解决方案可以用查询可以找到的最小距离更新“dist_from_ref”列?

编辑:

UPDATE dots d
SET dist_from_ref = 100 * ROUND (1000 * ST_Distance(d.geom, r.geom))
FROM reflayers r 
WHERE d.dist_from_ref IS NULL 
  AND r.geom = (SELECT r.geom
                FROM reflayers r 
                ORDER BY ST_Distance(d.geom, r.geom) ASC LIMIT 1);

此查询按我的意愿更新列,但它卡在我的 PostGIS 服务器上,有 60K 行。

我在 70 行上使用它并且工作正常,有什么改进建议吗?

前后

点table之前

点 table 后

文字table

dot_id | site_id | latitude  | longitude |  rsrp  | project_id | dist_from_site | dist_from_ref |                        geom
--------+---------+-----------+-----------+--------+------------+----------------+---------------+----------------------------------------------------
      1 |   42047 | 31.902857 | 34.919445 |  -90.9 |          1 |             21 |          7200 | 0101000020E6100000F5F6E7A221E73F4041BCAE5FB0754140
      2 |   42047 | 31.902857 | 34.919445 |  -89.5 |          1 |             21 |          7200 | 0101000020E6100000F5F6E7A221E73F4041BCAE5FB0754140
      3 |   42047 | 31.902857 | 34.919445 |  -89.5 |          1 |             21 |          7200 | 0101000020E6100000F5F6E7A221E73F4041BCAE5FB0754140

将子查询放在 SELECT 子句中并将其引用到外部查询的每一行,例如

SELECT *,(
  SELECT min(ST_Distance(d.geom, r.geom))
  FROM reflayers r) as distance
FROM dots d;

要更新也一样..

UPDATE dots SET dist_from_ref = (
  SELECT min(ST_Distance(dots.geom, r.geom))
  FROM reflayers r)

注意:根据 table 大小,此操作可能会变得非常耗时。由于您无法连接两个 table,您让查询 运行 对 refLayers 的每个记录进行完整扫描,以便 dots 上的每个记录找到最近的距离。