r - 使用 sf 创建表示子组边界框的多边形

标签 r dplyr sf

我正在尝试使用 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/

相关文章:

r - ggplot2 中的 geom_map 边界 - 重新审视

arrays - R中的累积多维数组和

r - 通过 RCurl 从 ftp 下载压缩文件

r - 使用 sf 调整质心空间多边形

r - 如何使用 rmarkdown 在 ioslides 演示文稿中制作可滚动幻灯片

r - 覆盖 left_join dplyr 来更新数据

r - 用 dplyr 从长到宽

r - 使用 sf 对多面几何进行分组(使用 R)

r - 从数百万个 GPS 坐标中确定国家的最快方法 [R]

使用自定义顺序对行重新排序