如何使用 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()
求运行代码后得到的图片:
我对在 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()
求运行代码后得到的图片: