Die folgende Lösung basiert auf einem Beitrag von Roger Bivand zu R-sig-Geo . Ich habe sein Beispiel genommen, in dem das deutsche Shapefile durch einige Volkszählungsdaten aus Oregon ersetzt wurde, die Sie hier herunterladen können .
Beginnen wir mit dem Laden der erforderlichen Pakete und dem Importieren des Shapefiles in 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)
Als nächstes benötigen Sie eine Gruppierungsvariable, um die Daten zu aggregieren. In unserem Beispiel basiert die Gruppierung einfach auf den einzelnen Kreiskoordinaten. In der Abbildung unten geben schwarze Ränder die ursprünglichen Polygone an, während rote Ränder die durch aggregierten Polygone darstellen 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)
So weit, ist es gut. Datenattribute, die sich auf die Unterregionen des ursprünglichen Shapefiles beziehen (z. B. Bevölkerungsdichte, Fläche usw.), gehen jedoch bei der Ausführung verloren unionSpatialPolygons
. Sie möchten wahrscheinlich auch Ihre mit dem Shapefile verknüpften Volkszählungsdaten aggregieren, sodass Sie einen Zwischenschritt benötigen.
Sie müssen zuerst Ihre Polygone in einen Datenrahmen konvertieren, um die Aggregation durchzuführen. Nehmen wir nun die Datenattributspalten sechs bis acht ("AREA", "POP1990", "POP1997") und aggregieren Sie sie gemäß den oben angegebenen Funktions-IDs 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)
Zum Schluss konvertieren Sie Ihren Datenrahmen wieder in ein SpatialPolygonsDataFrame
zuvor einheitliches Shapefile oregon.union
und Sie erhalten sowohl verallgemeinerte Polygone als auch Ihre Volkszählungsdaten, die aus dem obigen Schritt der Zusammenfassungsaggregation abgeleitet wurden.
# 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)