【问题标题】:How to create a raster from a data frame in r?如何从r中的数据框创建栅格?
【发布时间】:2013-10-28 04:48:47
【问题描述】:

我有一个数据框,其中为笛卡尔坐标 (x, y) 指定了值 (l),如下面的最小工作示例所示。

set.seed(2013)
df <- data.frame( x = rep( 0:1, each=2 ),
                  y = rep( 0:1,  2),
                  l = rnorm( 4 ))

df
#   x y           l
# 1 0 0 -0.09202453
# 2 0 1  0.78901912
# 3 1 0 -0.66744232
# 4 1 1  1.36061149

我想使用 raster 包创建一个光栅,但是我阅读文档并没有发现一种简单的方法来以我拥有的形式将数据加载到光栅单元中。我想出了几种使用 for 循环的方法,但我怀疑我缺少一种更直接的方法。

【问题讨论】:

    标签: r raster


    【解决方案1】:

    存在一个更简单的解决方案

     library(raster)
     dfr <- rasterFromXYZ(df)  #Convert first two columns as lon-lat and third as value                
     plot(dfr)
     dfr                  
     class       : RasterLayer 
     dimensions  : 2, 2, 4  (nrow, ncol, ncell)
     resolution  : 1, 1  (x, y)
     extent      : -0.5, 1.5, -0.5, 1.5  (xmin, xmax, ymin, ymax)
     coord. ref. : NA 
     data source : in memory
     names       : l 
     values      : -2.311813, 0.921186  (min, max)
    

    此外,您可以指定 CRS 字符串。详细讨论可here.

    【讨论】:

    • 如果出现错误应该怎么办:Error in rasterFromXYZ() : x cell sizes are not regular?我相信它来了,因为我必须改变点的随机分布,而且我不知道如何进行
    【解决方案2】:

    这是一种方法,通过SpatialPixelsDataFrame

    library(raster)
    # create spatial points data frame
    spg <- df
    coordinates(spg) <- ~ x + y
    # coerce to SpatialPixelsDataFrame
    gridded(spg) <- TRUE
    # coerce to raster
    rasterDF <- raster(spg)
    rasterDF
    # class       : RasterLayer 
    # dimensions  : 2, 2, 4  (nrow, ncol, ncell)
    # resolution  : 1, 1  (x, y)
    # extent      : -0.5, 1.5, -0.5, 1.5  (xmin, xmax, ymin, ymax)
    # coord. ref. : NA 
    # data source : in memory
    # names       : l 
    # values      : -0.6674423, 1.360611  (min, max)
    

    help('raster') 描述了许多从不同类的对象创建栅格的方法。

    【讨论】:

    • 下面的答案更简洁,可能计算效率更高。 @Gregory 请重新考虑哪个是正确答案!
    【解决方案3】:

    更新这个对应于@zubergu 关于光栅化不规则数据。

    所以我根据下面的链接改编的答案可能更容易理解:

    library(raster)
    library(rasterize)
    
    # Suppose you have a dataframe like this
    lon <- runif(20, -180, 180)
    lat <- runif(20, -90, 90)
    vals <- rnorm(20)
    df <- data.frame(lon, lat, vals)
    
    # will need to rename colnames for raster
    colnames(df) <- c('x', 'y', 'vals')
    
    # create a raster object
    r_obj <- raster(xmn=-180, xmx=180, ymn=-90, ymx=90, resolution=c(5,5))
    
    # use rasterize to create desired raster
    r_data <- rasterize(x=df[, 1:2], # lon-lat data
                        y=r_obj, # raster object
                        field=df[, 3], # vals to fill raster with
                        fun=mean) # aggregate function
    
    plot(r_data)
    

    原始回复:

    对于那些喜欢@yuliaUU 希望将不规则数据转换为栅格的人,请参阅@RobertH 的回答here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-21
      • 1970-01-01
      • 2015-09-13
      • 2014-12-04
      • 1970-01-01
      • 2021-01-20
      相关资源
      最近更新 更多