通过最近邻居3D距离更新点

时间:2018-10-11 22:50:49

标签: postgresql postgis

此问题的后续解答:ST_3DClosestPoint returning multiple points

1)我有一个xyz目标点存储为geom,我想将3Ddistance的行更新到另一个表中最接近的obs点。因此,找到最近的观测点,然后用距离更新目标点。

目标点的预期结果: id | geom | 3Ddistance_To_Nearest_Point_In_Obs_Table

obs表: id | geom 例如100条记录

2)为了使事情复杂化,我还想从obs表中选择n个邻居(例如说10个),并计算平均距离并更新目标表。

预期目标结果: id | geom | average_3Ddistance

我一直在尝试改变前面的示例,但是不高兴,有什么想法吗?

谢谢

1 个答案:

答案 0 :(得分:0)

如果集合是静态的,那么您可以CTAS(作为选择创建表)结果,而不是对其进行更新。

create table new_table as
select t2.id, t2.geom, min(3ddistance) min_3DDistance, avg(3ddistance) avg_3ddistance
  from target t2,
  lateral (select t.id, st_3ddistance(o.geom, t.geom) 3ddistance
             from obs o, target t
            where t2.id=t.id
            order by st_3ddistance(o.geom, t.geom) limit 10) a
 group by t2.id, t2.geom;

或者如果您想更新

update target
   set (average_3ddistance, min_3ddistance)=(
  from (select id, min(3ddistance) min_3DDistance, avg(3ddistance) avg_3ddistance
          from (select t.id, st_3ddistance(o.geom, t.geom) 3ddistance
                  from obs o, target t
                 where t2.id=t.id
                 order by st_3ddistance(o.geom, t.geom) limit 10) a
         group by id) b
 where b.id=t.id;