Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 如何使用postgis st_setvalue更新平铺中的所有单元格?_Postgresql_Calculator_Postgis_Raster_Tiles - Fatal编程技术网

Postgresql 如何使用postgis st_setvalue更新平铺中的所有单元格?

Postgresql 如何使用postgis st_setvalue更新平铺中的所有单元格?,postgresql,calculator,postgis,raster,tiles,Postgresql,Calculator,Postgis,Raster,Tiles,我在支持postgis的db中有两个小光栅:一个DEM和一个streams/ponds图层。两者都存储为10x10瓷砖,具有相同的srid和单元大小。我想将溪流/池塘“燃烧”到DEM中(即光栅计算器)。我尝试了ST_MapAlgebra,但不知道如何忽略流/池层中的nodata单元。现在我尝试使用ST_SetValue简单地更新DEM。以下代码显示为每个磁贴仅更新一个单元格(请参见图)。如果我不包含st_intersects()子句,它将永远运行(即使我只传入一个点来更新单个单元格)。我想如果光

我在支持postgis的db中有两个小光栅:一个DEM和一个streams/ponds图层。两者都存储为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);


此函数解决了我的问题。很慢,但我不着急。我相信这是可以改进的

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;