Giải pháp sau đây dựa trên bài đăng của Roger Bivand trên R-sig-Geo . Tôi lấy ví dụ của anh ấy thay thế shapefile của Đức bằng một số dữ liệu điều tra dân số từ Oregon mà bạn có thể tải xuống từ đây (lấy tất cả các thành phần shapefile từ 'quận Oregon và dữ liệu điều tra dân số').
Hãy bắt đầu với việc tải các gói cần thiết và nhập shapefile và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)
Tiếp theo, bạn cần một số biến nhóm để tổng hợp dữ liệu. Trong ví dụ của chúng tôi, việc phân nhóm chỉ đơn giản dựa trên tọa độ quận đơn. Xem hình ảnh bên dưới, viền đen biểu thị đa giác ban đầu, trong khi viền đỏ đại diện cho đa giác được tổng hợp bởi 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)
Càng xa càng tốt. Tuy nhiên, các thuộc tính dữ liệu liên quan đến các tiểu vùng của shapefile ban đầu (ví dụ mật độ dân số, diện tích, v.v.) bị mất khi thực hiện unionSpatialPolygons
. Tôi đoán bạn cũng muốn tổng hợp dữ liệu điều tra dân số của mình liên quan đến shapefile, vì vậy bạn sẽ cần một bước trung gian.
Trước tiên, bạn phải chuyển đổi đa giác của mình thành một khung dữ liệu để thực hiện tổng hợp. Bây giờ, hãy lấy các cột thuộc tính dữ liệu sáu đến tám ("KHU", "POP1990", "POP1997") và tổng hợp chúng theo chức năng áp dụng ID ở trê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)
Cuối cùng, chuyển đổi khung dữ liệu của bạn trở lại một SpatialPolygonsDataFrame
shapefile đã hợp nhất trước đó oregon.union
và bạn có được cả đa giác tổng quát và dữ liệu điều tra dân số của bạn có được từ bước tổng hợp ở trên.
# 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)