如何使用 R 以行方式提取边界框?
How can I extract bounding boxes in a row-wise manner using R?
我有一个 sf 对象,其中包含网格的多个(正方形)多边形。我想要的是为每个多边形获取一个包含四个值的列,这些值定义边界框(左下角和右上角)。
这里以瑞士苏黎世州为例:
library(raster)
library(sf)
library(dplyr)
ch <- getData('GADM', country = 'CH', level = 1)
ch_grid <- ch %>%
st_as_sf() %>%
filter(NAME_1 == "Zürich") %>%
st_make_grid(cellsize = 0.1, what = "polygons")
这给了我一个 6x7 的网格。现在我正在寻找一种方法来为每个正方形多边形获取两个坐标对,它们定义了边界框 - 最好在新列中。
我希望你明白我的意思。非常感谢您的帮助。
用于迭代行的 newest tidyverse pattern 使用 dplyr::mutate(new_col = purrr::map(existing_col, func))
,它适用于空间对象,包括 sf
对象中的 geometry
列。
所以像这样 return 每行的边界框和网格布局:
library(purrr)
ch_grid <- ch %>%
st_as_sf() %>%
mutate(bbox = map(geometry, st_bbox),
grid = map(geometry, ~ st_make_grid(., cellsize = 0.1, what = "polygons")))
如果不想用purrr::map()
,lapply()
可以代入:
ch_grid <- ch %>%
st_as_sf() %>%
mutate(bbox = lapply(geometry, st_bbox),
grid = lapply(geometry, st_make_grid, cellsize = 0.1, what = "polygons"))
给定你的 ch_grid
sfc
对象,这个一行:
> ch_grid_df = cbind(st_sf(geometry=ch_grid),do.call(rbind,lapply(ch_grid, st_bbox)))
根据需要创建一个包含四列的 sf
数据框:
> ch_grid_df
Simple feature collection with 42 features and 4 fields
geometry type: POLYGON
dimension: XY
bbox: xmin: 8.358933 ymin: 47.16357 xmax: 9.058933 ymax: 47.76357
epsg (SRID): 4326
proj4string: +proj=longlat +datum=WGS84 +no_defs
First 10 features:
xmin ymin xmax ymax ch_grid
1 8.358933 47.16357 8.458933 47.26357 POLYGON ((8.358933 47.16357...
2 8.458933 47.16357 8.558933 47.26357 POLYGON ((8.458933 47.16357...
3 8.558933 47.16357 8.658933 47.26357 POLYGON ((8.558933 47.16357...
4 8.658933 47.16357 8.758933 47.26357 POLYGON ((8.658933 47.16357...
5 8.758933 47.16357 8.858933 47.26357 POLYGON ((8.758933 47.16357...
6 8.858933 47.16357 8.958933 47.26357 POLYGON ((8.858933 47.16357...
这只使用基本的 R 函数,因此可以稳健地应对时间和时尚的变幻莫测。
我有一个 sf 对象,其中包含网格的多个(正方形)多边形。我想要的是为每个多边形获取一个包含四个值的列,这些值定义边界框(左下角和右上角)。
这里以瑞士苏黎世州为例:
library(raster)
library(sf)
library(dplyr)
ch <- getData('GADM', country = 'CH', level = 1)
ch_grid <- ch %>%
st_as_sf() %>%
filter(NAME_1 == "Zürich") %>%
st_make_grid(cellsize = 0.1, what = "polygons")
这给了我一个 6x7 的网格。现在我正在寻找一种方法来为每个正方形多边形获取两个坐标对,它们定义了边界框 - 最好在新列中。
我希望你明白我的意思。非常感谢您的帮助。
用于迭代行的 newest tidyverse pattern 使用 dplyr::mutate(new_col = purrr::map(existing_col, func))
,它适用于空间对象,包括 sf
对象中的 geometry
列。
所以像这样 return 每行的边界框和网格布局:
library(purrr)
ch_grid <- ch %>%
st_as_sf() %>%
mutate(bbox = map(geometry, st_bbox),
grid = map(geometry, ~ st_make_grid(., cellsize = 0.1, what = "polygons")))
如果不想用purrr::map()
,lapply()
可以代入:
ch_grid <- ch %>%
st_as_sf() %>%
mutate(bbox = lapply(geometry, st_bbox),
grid = lapply(geometry, st_make_grid, cellsize = 0.1, what = "polygons"))
给定你的 ch_grid
sfc
对象,这个一行:
> ch_grid_df = cbind(st_sf(geometry=ch_grid),do.call(rbind,lapply(ch_grid, st_bbox)))
根据需要创建一个包含四列的 sf
数据框:
> ch_grid_df
Simple feature collection with 42 features and 4 fields
geometry type: POLYGON
dimension: XY
bbox: xmin: 8.358933 ymin: 47.16357 xmax: 9.058933 ymax: 47.76357
epsg (SRID): 4326
proj4string: +proj=longlat +datum=WGS84 +no_defs
First 10 features:
xmin ymin xmax ymax ch_grid
1 8.358933 47.16357 8.458933 47.26357 POLYGON ((8.358933 47.16357...
2 8.458933 47.16357 8.558933 47.26357 POLYGON ((8.458933 47.16357...
3 8.558933 47.16357 8.658933 47.26357 POLYGON ((8.558933 47.16357...
4 8.658933 47.16357 8.758933 47.26357 POLYGON ((8.658933 47.16357...
5 8.758933 47.16357 8.858933 47.26357 POLYGON ((8.758933 47.16357...
6 8.858933 47.16357 8.958933 47.26357 POLYGON ((8.858933 47.16357...
这只使用基本的 R 函数,因此可以稳健地应对时间和时尚的变幻莫测。