将 POLYGON 聚合为 MULTIPOLYGON 并保留 data.frame

Jot*_* eN 6 aggregate r spatial r-sf

我有一个sfPOLYGON 几何类型的对象。我想使用分组属性 (group_attr) 将这些多边形聚合到 MULTIPOLYGON 中,并将新的 MULTIPOLYGON 对象与属性表连接起来。因此,作为结果,我将拥有一个sf两行三列的对象(group_attr、second_attr、geometry)。我已经尝试过使用st_cast- 它适用于sfc对象,但不适用于sf对象。是否可以使用sf包来做到这一点?

p1 <- rbind(c(0,0), c(1,0), c(3,2), c(2,4), c(1,4), c(0,0))
pol1 <-st_polygon(list(p1))
p2 <- rbind(c(3,0), c(4,0), c(4,1), c(3,1), c(3,0))
pol2 <-st_polygon(list(p2))
p3 <- rbind(c(4,0), c(4,1), c(5,1), c(5,0),c(4,0))
pol3 <-st_polygon(list(p3))
p4 <- rbind(c(3,3), c(4,2), c(4,3), c(3,3))
pol4 <-st_polygon(list(p4))

d <- data.frame(group_attr = c(1, 1, 2, 2), 
                second_attr = c('forest', 'forest', 'lake', 'lake'))
d$geometry <- st_sfc(pol1, pol2, pol3, pol4)
df<- st_as_sf(d)
plot(df)
df

Simple feature collection with 4 features and 2 fields
geometry type:  POLYGON
dimension:      XY
bbox:           xmin: 0 ymin: 0 xmax: 5 ymax: 4
epsg (SRID):    NA
proj4string:    NA
  group_attr second_attr                       geometry
1          1      forest POLYGON((0 0, 1 0, 3 2, 2 4...
2          1      forest POLYGON((3 0, 4 0, 4 1, 3 1...
3          2        lake POLYGON((4 0, 4 1, 5 1, 5 0...
4          2        lake  POLYGON((3 3, 4 2, 4 3, 3 3))
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

Jot*_* eN 6

基于https://github.com/r-spatial/sf/issues/634#issuecomment-365151794的新方法:

library(dplyr)

df_new <- df %>%
  group_by(group_attr) %>%
  summarise_all(first) 
df_new

Simple feature collection with 2 features and 2 fields
geometry type:  MULTIPOLYGON
dimension:      XY
bbox:           xmin: 0 ymin: 0 xmax: 5 ymax: 4
epsg (SRID):    NA
proj4string:    NA
# A tibble: 2 x 3
  group_attr second_attr                                                        geometry
       <dbl> <fct>                                                        <MULTIPOLYGON>
1       1.00 forest      (((3 0, 3 1, 4 1, 4 0, 3 0)), ((0 0, 1 4, 2 4, 3 2, 1 0, 0 0)))
2       2.00 lake                  (((4 0, 4 1, 5 1, 5 0, 4 0)), ((3 3, 4 2, 4 3, 3 3)))
Run Code Online (Sandbox Code Playgroud)

  • 这对我来说非常有用。具有“第一”总结功能有什么作用? (2认同)