[英]Calculate number of NA and non-NA values in a raster but with new resolution and extent
我需要計算原始分辨率為 1 x 0.00811 但聚合到 2 度並具有新范圍的柵格中 NA 和非 NA 值的數量。
原始柵格(可在此處獲得: https://datadryad.org/stash/dataset/doi:10.5061/dryad.052q5 ,參見 output 1)與另一個數據集(不幸的是,不是開源的)合並以在 Output 中生成柵格2:
Output 1
class : RasterLayer
dimensions : 19142, 35738, 684096796 (nrow, ncol, ncell)
resolution : 0.01, 0.00811 (x, y)
extent : -178.6931, 178.6869, -65.29534, 89.94628 (xmin, xmax, ymin, ymax)
crs : +proj=longlat +datum=WGS84 +no_defs
source : HumanFootprintWGS84.tif
names : HumanFootprintWGS84
values : 0, 50 (min, max)
Output 2
dimensions : 19142, 35738, 684096796 (nrow, ncol, ncell)
resolution : 0.01, 0.00811 (x, y)
extent : -178.6931, 178.6869, -65.29534, 89.94628 (xmin, xmax, ymin, ymax)
crs : +proj=longlat +datum=WGS84 +no_defs
source : r_tmp_2022-02-10_145403_42352_01781.grd
names : layer
values : 0.6730382, 1 (min, max)
我用於重新采樣的柵格是一個虛擬柵格,如下所示:
Output 3
class : RasterLayer
dimensions : 65, 180, 11700 (nrow, ncol, ncell)
resolution : 2, 2 (x, y)
extent : -180, 180, -65, 65 (xmin, xmax, ymin, ymax)
crs : +proj=longlat +datum=WGS84 +no_defs
不幸的是,合並並因此重新采樣的柵格在海岸線和湖泊附近有很多 NA 值; st_warp
中的平均方法將 NA 值轉換為 0,這會扭曲某些單元格的平均值計算。
我決定通過將平均值乘以非 NA 值的數量/(非 NA 的數量 - NA 的數量)來調整平均產生的值,即:
平均值 x {非 NA 值的數量/(非 NA 值的數量/ NA 值的數量)}
為此,我需要知道非 NA 和 NA 值的數量是原始合並柵格(輸出 2),但分辨率為 2 度,范圍為 Output 3(-180、180、-65、65)。
我是地圖和柵格的新手,如果這是一個基本問題,我深表歉意。
我試圖用原始數據集和虛擬網格的坐標進行柵格化,但這不會讓我得到 NA 值的數量,只是像元的數量(加上合並的柵格超過 5.1 Gb)。 我試圖修剪 NA 值(愚蠢的想法)和st_warp
但沒有平均(無論如何使用最近的鄰居)。
如果有人有任何想法或有更優雅的解決方案,我將不勝感激。
真誠地感謝你,
編輯:通過反復試驗,我發現無論值是否加載到 memory 中,重新采樣(再次感謝您,@Robert Hijmans)和 st_warp 都會有所不同。
以下是示例輸出,加載和未加載值:
示例數據
library(terra)
#terra 1.5.20
library(geodata)
w <- world(path=".")
# input raster
x <- rast(res=3)
x <- rasterize(w, x, field=1)
# output raster
r <- rast(res=10)
解決方案:
rs <- resample(x, r, "sum")
rs
#class : SpatRaster
#dimensions : 18, 36, 1 (nrow, ncol, nlyr)
#resolution : 10, 10 (x, y)
#extent : -180, 180, -90, 90 (xmin, xmax, ymin, ymax)
#coord. ref. : lon/lat WGS 84
#source : memory
#name : layer
#min value : 0.1111111
#max value : 11.11111
plot(rs)
為此,您需要terra 1.5.20
。 那就是目前的開發版。 在 Windows 或 OSX 上安裝它的最簡單方法是使用install.packages('terra', repos='https://rspatial.r-universe.dev')
terra
的早期版本忽略“sum”選項。
針對您的評論:當我使用文件作為數據源時, sum
和average
得到相同的結果:
xx <- writeRaster(x, "test.tif", overwrite=T)
rs <- resample(xx, r, "sum")
我們可以將結果與多邊形的精確提取進行比較(這也有效,但會在大數據集上阻塞 R)
p <- as.polygons(r)
e <- extract(x, p, exact=TRUE, fun=sum, na.rm=TRUE)
re <- rast(r)
re[e[,1]] <- e[,2]
plot(rs, re, xlab="resample", ylab="extract")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.