La solution suivante est basée sur un article de Roger Bivand sur R-sig-Geo . J'ai pris son exemple en remplaçant le fichier de formes allemand par des données de recensement de l'Oregon que vous pouvez télécharger à partir d' ici (prenez toutes les composantes du fichier de formes des «comtés de l'Oregon et données de recensement»).
Commençons par charger les packages requis et importer le fichier de formes dans 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)
Ensuite, vous avez besoin d'une variable de regroupement afin d'agréger les données. Dans notre exemple, le regroupement est simplement basé sur les coordonnées d'un seul comté. Voir l'image ci-dessous, les bordures noires indiquent les polygones d'origine, tandis que les bordures rouges représentent les polygones agrégés par 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)
Jusqu'ici tout va bien. Cependant, les attributs de données liés aux sous-régions du fichier de formes d'origine (par exemple la densité de population, la superficie, etc.) sont perdus lors de l'exécution unionSpatialPolygons
. Je suppose que vous souhaitez également agréger vos données de recensement associées au fichier de formes, vous aurez donc besoin d'une étape intermédiaire.
Vous devez d'abord convertir vos polygones en une trame de données afin d'effectuer l'agrégation. Prenons maintenant les colonnes d'attributs de données six à huit ("AREA", "POP1990", "POP1997") et agrégons-les en fonction de la fonction d'application des ID ci-dessus 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)
Enfin, reconvertissez votre trame de données en SpatialPolygonsDataFrame
fournissant le fichier de formes précédemment unifié oregon.union
et vous obtenez à la fois des polygones généralisés et vos données de recensement dérivées de l'étape d'agrégation de résumé ci-dessus.
# 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)