以下解决方案基于Roger Bivand在R-sig-Geo上的帖子。我以他的示例为例,将俄勒冈州的一些人口普查数据替换为德国的shapefile,您可以从此处下载(从“俄勒冈州的县和人口普查数据”中获取所有shapefile组件)。
让我们从加载所需的程序包并将shapefile导入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)
接下来,您需要一些分组变量以汇总数据。在我们的示例中,分组仅基于单个县的坐标。参见下图,黑色边框表示原始多边形,而红色边框表示由聚合的多边形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)
到目前为止,一切都很好。但是,执行时会丢失与原始shapefile的子区域有关的数据属性(例如,人口密度,面积等)unionSpatialPolygons
。我猜您也想汇总与shapefile相关联的普查数据,因此您需要一个中间步骤。
首先,必须将多边形转换为数据框才能执行聚合。现在,使数据属性列为第六到第八列(“ AREA”,“ POP1990”,“ POP1997”),并根据上述ID应用功能对它们进行汇总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)
最后,将您的数据框重新转换为SpatialPolygonsDataFrame
提供以前统一的shapefile,oregon.union
然后从上述汇总聚合步骤中获得广义多边形和普查数据。
# 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)