如何使用 R 中另一个星星对象的范围从一个星星对象中提取值?

How can I extract values from one stars object using the extent of another stars object in R?

我对在 R 中使用 stars 包还很陌生,但我在弄清楚如何创建一个 stars 对象 C 时遇到了麻烦,该对象 C 具有对象 A 的值但对象 B 的范围。具体来说,我有欧洲平均 spring 温度的地图(对象 A),我想使用包含落叶阔叶林(对象 B)的单独星星对象对其进行裁剪。

对象 A:https://i.stack.imgur.com/DQsZn.jpg

> CRU.SpringT.2009.2018_EU
stars object with 2 dimensions and 1 attribute
attribute(s):
                                   Min.  1st Qu.   Median     Mean  3rd Qu.     Max.   NA's
CRU.SpringT.2009.2018_EU.tif  -15.81895 1.201286 5.480992 4.979221 8.204463 17.55605 310479
dimension(s):
  from   to offset      delta refsys point values x/y
x    1 1440    -10  0.0416667 WGS 84 FALSE   NULL [x]
y    1  672     65 -0.0416667 WGS 84 FALSE   NULL [y]

对象 B:https://i.stack.imgur.com/6dons.jpg

> Dec.BL_EU3
stars_proxy object with 1 attribute in 1 file(s):
$Consensus_reduced_class_3.tif
[1] "[...]/Consensus_reduced_class_3.tif"

dimension(s):
   from    to offset       delta                       refsys point values x/y
x 20401 27600   -180  0.00833333 +proj=longlat +datum=WGS8... FALSE   NULL [x]
y  3001  6360     90 -0.00833333 +proj=longlat +datum=WGS8... FALSE   NULL [y]
call_list:
[[1]]
x[i = i, drop = drop, crop = crop]
attr(,".Environment")
<environment: 0x000002a17a1ecac0>

[[2]]
x[i = i, drop = drop, crop = crop]
attr(,".Environment")
<environment: 0x000002a178d61dc0>

[[3]]
e1/e2
attr(,".Environment")
<environment: 0x000002a177987b10>

两个对象都使用相同的 bbox 裁剪。目标是生成的对象(对象 C)具有 B 的范围,但温度值来自 A。

tif 文件的 Dropbox 链接:

对象 A:https://www.dropbox.com/s/lwvdxnis7k38e18/CRU.SpringT.2009.2018_EU.tif?dl=0

对象 B:https://www.dropbox.com/s/uybxk40z853mu7a/EU%20Dec%20Broadleaf.tif?dl=0

就是这样!使用这些文件要容易得多:-) 请在下面找到一种可能的解决方案来解决您的问题。它适用于我的电脑。我希望你也一样:-)

为了方便大家理解,我特意把代码写的详细了。当然,如果需要,您可以修改表格使其更紧凑。

伪代表!!

library(sf)
library(stars)
library(ggplot2)

A <- read_stars("CRU.SpringT.2009.2018_EU.tif")
B <- read_stars("consensus_full_class_3.tif")

# First step: Transform B to have the same extent and resolution of A
B_cropped_resample <- st_warp(B, A, use_gdal = TRUE)


# Second step: convert 0 to NA values in your object B (i.e. deciduous forests)
B_cropped_resample[B_cropped_resample == 0] <- NA # B should contain only NA and 1 values 


# Third step: convert B into `sf` object with 'points' geometry
B_cropped_resample_sf <- st_as_sf(B_cropped_resample, as_points = TRUE, na.rm = TRUE)


# Fourth step : extract values of object A with the object `B_cropped_resample_sf`
C <- st_extract(A, B_cropped_resample_sf) # C is a sf object which contains the 
                                          # values of A at the corresponding points

# Sixth step: convert 'sf' object back into stars 'object' and split 'sf' point 
# geometry into two 'stars' dimensions
C <- st_as_stars(C, name = attr(C, "CRU.SpringT.2009.2018_EU.tif", "geometry"))
C <- st_sfc2xy(C)


# Seventh step: plot the resulting 'stars' object which shows the temperatures (i.e.  
# values from object A) for each deciduous forest (i.e. locations from object B)
ggplot2::ggplot() + geom_stars(data = C) +
  coord_equal()

求运行代码后得到的图片: