更改 extent() 以在 RasterLayer 的特定网格上聚合

Posted

技术标签:

【中文标题】更改 extent() 以在 RasterLayer 的特定网格上聚合【英文标题】:changing extent() to aggregate over a specfic grid of a RasterLayer 【发布时间】:2020-02-15 22:09:03 【问题描述】:

我目前正在处理来自瑞士的一些分辨率为 100x100 米的数据。我想根据国家网格(坐标 f.i. x = 500000,y = 130000)将数据聚合到 1x1km,这与我的 RasterLayer 对象的原始范围不同。我已经为基于原始范围 (=r) 的 RasterLayer 和基于瑞士国家网格单元 (=r.agg) 的新范围的 RasterLayer 提供了一些代码,并在 r 上绘制了 r.agg(后者,其中我用红色着色以使边框更明显)。

library(raster)
ncol <- 3677 # same as original RasterLayer
nrow <- 2261 # same as original RasterLayer

## create raster (with original extent)
  r <- raster(ncol = ncol, nrow = nrow) # dimensions of raster
  mat <- matrix(runif(ncol*nrow, 0,2), ncol = ncol, nrow = nrow) # write data
  # create simplified country-borders / buffer
    mat [0:100, 0:ncol] <- NA
    mat [0:nrow, 0:100] <- NA
    mat [(nrow - 100):nrow, 0:ncol] <- NA
    mat [0:nrow, (ncol -100):ncol] <- NA

  r[] <- mat #write data to raster
  extent(r) <- matrix(c(479950, 73950, 847650, 300050), nrow = 2) # define extent 
  proj4string(r) <- "+proj=somerc +lat_0=46.95240555555556
   +lon_0=7.439583333333333 
   +k_0=1 +x_0=600000 +y_0=200000 
   +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 
   +units=m +no_defs"

## create raster (with customised extent)
  r.agg <- r # prepare aggregatable RasterLayer
  extent(r.agg) <- matrix(c(480000, 74000, 847700, 300100), nrow = 2)
  r.agg <- aggregate(r.agg, fact = 10, fun = mean)

  par(bg = 'darkgrey')
  plot(r, col = "red", legend = FALSE)
  plot(r.agg, add = TRUE)

但是,我不能完全确定正确解释结果: 在“r”上绘制的“r.agg”显示了一条我不太明白的红线。

选项 A(期望的结果):extent() 允许我在国家网格上聚合并在空间上正确的 100x100m 信息上聚合

选项 B(我希望不会发生):extent() 将让我在国家网格上进行聚合,但使用来自原始网格的数据,因此不是来自正确 100x100 方格的数据。

我没有发现extent() 的帮助页面特别有用,我很乐意得到一些澄清。如果选项 B 是这种情况(或者我完全误解了某些东西),如果有人可以帮助我解决这个问题,我会非常高兴。提前非常感谢,很抱歉我的措辞很奇怪,我是分析空间数据的新手。

【问题讨论】:

【参考方案1】:

这两个栅格不对齐,因此您不能仅依靠聚合。 你可以这样做

library(raster)
r <- raster(ncol = 3677, nrow = 2261, ext=extent(479950, 847650, 73950, 300050))
crs(r) <- "+proj=somerc +lat_0=46.95240555555556 +lon_0=7.439583333333333 +k_0=1 +x_0=600000 +y_0=200000 
   +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +units=m +no_defs"
r.agg <- raster(nrow=227, ncol=368, ext=extent(480000, 848000, 73100, 300100))

x <- resample(r, r.agg)

或者,有更多的控制权

r.low <- disaggregate(r.agg, 10)
r.low <- resample(r, r.low)
ra <- aggregate(r.low, 10, mean)

【讨论】:

非常感谢罗伯特,我不知道resample(),这帮了很多忙!

以上是关于更改 extent() 以在 RasterLayer 的特定网格上聚合的主要内容,如果未能解决你的问题,请参考以下文章

从 viewController 更改 UIColor 以在 UIView 类中使用

如何更改表以在现有列上添加约束

需要更改此 JQuery 代码以在处理之前检查元素是不是存在 [重复]

更改模型中的显示名称以在响应中显示

更改约束以在 swift iOS 中扩展视图

如何更改导航颜色以在网站上滚动?