Rでポリゴンを結合する


29

Rコードを使用して空間ポリゴンを結合する方法を疑問に思っていますか?

特定のエリアが時間とともに変化する国勢調査データを使用しており、ポリゴンと対応するデータを結合して、結合された領域について単純にレポートしたいと考えています。国勢調査から国勢調査への変更があり、マージする予定のポリゴンのリストを保持しています。この地域名のリストをルックアップリストとして使用して、異なる年の人口調査データに適用したいと思います。

選択したポリゴンとそれぞれのデータをマージするためにどのR関数を使用するのか疑問に思っています。私はそれをグーグルで検索しましたが、結果に単に混乱します。


ポリゴンのディゾルブ、オーバーレイ、ポイントインポリゴン、インターセクション、ユニオンなどのようなほとんどのジオメトリ操作に対する答えは、rgeosパッケージです。
Spacedman

1
米国国勢調査局は、1990年から2000年および2000年から2010年にこれを行うための表を公開しています。それらは、データベース結合で管理できます。データベース結合は、Rmerge関数によって実装されます。
whuber

回答:


39

次のソリューションは、R-sig-Geoに関するRoger Bivandの投稿に基づいています。ドイツのシェイプファイルを、ここからダウンロードできるオレゴン州のセンサスデータに置き換えた例を取り上げまし(すべてのシェイプファイルコンポーネントを「オレゴン州の郡とセンサスデータ」から取得します)。

必要なパッケージをロードし、シェープファイルを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)

オリジナルおよびグループ化されたオレゴンシェープファイル

ここまでは順調ですね。ただし、元のシェープファイルのサブ領域に関連するデータ属性(人口密度、面積など)は、実行時に失われunionSpatialPolygonsます。シェープファイルに関連付けられている国勢調査データも集計したいので、中間ステップが必要になると思います。

集計を実行するには、まずポリゴンをデータフレームに変換する必要があります。次に、データ属性列6〜8( "AREA"、 "POP1990"、 "POP1997")を取得し、functionを適用する上記の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以前の統合されたシェープファイル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)

オレゴン地域


10

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)

ここに画像の説明を入力してください


念のため、ここにちょっとした警告を追加したいと思いました:引数でsummarise()微分を使用することに注意してください、do_union私はちょうどのようなsummarise_if(shapefile, predic.function, sum, na.rm = TRUE, do_union = TRUE)ことをしたので、各セルでTRUEを合計しました(つまり、すべての操作で+1)。それが報告されるべきものであるかどうかを判断するために、さらに調査する必要があります(少なくとも追加の警告について)...?
ストラグ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.