【R tips】東京都の地図表示が期待通りにならない場合の対処法

別の記事で東京都の地図データを利用して物件情報の可視化を行いましたが、その際に東京都の地図が思い通りに表示されないという事態の解決に2時間ほどかかりました。

地図データの取り扱いに慣れている方であればすぐに原因がわかると思うのですが、初めて地図データを扱う場合には同じように嵌る人もいるのでは、と思ったので記録しておきます。

データの準備 → 出力では期待した表示ができない

地図を作成するためにはシェープファイルと呼ばれる地図データが必要となりますが、日本のデータであれば国土数値情報が多くのデータを配布しているのでそちらから用意しました。

シェープファイルの読み込みにはsfパッケージを利用しています。

国土数値情報からダウンロードしたzipファイルの中には.shp以外のファイルもありますが、全て同じ階層に格納する必要があるようです。

# import library ----
library(tidyverse)
library(sf)
# data import -------
tokyo <- read_sf("../raw/N03-190101_13_GML/N03-19_13_190101.shp", options="ENCODING=CP932")

# overall
plot(tokyo)

とりあえず地図を作成してみようと思って上のコードを実行すると下の図が作成されます。

「数値地図(国土基本情報)」の行政区画データから整備した。 
※「この地図は、国土地理院長の承認を得て、同院発行の数値地図(国土基本情報)電子国土基本図(地図情報)を複製したものである。(承認番号 平30情複、第1397号)」 

なんだか、思っていた図と違います。N03_001からN03_007はデータ内の変数で、変数の値ごとに色分けされた結果が出ることを期待していたのですが、こちらは黒色単色ですし、地図というよりも散布図のような見た目になっています。

参考にした他県の可視化を行っているサイトでは正しく地図が作成されていたのに、、なぜ、、?

他県のデータでは正しく表示できる。なんで、、、?

出力したいデータのみを指定する

結論から言うと、東京都には八丈島などの島も含まれることに起因します。

上の図だと一番上の点が本州にある東京都の本州部分、それ以外が島の部分と思われます。

そのため島を除いた東京都の地図を作成したいのであれば、以下のようにすれば描画できます。

# import library ----
library(tidyverse)
library(sf)
# data import -------
tokyo <- read_sf("../raw/N03-190101_13_GML/N03-19_13_190101.shp", options="ENCODING=CP932")

# 島を除いた東京都データを作成
tokyo2 <- tokyo %>%
  filter(.$N03_007 > 13100 & .$N03_007 <= 13308)

# 島を除いた東京都の地図を作成
plot(tokyo2)

N03_007には行政区域コードが格納されており、それを使って本州部分のみを指定しています。

「数値地図(国土基本情報)」の行政区画データから整備した。 
※「この地図は、国土地理院長の承認を得て、同院発行の数値地図(国土基本情報)電子国土基本図(地図情報)を複製したものである。(承認番号 平30情複、第1397号)」 

今度は本州部分のみ描画できました。

そのほかにも、例えば23区のみの表示としたければ、同じように行政区域コードを調べて指定することで対応できます。

sfパッケージで読み込んだ地図データはgeom_sf()を使うことでggplot2で描画もできます。

Polygon → Multipolygon への変換にはdplyr::summarise()またはaggregate()を使う

また、シェープファイルを読み込んだだけの状態では1つの行政区域の位置情報が複数の行に分かれていることがありますが、以下のようにaggregateを用いるまたはsummariseを用いることで1行にまとめることができます。

# dplyr::summarise()を使う
tokyo %>%
  group_by(N03_001, N03_004, N03_007) %>% 
  summarise()

# aggregate()を使う
tokyo %>%
  group_by(N03_001, N03_004, N03_007) %>% 
  aggregate(by = list(.$N03_007), FUN = "head", n=1) 

aggregate()またはsummarise()にsfオブジェクトを渡すとgeometryの情報をまとめて返してくれます。(Argumentsのdo_union = TRUEがそれをやってくれているみたい)

単純にdo_union = TRUEでまとめて良い場合と悪い場合があるようですが、そちらはR documentationに譲ります。

自分の使用したい区分にpolygonをまとめることができたら後は位置情報に紐づけて表示したいデータをjoinすることでコロプレス図などにも利用できます。

コメント

タイトルとURLをコピーしました