R'deki çokgenlerin birleştirilmesi


29

Uzaysal poligonlara R kodunu kullanarak nasıl katılmalı merak ediyorum?

Belirli alanların zaman içinde değiştiği sayım verileriyle çalışıyorum ve poligonlara ve ilgili verilere katılmak ve sadece birleştirilmiş alanlar hakkında rapor vermek istiyorum. Sayımı nüfus sayımında değiştiren ve birleştirmeyi planladığım çokgenlerin bir listesini tutuyorum. Bu alan adları listesini farklı yıllardaki nüfus sayımı verilerine uygulamak için arama listesi olarak kullanmak istiyorum.

Seçilen poligonları ve ilgili verileri birleştirmek için hangi R fonksiyonunun kullanılacağını merak ediyorum. Ben googledim ama sadece sonuçları ile kafam karıştı.


Poligon çözme, bindirme, poligon noktası, kesişme, birleşme, vb. Gibi birçok geometri işleminin cevabı rgeos paketidir.
Spacedman

1
ABD Nüfus Sayımı Bürosu, bunu yapmak için 1990-2000 ve 2000-2010 yılları için tablolar yayınlamaktadır. İle Onlar yönetilebilir veritabanı tarafından uygulanır ki, katılır Rbireyin mergefonksiyonu.
whuber

Yanıtlar:


39

Aşağıdaki çözüm Roger Bivand tarafından R-sig- Geo'daki bir yayına dayanıyor . Sana indirebileceğiniz Oregon bazı sayım verileri ile Alman shape dosyası yerine onu örnek aldı burada ( 'Oregon ilçeleri ve sayım verilerinden' dan tüm şekil dosyası bileşenleri almak).

Gerekli paketleri yüklemekle ve shape dosyasını R'ye almakla başlayalım.

# 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)

Daha sonra, verileri toplamak için bazı gruplama değişkenlerine ihtiyacınız vardır. Örneğimizde, gruplama basitçe tek ilçe koordinatlarına dayanmaktadır. Aşağıdaki resme bakın, siyah kenarlıklar orijinal çokgenleri gösterir, kırmızı kenarlıklar ise toplanan çokgenleri temsil eder 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)

Orijinal ve gruplandırılmış Oregon şekil dosyası

Çok uzak çok iyi. Ancak, orijinal şekil dosyasının alt bölgelerine (örneğin, popülasyon yoğunluğu, alan vb.) İlişkin veri nitelikleri gerçekleştirilirken kayboluyor unionSpatialPolygons. Sanırım şekil dosyasıyla ilişkili sayım verilerinizi de birleştirmek istiyorsunuz, bu nedenle orta bir adıma ihtiyacınız olacak.

İlk önce, çokgenlerinizi birleştirme gerçekleştirmek için bir veri çerçevesine dönüştürmeniz gerekir. Şimdi altıdan sekize ("AREA", "POP1990", "POP1997") veri özniteliğini alalım ve bunları yukarıdaki ID uygulama fonksiyonuna göre toplayalım 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)

Son olarak, veri birimini SpatialPolygonsDataFramedaha önce birleştirilmiş şekil dosyasını sağlayarak geri dönüştürün oregon.unionve hem genelleştirilmiş çokgenleri hem de yukarıdaki özetleme toplama adımından türetilen sayım verilerinizi elde edin.

# 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)

Oregon alanları


10

İşte sf paketini kullanan bir çözüm:

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)

görüntü tanımını buraya girin


Ben sadece buraya küçük bir uyarı ekleyeceğimi düşündüm, sadece şu durumda: argümanla summarise()türev kullanmaktan do_unionkaçının, tıpkı benim yaptığım gibi summarise_if(shapefile, predic.function, sum, na.rm = TRUE, do_union = TRUE), her hücrede bir DOĞRU (yani tüm işlemler için + 1) toplayan gibi. Bunun bildirilmesi gereken bir şey olup olmadığını anlamak için daha fazla araştırma yapmanız mı gerekiyor (en azından ekstra bir uyarı için) ...?
Stragu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.