的R - 转换SpatialLines成光栅

问题描述 投票:16回答:2

在R,我们可以采取raster并把它变成与功能SpatialLinesDataFrame一个rasterToCountour

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)

enter image description here

Within R, is there a way to do the opposite? Something like contourToRaster?

我们可以简单地用抢沿线各点相关的字段值,但我正在寻找的东西更普遍的是,线之间进行插值并在定义域生产的全光栅。

r raster r-raster sp
2个回答
7
投票
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)

(如果你想跳过光栅化和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)

3
投票

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

如果您仍然可以访问原来的光栅,您可以创建(而不是创建为线)的轮廓为完整的多边形第一。那么“contourToRaster”般的功能仅仅是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)))

生产:

enter image description here

编辑:

我很喜欢罗伯特的方法来此,如果你想进行插值。我会跳过rasterize()一步,它可以是相当缓慢的,有利于铸造multilinestrings直接点:

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对象。

© www.soinside.com 2019 - 2024. All rights reserved.