R:将给定的 Box 分成 X 个具有给定对角线的新框

问题描述

我有一个带有坐标 (lon,lat) 的德国 BBox

g_bBox<-c(xmin=5.98865807458,ymin=47.3024876979,xmax=15.0169958839,ymax=54.983104153)

我想将 bBox 分成 (x) 个 bBox,每个 bBox 的对角线为 50 公里

对角线的长度可能会有所不同(+/-10km)

生成的 BBox 不应重叠。

BBox数量 (x) 应该是 g_bBox

中 BBox 的最大数量

我想要的结果最好是带有 xmin,ymin,xmax,ymax 列的数据框。

我该怎么做?

解决方法

我会建议以下解决方案。

加载包

library(sf)
#> Linking to GEOS 3.9.0,GDAL 3.2.1,PROJ 7.2.1

加载数据

g_bbox <- st_bbox(c(xmin = 5.98865807458,ymin = 47.3024876979,xmax = 15.0169958839,ymax = 54.983104153),crs = 4326)

使用投影坐标将 bbox 转换为多边形

g_poly <- st_as_sfc(g_bbox) %>%
  st_transform(32632)

剧情

mapview::mapview(g_poly)

创建网格

g_grid <- st_make_grid(g_poly,cellsize = 50000 / sqrt(2))

检查一条对角线

sqrt(
  (st_bbox(g_grid[[1]])[3] - st_bbox(g_grid[[1]])[1]) ^ 2 # x axis
  +
  (st_bbox(g_grid[[1]])[4] - st_bbox(g_grid[[1]])[2]) ^ 2 # y axis
)
#>  xmax 
#> 50000

剧情

mapview::mapview(g_grid)

估计所有bbox

head(do.call("rbind",lapply(g_grid %>% st_transform(4326),st_bbox)))
#>          xmin     ymin     xmax     ymax
#> [1,] 5.970445 47.30249 6.455849 47.63163
#> [2,] 6.440454 47.31382 6.923301 47.64117
#> [3,] 6.910729 47.32325 7.390967 47.64877
#> [4,] 7.381223 47.33077 7.858798 47.65445
#> [5,] 7.851885 47.33638 8.326746 47.65819
#> [6,] 8.322667 47.34009 8.794764 47.66001

reprex package (v2.0.0) 于 2021 年 6 月 30 日创建