如何将水体添加到栅格数据中?

问题描述 投票:0回答:1

我有一个栅格图层,它具有给定分辨率的纬度和经度,决定了网格单元的总数。我的目标是找到每个细胞到水体的距离。如何将水体纳入数据中?或者,我应该简单地获取栅格并将其添加到已有该数据的其他内容中吗?这有来源吗?谢谢!

顺便说一句,我确实尝试过谷歌搜索,但我看到的所有问题都复杂得多。我在下面分享了代码。

编辑:

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, ... 
r raster geography
1个回答
0
投票

鉴于您的 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 = "")

请注意,d2w 超出了 RasterBrick 的范围: 1

© www.soinside.com 2019 - 2024. All rights reserved.