【问题标题】:R - convert SpatialLines into rasterR - 将 SpatialLines 转换为栅格
【发布时间】:2019-05-06 08:37:40
【问题描述】:

在 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)

在 R 中,有没有办法做相反的事情? contourToRaster 之类的东西?

我们可以简单地获取与线上每个点相关联的字段值,但我正在寻找更通用的东西,它可以在线之间进行插值并在定义的域上生成完整的栅格。

【问题讨论】:

    标签: r raster r-raster sp


    【解决方案1】:
    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)
    

    【讨论】:

    • 优秀。我喜欢这种方法的灵活性,因为一旦你有了点,手头就有多种插值方法(例如 - TPS、IDW、克里金法等)。
    【解决方案2】:

    您是否只能访问由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)))
    

    生产:

    编辑:

    如果您想进行插值,我喜欢 Robert 的处理方法。我会跳过 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 对象的访问。

    【讨论】:

    • 目标是从行 -> 点 -> 插值 -> 场。我喜欢你的方法,因为它有点快。我认为通过删除第一块代码和情节,将来阅读的人会改进这个答案。
    猜你喜欢
    • 1970-01-01
    • 2018-01-09
    • 1970-01-01
    • 1970-01-01
    • 2016-06-07
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多