代码之家  ›  专栏  ›  技术社区  ›  Rich Pauloo Yan Zhang

R-将空间线转换为光栅

  •  16
  • Rich Pauloo Yan Zhang  · 技术社区  · 6 年前

    在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

    在R中,有没有一种方法可以做相反的事情?类似的东西 contourToRaster ?

    我们可以简单地获取与直线上每个点相关联的字段值,但我正在寻找更一般的方法,在直线之间插入,并在定义的域上生成完整的光栅。

    2 回复  |  直到 6 年前
        1
  •  7
  •   Robert Hijmans    6 年前
    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)
    

    (如果你想跳过光栅和光栅眼(正如米库茨建议的那样),你可以这样做。

    #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)
    
        2
  •  3
  •   mikoontz    6 年前

    您只能访问由创建的对象吗 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

    编辑:

    如果你想插补的话,我喜欢罗伯特的方法。我会跳过 rStruz() 步骤可能非常慢,有利于将多行线直接投射到点:

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