简体   繁体   中英

Create new geometry on grouped column in R sf

I'd like to create a new shapefile or a new geometry variable that allows me to plot borders around regions in R. I'm using the sf and mapping with tmap . Basically, I'm adding a character vector to an sf object and would like to make the character vector the new/preferred mapping border.

Here is an example of my approach, which doesn't do what I'd like. I can't tell that it does anything.

library(tidyverse)
library(sf)
library(tmap)

## use North Carolina example 
nc = st_read(system.file("shape/nc.shp", package="sf"))

nc_new.region <- nc %>% ## add new region variable
    mutate(new.region  = sample(c('A', 'B', 'C'), nrow(.),replace = T))

nc_union <- nc_new.region %>% 
    group_by(new.region) %>% # group by the new character vector
    mutate(new_geometry = st_union(geometry)) # union on the geometry variable


# map with tmap package
tm_shape(nc_union)+
    tm_borders()

在此处输入图片说明

This happens because mutate(new_geometry = st_union(geometry)) creates a "new" column within the original sf object, but plotting still uses the "original" geometry column. Indeed, if you have a look at your nc_union object, you'll see that it still contains 100 features (therefore, no "dissolving" was really done).

To do what you wish, you should instead create a "new" sf object using summarize over the groups:

library(tidyverse)
library(sf)
library(tmap)

## use North Carolina example 
nc = st_read(system.file("shape/nc.shp", package="sf"))
#> Reading layer `nc' from data source `D:\Documents\R\win-library\3.5\sf\shape\nc.shp' using driver `ESRI Shapefile'
#> Simple feature collection with 100 features and 14 fields
#> geometry type:  MULTIPOLYGON
#> dimension:      XY
#> bbox:           xmin: -84.32385 ymin: 33.88199 xmax: -75.45698 ymax: 36.58965
#> epsg (SRID):    4267
#> proj4string:    +proj=longlat +datum=NAD27 +no_defs

nc_new.region <- nc %>% ## add new region variable
    mutate(new.region  = sample(c('A', 'B', 'C'), nrow(.),replace = T))

nc_union <- nc_new.region %>% 
    group_by(new.region) %>% 
    summarize()

> nc_union
Simple feature collection with 3 features and 1 field
geometry type:  MULTIPOLYGON
dimension:      XY
bbox:           xmin: -84.32385 ymin: 33.88199 xmax: -75.45698 ymax: 36.58965
epsg (SRID):    4267
proj4string:    +proj=longlat +datum=NAD27 +no_defs
# A tibble: 3 x 2
  new.region                                                                             geometry
  <chr>                                                                        <MULTIPOLYGON [°]>
1 A          (((-78.65572 33.94867, -79.0745 34.30457, -79.04095 34.3193, -79.02947 34.34737, -7~
2 B          (((-79.45597 34.63409, -79.6675 34.80066, -79.68596 34.80526, -79.66015 34.8179, -7~
3 C          (((-78.65572 33.94867, -78.63472 33.97798, -78.63027 34.0102, -78.58778 34.03061, -~

tm_shape(nc_union)+
    tm_borders()

You can see that now nc_union contains only 3 MULTIPOLYGONS, and plot reflects the "aggregation".


See also: https://github.com/r-spatial/sf/issues/290

Created on 2019-08-23 by the reprex package (v0.3.0)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM