Обновление точки ближайшим соседом 3Ddistance - PullRequest
0 голосов
/ 12 октября 2018

Продолжение этого вопроса: ST_3DClosestPoint, возвращающий несколько точек

1) У меня есть целевая точка xyz, сохраненная в виде geom, я хочу обновить строку с 3D-расстоянием доближайшая точка наблюдения в другой таблице.Поэтому найдите ближайшую точку наблюдения, а затем обновите целевую точку на расстоянии.

ожидаемый результат для целевой точки: id | geom | 3Ddistance_To_Nearest_Point_In_Obs_Table

таблица obs: id | geom, например, 100 записей

2) Чтобы усложнить ситуацию, я также хочу выбрать n-соседей из таблицы obs (скажем, например, 10) и вычислить среднее расстояние и обновить целевую таблицу.

ожидаемый целевой результат: id | geom | average_3Ddistance

Я пытался изменить первый пример, но без радости, есть идеи?

Спасибо

1 Ответ

0 голосов
/ 13 октября 2018

Если коллекции статичны, вы можете вместо результатов обновить 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;
...