如何生成所有国家的 10x10km 网格单元?

How to generate 10x10km grid cells of all countries?

早上好,

我目前正在尝试将国家(无海洋)的 10x10(或 5x5)公里网格单元裁剪到边界。例如,参见尼日利亚的栅格栅格:Nigeria Grid Cells

计划 A: 我的计划是使用带有国家边界的 GADM 0 级地图 (https://gadm.org/data.html) 并相应地创建网格单元。

虽然 st-grid 命令很简单,但计算起来需要很长时间(尼日利亚 >30 小时)

 regions <- st_read("data/region/gadm36_0.shp") %>%
 st_transform("+proj=robin +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs") 
 
grid<- st_make_grid(regions %>%
                           st_union(), cellsize = c(10000, 10000), square = T) 

即使使用 R Studio Pro 服务器也需要很多时间...

有什么办法把它固定起来吗?

计划 B: 我的第二个计划是使用来自 https://figshare.com/articles/Global_10_x_10-km_grids_suitable_for_use_in_IUCN_Red_List_of_Ecosystems_assessments_vector_and_raster_format_/4653439 的 10x10km 网格栅格 并将其剪辑到 GADM 国家/地区形状文件。

问题是我无法将栅格数据文件加载到 R 中并使用 sf 包中的裁剪和掩码命令使其 运行。 有人知道如何制作这个 运行 吗?

PLAN C: 是否有针对已经存在的国家/地区的 10x10km 网格栅格文件?我知道 PRIO 的 50x50 网格,但没有找到好的解决方案。

非常感谢,希望你能帮我解决这个问题!

参考 PLAN A,而不是 sf::st_make_grid,您可以使用 stars::st_as_stars 创建光栅,然后使用 sf::st_as_sf 将其转换为多边形,尼日利亚需要 1-2 秒:

library(sf)
library(stars)
library(rnaturalearth)

# Polygon
world = ne_countries(scale = "small", returnclass = "sf")
world = st_transform(world, "+proj=robin +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs")
pol = world[world$sovereignt == "Nigeria", ]

# Make grid
grid = st_as_stars(st_bbox(pol), dx = 10000, dy = 10000)
grid = st_as_sf(grid)
grid = grid[pol, ]

# Plot
plot(st_geometry(grid), axes = TRUE, reset = FALSE)
plot(st_geometry(world), border = "grey", add = TRUE)
plot(st_geometry(pol), border = "red", add = TRUE)

参考PLAN B,10公里的光栅可以导入R,同样使用包stars进行裁剪,如下:

library(sf)
library(stars)
library(rnaturalearth)

# Raster
r = read_stars("AOOGrid_10x10kmRast/AOOGrid_10x10km.img")

# Polygon
world = ne_countries(scale = "small", returnclass = "sf")
world = st_transform(world, st_crs(r))
pol = world[world$sovereignt == "Nigeria", ]

# Crop
r = r[pol]

# Plot
plot(r, axes = TRUE, reset = FALSE)
plot(st_geometry(world), border = "grey", add = TRUE)
plot(st_geometry(pol), add = TRUE)