簡體   English   中英

計算柵格中 NA 和非 NA 值的數量,但具有新的分辨率和范圍

[英]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 都會有所不同。

以下是示例輸出,加載和未加載值:

terra::resample with averaging沒有數據加載到 memory

terra::resample 平均加載數據memory

示例數據

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”選項。

針對您的評論:當我使用文件作為數據源時, sumaverage得到相同的結果:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM