我有一个包含网格的多个(正方形(多边形的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_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 函数,因此对时间和时尚的变幻莫测具有鲁棒性。
迭代行的最新 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"))