Unir polígonos en R

25

¿Me pregunto cómo unir polígonos espaciales utilizando el código R?

Estoy trabajando con datos del censo donde ciertas áreas cambian con el tiempo y deseo unirme a los polígonos y los datos correspondientes y simplemente informar sobre las áreas unidas. Estoy manteniendo una lista de polígonos que tienen cambios de censo a censo y que planeo fusionar. Me gustaría usar esta lista de nombres de áreas como una lista de búsqueda para aplicar a los datos del censo de diferentes años.

Me pregunto qué función R utilizará para fusionar polígonos seleccionados y datos respectivos. Lo he buscado en Google, pero simplemente me he confundido con los resultados.

    
pregunta Geoconfused 15.06.2013 - 00:24

2 respuestas

36

La siguiente solución se basa en una publicación de Roger Bivand en R-sig -Geo . Tomé su ejemplo reemplazando el shapefile alemán con algunos datos del censo de Oregon que puede descargar desde aquí (tome todo componentes shapefile de 'condados de Oregon y datos del censo').

Comencemos por cargar los paquetes requeridos e importar el shapefile a R.

# Required packages
libs <- c("rgdal", "maptools", "gridExtra")
lapply(libs, require, character.only = TRUE)

# Import Oregon census data
oregon <- readOGR(dsn = "path/to/data", layer = "orcounty")
oregon.coords <- coordinates(oregon)

A continuación, necesita alguna variable de agrupación para agregar los datos. En nuestro ejemplo, la agrupación se basa simplemente en las coordenadas de cada condado. Vea la imagen a continuación, los bordes negros indican los polígonos originales, mientras que los bordes rojos representan los polígonos agregados por oregon.id .

# Generate IDs for grouping
oregon.id <- cut(oregon.coords[,1], quantile(oregon.coords[,1]), include.lowest=TRUE)

# Merge polygons by ID
oregon.union <- unionSpatialPolygons(oregon, oregon.id)

# Plotting
plot(oregon)
plot(oregon.union, add = TRUE, border = "red", lwd = 2)

Hastaahora,todobien.Sinembargo,losatributosdedatosrelacionadosconlassubregionesdelshapefileoriginal(porejemplo,densidaddepoblación,área,etc.)sepierdencuandoserealizaunionSpatialPolygons.Supongoquetambiénlegustaríaagregarlosdatosdesucensoasociadosalshapefile,porloquenecesitaráunpasointermedio.

Primerodebesconvertirtuspolígonosaunmarcodedatospararealizarlaagregación.Ahoratomemoslascolumnasdeatributosdedatosdeseisaocho("ÁREA", "POP1990", "POP1997") y las agregamos de acuerdo con los ID anteriores que aplican la función sum .

# Convert SpatialPolygons to data frame
oregon.df <- as(oregon, "data.frame")

# Aggregate and sum desired data attributes by ID list
oregon.df.agg <- aggregate(oregon.df[, 6:8], list(oregon.id), sum)
row.names(oregon.df.agg) <- as.character(oregon.df.agg$Group.1)

Finalmente, vuelva a convertir su marco de datos a un SpatialPolygonsDataFrame proporcionando el shapefile previamente unificado oregon.union y obtendrá tanto polígonos generalizados como sus datos de censo derivados del paso de agregación de resumen anterior.

# Reconvert data frame to SpatialPolygons
oregon.shp.agg <- SpatialPolygonsDataFrame(oregon.union, oregon.df.agg)

# Plotting
grid.arrange(spplot(oregon, "AREA", main = "Oregon: original county area"), 
             spplot(oregon.shp.agg, "AREA", main = "Oregon: aggregated county area"), ncol = 1)

    
respondido por el fdetsch 17.06.2013 - 13:57
6

Aquí hay una solución que usa el paquete sf:

library(tidycensus)
library(dplyr)
library(sf)
library(ggplot2)

# get data from tindycensus for demonstration (note you need an API key, folow instructions here: https://walkerke.github.io/tidycensus/articles/basic-usage.html)
census <- tidycensus::get_acs(geography = "tract", variables = "B19013_001",
                           state = "TX", county = "Tarrant", geometry = TRUE) %>% 
  arrange(NAME)

# reduce dataset size
census <- census[1:8,]

# create grouping variable
group_1 <- census$GEOID[1:2]
group_2 <- census$GEOID[6:8]

census <- census %>% mutate(group = case_when(GEOID %in% group_1 ~ 'newgroup1',
                                              GEOID %in% group_2 ~ 'newgroup2',
                                              TRUE ~ GEOID))

# summarise by grouping variable (performs a union on grouped polygons and sums 'estimate')
census2 <- group_by(census, group) %>% 
  summarise(estimate = sum(estimate), do_union = TRUE)

# visualise using ggplot2 development version and facet by merged/unmerged datasets
plot_data <- rbind(census %>% select(group, estimate) %>%
                     mutate(facet = "unmerged"), 
                   census2 %>% mutate(facet = "merged"))

gp <- ggplot() + 
      geom_sf(data = plot_data, aes(fill = estimate), color = 'white') + 
      scale_fill_viridis_c() + 
      facet_wrap(~facet, ncol = 1)

    
respondido por el sebdalgarno 04.03.2018 - 22:30

Lea otras preguntas en las etiquetas