如何使用 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 的网格。现在我正在寻找一种方法来为每个正方形多边形获取两个坐标对,它们定义了边界框 - 最好在新列中。

我希望我的意思很清楚。我非常感谢您的帮助。

给定您的ch_gridsfc对象,此单行:

> 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 函数,因此对时间和时尚的变幻莫测具有鲁棒性。

迭代行的最新 tidyverse 模式是使用dplyr::mutate(new_col = purrr::map(existing_col, func)),它适用于空间对象,包括sf对象中的geometry列。

因此,像这样为每行返回边界框和网格布局:

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"))

最新更新