我有一个栅格图层,它具有给定分辨率的纬度和经度,决定了网格单元的总数。我的目标是找到每个细胞到水体的距离。如何将水体纳入数据中?或者,我应该简单地获取栅格并将其添加到已有该数据的其他内容中吗?这有来源吗?谢谢!
顺便说一句,我确实尝试过谷歌搜索,但我看到的所有问题都复杂得多。我在下面分享了代码。
编辑:
dat<-load('path/data.Rdata')
dat
class : RasterBrick
dimensions : 229, 216, 49464, 52 (nrow, ncol, ncell, nlayers)
resolution : 0.508, 0.24 (x, y)
extent : -149.975, -40.247, 19.92736, 74.88736 (xmin, xmax, ymin,
ymax)
crs : +proj=longlat +datum=WGS84 +no_defs
source : memory
names : mallar3_p//.1.1.1.1.1, mallar3_p//.2.1.1.1.1,
mallar3_p//.1.2.1.1.1, mallar3_p//.2.2.1.1.1, mallar3_p//.1.1.2.1.1,
mallar3_p//.2.1.2.1.1, mallar3_p//.1.2.2.1.1, mallar3_p//.2.2.2.1.1,
mallar3_p//.1.1.1.2.1, mallar3_p//.2.1.1.2.1, mallar3_p//.1.2.1.2.1,
mallar3_p//.2.2.1.2.1, mallar3_p//.1.1.2.2.1, mallar3_p//.2.1.2.2.1,
mallar3_p//.1.2.2.2.1, ...
min values : 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, ...
max values : 0.0007933783, 0.0010485946,
0.0006397116, 0.0006564575, 0.0006783239,
0.0007855534, 0.0008396646, 0.0007511564,
0.0005148308, 0.0006255456, 0.0006670767,
0.0006578597, 0.0006157646, 0.0003092461,
0.0005634251, ...
鉴于您的 RasterBrick 有 52 层,并且您的预期分析尚不清楚,这里有一个通用方法,它将创建一个包含到最近水体的距离(以米为单位)的栅格对象。拥有一个带有距离值的单独栅格可以说更容易,然后您可以将其用作分析的基础。
rnaturalearth
包的湖泊数据。 rnaturalearth
还有河流数据等。如果需要,您可以使用任意数量的源数据制作复合SF。
由于您的 RasterBrick 的 CRS 是 WGS84/EPSG:4326,因此您需要确保其他数据具有相同的 CRS。在本例中,WGS84/EPSG:4326 是
rnaturalearth
数据的默认 CRS。
通过以下代码创建的距水体 RasterLayer 距离的像元与原始 RasterBrick 对象对齐。这可能是也可能不是您分析的最佳方法,但它确实使事情变得简单。此外,由于距给定像元最近的水体可能位于 RasterBrick 范围之外,因此使用
extend()
函数将水体 RasterLayer 填充 n 个像元(本例中为 10 个)。如有必要,您可以增加 extend()
值。
还有一点是
raster()
和 sp()
已被弃用,因此为了让您的工作面向未来,我鼓励您迁移到 terra
包。
library(rnaturalearth)
library(sf)
library(dplyr)
library(raster)
library(ggplot2)
# Download North America lakes and simplify
lakes_na <- ne_download(scale = 10,
type = "lakes_north_america",
category = "physical") |>
dplyr::select() |>
st_combine() |>
st_as_sf()
# Define the metadata variables from your example
nrow <- 229
ncol <- 216
nlayers <- 52
xmin <- -149.975
xmax <- -40.247
ymin <- 19.92736
ymax <- 74.88736
# Create a template for a water bodies RasterLayer based on your metadata
r <- raster(nrow = nrow, ncol = ncol,
xmn = xmin, xmx = xmax, ymn = ymin, ymx = ymax,
crs = "+proj=longlat +datum=WGS84 +no_defs")
# Extend template RasterLayer to account for water bodies near extent of your data
r <- extend(r, c(10, 10))
# Rasterize water bodies (lakes_na)
rw <- raster::rasterize(lakes_na, r, field = 1, background = NA)
# Calculate distance to the nearest water body
d2w <- distance(rw)
# Convert to df (for illustrative purposes)
d2w_df <- as.data.frame(d2w, xy = TRUE)
# Create polygon sf of extent of your RasterBrick (for illustrative purposes)
sf_poly <- st_as_sfc(st_bbox(c(xmin = xmin,
ymin = ymin,
xmax = xmax,
ymax = ymax))) |>
st_as_sf(crs = 4326)
ggplot() +
geom_tile(data = d2w_df,
aes(x = x, y = y, fill = layer)) +
geom_sf(data = sf_poly,
aes(colour = "RasterBrick extent"),
fill = NA,
linewidth = 1) +
scale_fill_continuous(name = "Distance to water (m)") +
scale_colour_discrete(name = "")