R - 将 SpatialLines 转换为栅格
R - convert SpatialLines into raster
在 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
?
我们可以简单地获取与沿线的每个点关联的字段值,但我正在寻找更通用的东西,它可以在线之间进行插值并在定义的域上生成完整的栅格。
您是否只能访问 rasterToContour()
创建的对象?
如果您仍然可以访问原始栅格,则可以先将等高线创建为完整的多边形(而不是将它们创建为线)。然后 "contourToRaster"-like 函数就是 rasterize()
(或 fasterize()
)。
从这里借用的一些代码:How does one turn contour lines into filled contours?
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)))
产生:
编辑:
如果你想插值,我喜欢罗伯特的方法。我会跳过 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)
请注意,这两种方法都依赖于对原始 raster
对象的访问。
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)
(如果你想跳过 rasterize 和 rasterToPoints(如 mikoontz 所建议的那样),你可以改为
#g <- geom(x)
#xyz = cbind(g[, c("x", "y")], x$value[g[,1]])
以更复杂的模型为代价)
现在插值,例如使用 Tps
library(fields)
tps <- Tps(xyz[,1:2], xyz[,3])
p <- raster(r)
p <- interpolate(p, tps)
m <- mask(p, r)
plot(m)
在 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
?
我们可以简单地获取与沿线的每个点关联的字段值,但我正在寻找更通用的东西,它可以在线之间进行插值并在定义的域上生成完整的栅格。
您是否只能访问 rasterToContour()
创建的对象?
如果您仍然可以访问原始栅格,则可以先将等高线创建为完整的多边形(而不是将它们创建为线)。然后 "contourToRaster"-like 函数就是 rasterize()
(或 fasterize()
)。
从这里借用的一些代码:How does one turn contour lines into filled contours?
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)))
产生:
编辑:
如果你想插值,我喜欢罗伯特的方法。我会跳过 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)
请注意,这两种方法都依赖于对原始 raster
对象的访问。
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)
(如果你想跳过 rasterize 和 rasterToPoints(如 mikoontz 所建议的那样),你可以改为
#g <- geom(x)
#xyz = cbind(g[, c("x", "y")], x$value[g[,1]])
以更复杂的模型为代价)
现在插值,例如使用 Tps
library(fields)
tps <- Tps(xyz[,1:2], xyz[,3])
p <- raster(r)
p <- interpolate(p, tps)
m <- mask(p, r)
plot(m)