使用 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
上的每个记录找到最近的距离。
我需要帮助我的 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
上的每个记录找到最近的距离。