R:将给定的 Box 分成 X 个具有给定对角线的新框
R: divide a given Box into X amount of new boxes with given diagonal
我有一个坐标为 (lon,lat) 的德国 Bbox:
g_bbox<-c(xmin=5.98865807458, ymin=47.3024876979, xmax=15.0169958839, ymax=54.983104153)
我想将 bbox 分成 (x) 个对角线为 50 km 的 bbox。
对角线的长度可能会略有不同(+/-10km).
生成的 BBox 不应重叠。
BBoxes 的数量 (x) 应该是适合 g_bbox[= 的 BBoxes 的最大数量11=]
我想要的结果在最好的情况下是一个包含 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-06-30 创建
我有一个坐标为 (lon,lat) 的德国 Bbox:
g_bbox<-c(xmin=5.98865807458, ymin=47.3024876979, xmax=15.0169958839, ymax=54.983104153)
我想将 bbox 分成 (x) 个对角线为 50 km 的 bbox。
对角线的长度可能会略有不同(+/-10km).
生成的 BBox 不应重叠。
BBoxes 的数量 (x) 应该是适合 g_bbox[= 的 BBoxes 的最大数量11=]
我想要的结果在最好的情况下是一个包含 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-06-30 创建