首页 > 解决方案 > 如何使用 postgis st_setvalue 更新磁贴中的所有单元格?

问题描述

我在启用 postgis 的数据库中有 2 个小栅格:一个 DEM 和一个流/池塘图层。两者都存储为 10x10 的图块,并且具有相同的 srid 和单元格大小。我想将溪流/池塘“燃烧”到 DEM(即光栅计算器)中。我尝试了 ST_MapAlgebra,但无法弄清楚如何忽略流/池塘层中的 nodata 单元。现在我正在尝试使用 ST_SetValue 简单地更新 DEM。以下代码似乎只更新每个图块的一个单元格(见图)。如果我不包含 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 中)

我得到了什么

标签: postgresqlcalculatorpostgisrastertiles

解决方案


这个功能解决了我的问题。它很慢,但我并不着急。我确信它可以改进。

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;

推荐阅读