วิธีการแก้ปัญหาต่อไปนี้จะขึ้นอยู่กับการโพสต์โดยโรเจอร์ Bivand บนR-sig-Geo ฉันเอาตัวอย่างของเขามาแทนที่เชพไฟล์เยอรมันด้วยข้อมูลสำมะโนประชากรจากโอเรกอนที่คุณสามารถดาวน์โหลดได้จากที่นี่ (นำส่วนประกอบเชพไฟล์ทั้งหมดมาจาก
เริ่มต้นด้วยการโหลดแพ็คเกจที่จำเป็นและนำเข้ารูปร่างไฟล์ลงใน 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 เช่นกันดังนั้นคุณจะต้องมีขั้นตอนกลาง
ก่อนอื่นคุณต้องแปลงรูปหลายเหลี่ยมของคุณเป็น dataframe เพื่อทำการรวม ตอนนี้ขอใช้คอลัมน์แอตทริบิวต์ข้อมูลที่หกถึงแปด ( "AREA", "POP1990", "POP1997") 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)
สุดท้ายให้คืนค่า dataframe ของคุณกลับไปเป็นSpatialPolygonsDataFrame
การนำเสนอรูปร่างไฟล์ที่รวมเป็นหนึ่งเดียวก่อนหน้านี้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)