R - 将SpatialLines转换为栅格

18
在 R 中,我们可以使用函数 rasterToCountour 将一个 raster 转换成一个 SpatialLinesDataFrame
library(raster)
f <- system.file("external/test.grd", package="raster")
r <- raster(f)
x <- rasterToContour(r)
class(x)

[1] "SpatialLinesDataFrame"
attr(,"package")
[1] "sp"

spplot(x)

在此输入图片描述

R语言中是否有相反的方法?类似于contourToRaster这样的东西?

我们可以简单地获取沿线每个点关联的字段值,但我正在寻找一些更普遍的方法,它在线之间进行插值并生成定义域上的完整栅格。

2个回答

8
library(raster)
f <- system.file("external/test.grd", package="raster")
r <- raster(f)
x <- rasterToContour(r)

您可以将值栅格化。在这种情况下,需要先从因子标签中提取它们。
x$value <- as.numeric(as.character(x$level))
rr <- rasterize(x, r, "value")

然后提取单元格值并进行插值

xyz <- rasterToPoints(rr)

(如果您想跳过像mikoontz建议的栅格化和rasterToPoints,您可以改为执行)
#g <- geom(x) 
#xyz = cbind(g[, c("x", "y")], x$value[g[,1]])

以更复杂的模型为代价(at the expense of a more complex model)。
现在进行插值,例如使用Tps。
library(fields) 
tps <- Tps(xyz[,1:2], xyz[,3])
p <- raster(r)
p <- interpolate(p, tps)

m <- mask(p, r)
plot(m)

非常好。我喜欢这种方法的灵活性,因为一旦你有了点,就有各种插值方法可供选择(例如TPS、IDW、Kriging等)。 - Rich Pauloo

3

你只能访问由rasterToContour()创建的对象吗?

如果您仍然可以访问原始光栅图像,则可以首先将轮廓作为完整的多边形创建(而不是将其创建为线条)。然后,“contourToRaster”类似的函数就是rasterize()(或fasterize())。

从这里借鉴了一些代码:如何将等高线转换为填充等高线?

library(fasterize)

rc <- cut(r, breaks= 10)
cut_vals <- cut(r[], breaks = 10, dig.lab = 5)

pols <- rasterToPolygons(rc, dissolve=T) %>% 
  st_as_sf()

r_template <- raster(pols, res = res(r))
back_to_raster <- fasterize(pols, r_template, field = "layer") 

par(oma = c(0, 0, 0, 5))
plot(back_to_raster, legend = FALSE)
plot(back_to_raster, legend.only=TRUE, legend.width = 1,
     axis.args=list(at=1:nlevels(cut_vals),
                    labels=levels(cut_vals)))

生成:

enter image description here

编辑:

如果你想进行插值,我喜欢罗伯特的方法。我建议直接将多线字符串转换为点,而不是使用相对较慢的rasterize()步骤:

library(tidyverse)
library(sf)
library(raster)
library(fields)

f <- system.file("external/test.grd", package="raster")
r <- raster(f)
x <- rasterToContour(r)
class(x)

x_sf <- x %>% st_as_sf() %>% st_cast("LINESTRING") %>% st_cast("MULTIPOINT") %>% st_cast("POINT")

tps <- Tps(x = st_coordinates(x_sf), Y = as.numeric(as.character(x_sf$level)))

p <- interpolate(r, tps) %>% mask(r)

plot(p)

enter image description here

请注意,这两种方法都依赖于对原始raster对象的访问。

目标是从线条 -> 点 -> 插值 -> 场。我喜欢你的方法,因为它更快一些。我认为通过删除第一段代码和图表,这个答案将对未来的读者有所改进。 - Rich Pauloo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接