postgresql - 如何使用 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);
解决方案
这个功能解决了我的问题。它很慢,但我并不着急。我确信它可以改进。
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;
推荐阅读
- r - R数据帧中的字符串操作
- clojure - 当我从处理程序访问 reitit 路由信息时避免循环依赖
- rundeck - Rundeck 手动节点订购
- python - 没有这样的文件或目录(python 中的新功能)
- php - 如何在执行某些任务之前检查两个 sql 表中是否存在数据
- javascript - 如何将动态列和行数据推送到antd表
- azure - 适用于 Linux 容器的 Azure 应用服务“始终开启”功能
- java - 如何将文件写入 ubuntu linux 服务器?爪哇 11
- amazon-web-services - AWS Certificate Manager - 如何为内部 ALB 创建公有证书?
- node.js - Node.js 从 Readable 检查 csv 编码