A solução a seguir é baseada em uma postagem de Roger Bivand no R-sig-Geo . Tomei seu exemplo substituindo o shapefile alemão por alguns dados do censo do Oregon que você pode baixar aqui (pegue todos os componentes do shapefile em 'municípios do Oregon e dados do censo').
Vamos começar carregando os pacotes necessários e importando o shapefile para o 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)
Em seguida, você precisa de alguma variável de agrupamento para agregar os dados. No nosso exemplo, o agrupamento é simplesmente baseado nas coordenadas do condado. Veja a imagem abaixo: bordas pretas indicam os polígonos originais, enquanto bordas vermelhas representam 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)
Por enquanto, tudo bem. No entanto, atributos de dados relacionados às sub-regiões do shapefile original (por exemplo, densidade populacional, área etc.) são perdidos durante a execução unionSpatialPolygons
. Acho que você também gostaria de agregar seus dados do censo associados ao shapefile, por isso precisará de uma etapa intermediária.
Primeiro você precisa converter seus polígonos em um quadro de dados para realizar a agregação. Agora vamos pegar as colunas de atributo de dados de seis a oito ("AREA", "POP1990", "POP1997") e agregá-las de acordo com os IDs acima, aplicando a função 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)
Por fim, reconverta seu quadro de dados novamente em um arquivo SpatialPolygonsDataFrame
shapefile previamente unificado oregon.union
e você obtém polígonos generalizados e seus dados de censo derivados da etapa de agregação de resumo acima.
# 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)