更改 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 类中使用