如何使用 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 函数,因此可以稳健地应对时间和时尚的变幻莫测。