Как использовать postgis st_setvalue для обновления всех ячеек в плитке? - PullRequest
0 голосов
/ 13 марта 2020

У меня есть 2 маленьких растра в базе данных с поддержкой postgis: матрица высот и слой потоков / прудов. Оба хранятся в виде плиток 10х10 и имеют одинаковый размер сетки и ячейки. Я хочу «сжечь» потоки / пруды в ЦМР (т.е. растровый калькулятор). Я попробовал ST_MapAlgebra, но не смог понять, как игнорировать ячейки узлов в слое stream / pond. Сейчас я пытаюсь просто обновить матрицу высот, используя ST_SetValue. Следующий код, по-видимому, обновляет только одну ячейку на плитку (см. Изображение). Если я не включаю предложение st_intersects (), оно выполняется вечно (даже если я передаю только одну точку для обновления одной ячейки). Я предполагаю, что это может сработать, если растры не будут храниться в виде тайлов, но я бы предпочел этого не делать.

update dem_clip d set rast = st_setvalue(d.rast, geom, st_value(d.rast,geom) - 1000)
from (select ((st_pixelascentroids(rast)).geom) from stream_clip) s
where st_intersects(d.rast,s.geom);

что я хочу (потоки записываются в DEM)

что я получаю

1 Ответ

0 голосов
/ 14 марта 2020

Эта функция решает мою проблему. Это медленно, но я не в ру sh. Я уверен, что это может быть улучшено.

CREATE OR REPLACE FUNCTION update_vals(g1 geometry, v1 integer)
 RETURNS void as $$
begin 
update dem_clip_test set rast = 
st_setvalue(rast, g1, 
st_value(rast,g1) + v1)
where st_intersects(rast,g1);
end;
$$ LANGUAGE plpgsql;

select update_vals(geom, -1000) from 
(select ((st_pixelascentroids(rast)).geom) from stream_clip) s;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...