Tham gia đa giác trong R


29

Tôi đang tự hỏi làm thế nào để tham gia đa giác không gian bằng mã R?

Tôi đang làm việc với dữ liệu điều tra dân số trong đó các khu vực nhất định thay đổi theo thời gian và tôi muốn tham gia đa giác và dữ liệu tương ứng và chỉ cần báo cáo về các khu vực đã tham gia. Tôi đang duy trì một danh sách các đa giác có thay đổi điều tra dân số sang điều tra dân số và tôi dự định hợp nhất. Tôi muốn sử dụng danh sách tên khu vực này làm danh sách tra cứu để áp dụng cho dữ liệu điều tra dân số từ các năm khác nhau.

Tôi đang tự hỏi nên sử dụng chức năng R nào để hợp nhất các đa giác được chọn và dữ liệu tương ứng. Tôi đã googled nó nhưng chỉ đơn giản là bị nhầm lẫn bởi kết quả.


Câu trả lời cho hầu hết các hoạt động hình học như hòa tan đa giác, lớp phủ, đa giác điểm, giao nhau, liên kết, v.v. là gói rgeos.
Spainedman

1
Cục điều tra dân số Hoa Kỳ công bố các bảng để làm điều này trong giai đoạn 1990-2000 và 2000-2010. Họ có thể được quản lý với cơ sở dữ liệu tham gia, được thực hiện bởi R's mergechức năng.
whuber

Câu trả lời:


39

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)

Shapefile gốc và được nhóm lại

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 SpatialPolygonsDataFrameshapefile đã hợp nhất trước đó oregon.unionvà 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)

Khu vực Oregon


10

Đây là một giải pháp sử dụng gói sf:

library(tidycensus)
library(dplyr)
library(sf)
library(ggplot2)

# get data from tindycensus for demonstration (note you need an API key, folow instructions here: https://walkerke.github.io/tidycensus/articles/basic-usage.html)
census <- tidycensus::get_acs(geography = "tract", variables = "B19013_001",
                           state = "TX", county = "Tarrant", geometry = TRUE) %>% 
  arrange(NAME)

# reduce dataset size
census <- census[1:8,]

# create grouping variable
group_1 <- census$GEOID[1:2]
group_2 <- census$GEOID[6:8]

census <- census %>% mutate(group = case_when(GEOID %in% group_1 ~ 'newgroup1',
                                              GEOID %in% group_2 ~ 'newgroup2',
                                              TRUE ~ GEOID))

# summarise by grouping variable (performs a union on grouped polygons and sums 'estimate')
census2 <- group_by(census, group) %>% 
  summarise(estimate = sum(estimate), do_union = TRUE)

# visualise using ggplot2 development version and facet by merged/unmerged datasets
plot_data <- rbind(census %>% select(group, estimate) %>%
                     mutate(facet = "unmerged"), 
                   census2 %>% mutate(facet = "merged"))

gp <- ggplot() + 
      geom_sf(data = plot_data, aes(fill = estimate), color = 'white') + 
      scale_fill_viridis_c() + 
      facet_wrap(~facet, ncol = 1)

nhập mô tả hình ảnh ở đây


Tôi nghĩ rằng tôi chỉ cần thêm một cảnh báo nhỏ ở đây, chỉ trong trường hợp: hãy cẩn thận khi sử dụng summarise()các công cụ phái sinh với do_unionđối số, vì tôi vừa làm một cái gì đó giống như vậy summarise_if(shapefile, predic.function, sum, na.rm = TRUE, do_union = TRUE), cuối cùng cũng tóm tắt một TRUE trong mỗi ô (tức là +1 cho tất cả các hoạt động). Cần điều tra thêm để tìm hiểu xem đó có phải là điều cần được báo cáo hay không (ít nhất là để cảnh báo thêm) ...?
stragu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.