我正在尝试使用 sf 包和管道/tidyverse 工作流来根据另一列中定义的组生成边界框。我认为它应该像下面那样工作,但似乎 st_bbox 不尊重群体。
我希望收到三个多边形记录,它们代表 a、b 和 c 的 proints 周围的边界框,但我收到三个多边形记录,它们代表所有点的边界框。
library(dplyr)
library(sf)
a <- data.frame(group=rep('a',100), lon=rnorm(100,11,.2), lat=rnorm(100,53,.2))
b <- data.frame(group=rep('b',100), lon=rnorm(100,11.5,.2), lat=rnorm(100,53.5,.2))
c <- data.frame(group=rep('c',100), lon=rnorm(100,12,.2), lat=rnorm(100,54,.2))
dat <- rbind(a,b,c)
pts <- dat %>% st_as_sf(coords=c('lon','lat'),crs=4326)
pts %>%
group_by(group) %>%
summarize(geometry = st_as_sfc(st_bbox(geometry)))
这将返回:
Simple feature collection with 3 features and 1 field
geometry type: POLYGON
dimension: XY
bbox: xmin: 10.34313 ymin: 52.43993 xmax: 12.54254 ymax: 54.54012
epsg (SRID): 4326
proj4string: +proj=longlat +datum=WGS84 +no_defs
# A tibble: 3 x 2
group geometry
<fct> <POLYGON [°]>
1 a ((10.34313 52.43993, 12.54254 52.43993, 12.54254 54.54012, 10.34313 54.54012, 10.34313 52...
2 b ((10.34313 52.43993, 12.54254 52.43993, 12.54254 54.54012, 10.34313 54.54012, 10.34313 52...
3 c ((10.34313 52.43993, 12.54254 52.43993, 12.54254 54.54012, 10.34313 54.54012, 10.34313 52...
最佳答案
一种选择是使用 tidyr::nest
使用嵌套数据框然后 purrr::map
.我还使用了一个包装函数来简化 map
称呼
library(tidyverse)
box_sf <- pts %>%
group_by(group) %>%
nest()
bbox_wrap <- function(x) st_as_sfc(st_bbox(x))
box_sf <- box_sf %>%
mutate(bbox = map(data, bbox_wrap))
这将为您提供一个边界框列表作为数据框的列。如果您想转换回
sf
对象你可以这样做:box_sf %>%
mutate(geometry = st_as_sfc(do.call(rbind, bbox))) %>%
select(-data, -bbox) %>%
st_as_sf()
似乎有点迂回,我希望看到使用
group_by
的解决方案正如你最初的意图
关于r - 使用 sf 创建表示子组边界框的多边形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54696440/