0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

日本地図(分県地図,自治体ごとの地図)の描画

Last updated at Posted at 2023-05-02

1. 境界線データ

R(および,その他のプログラミング言語)で日本地図を描くためには,何と言ってもまず,都道府県境界線のデータを取得必要がある。

色々選択肢もあるかもしれないが,その中で選ぶならば,国土地理院のウェブサイトから取得できる GeoJSON ファイルを使用するのが良いであろう。必要なファイルを前もってダウンロードしておくのが良い。類似記事では直接ファイルに毎回アクセスするような場合もあるが,サーバーへの負担を考えたり,オフラインでの作業も考えると,必要なファイルを一度だけアクセスしてローカルファイルに保存するのがマナーと言うべきであろう。

このファイルには、都道府県とその境界線の情報が含まれている。全国を対象とするファイルも,地域ブロックを対象とするファイルも,各都道府県一つを対象とするファイルも用意されている。ダウンロードする際に,いくつかのアンケートにも誠実に答えよう。そうしなければ,将来的にこのようなありがたいデータが供給され続けるかどうか,危うい状況にもなりかねない。ダイレクトに(毎回)ダウンロードするというのはぜひとも避けてほしい。

2. 必要なパッケージの使用宣言

その次には,プログラミング環境ごとに必要なパッケージを用意する必要がある。

ここでは、R を例として取り上げるが,基本的にはどのようなプログラミング環境であろうと,先に上げたダウンロードしたファイルを読み取り,プロットするのに必要なパッケージを用意するということに尽きる。

R では sf を使用する(sf を install.packages() するときに, proxy が必要と言われた)。以下のコマンドを使用して、これらのパッケージを使用することを宣言する。まだ,インストールしていない場合はそれぞれのパッケージを install.packages() する。

ggplot2 は使いたくないが,一応使い方を示しておく。

# install.packages("sf")
# install.packages("proxy")
# install.packages("ggplot2")
library(sf)
library(ggplot2)
Linking to GEOS 3.11.0, GDAL 3.5.3, PROJ 9.1.0; sf_use_s2() is TRUE

前述した,都道府県境界線のデータファイルを読み込む。ここでは,全国の都道府県データを含む JSON ファイルを対象とする。これがあれば,万能であろう。

このファイルを,このファイルを利用する Julia プログラムと同じ階層に置いておく(わかっている人は,どこに置いてあっても構わない)。

ファイルから,プロットできる状態のデータをデータフレーム df に読み取る。

df = st_read("N03-20210101_GML/N03-21_210101.geojson")
Reading layer `N03-21_210101' from data source 
  `/Users/aoki/Desktop/jupyter-lab/R/N03-20210101_GML/N03-21_210101.geojson' 
  using driver `GeoJSON'
Simple feature collection with 121158 features and 5 fields
Geometry type: POLYGON
Dimension:     XY
Bounding box:  xmin: 122.9326 ymin: 20.42275 xmax: 153.9867 ymax: 45.55724
Geodetic CRS:  JGD2011

df がどのような構造になっているかを示す。これがわかれば,他の言語でも適切に処理・描画ができる。

head(df)
Registered S3 method overwritten by 'geojsonsf':
  method        from   
  print.geojson geojson
A sf: 6 × 6
N03_001 N03_002 N03_003 N03_004 N03_007 geometry
<chr> <chr> <chr> <chr> <chr> <POLYGON [°]>
1 北海道 石狩振興局 札幌市 中央区 01101 POLYGON ((141.3423 43.06682...
2 北海道 石狩振興局 札幌市 北区 01102 POLYGON ((141.4084 43.18395...
3 北海道 石狩振興局 札幌市 東区 01103 POLYGON ((141.4471 43.15616...
4 北海道 石狩振興局 札幌市 白石区 01104 POLYGON ((141.4624 43.1001,...
5 北海道 石狩振興局 札幌市 豊平区 01105 POLYGON ((141.3846 43.0467,...
6 北海道 石狩振興局 札幌市 南区 01106 POLYGON ((141.0983 43.11764...
class(df)
  1. 'sf'
  2. 'data.frame'
class(df$geometry)
  1. 'sfc_POLYGON'
  2. 'sfc'

データフレームは 6 列からなり,
N03_001 都道府県名
N03_004 市町村名
N03_007
geometry 境界線情報
N03_002 北海道の場合のデータ
N03_003 郡市町村データ

であるが,最重要なのは geometry 列。

3. ggplot で日本全土の地図を描く。

本当は plot() で済ませたいが,全体を対象にすると何故かすごく時間がかかるので,ggplot() での例を示す。

ggplot() +
  geom_sf(data = df) +
  theme_void()

output_10_0.png

4. ある特定の都道府県のみを指定する場合

北海道でもかなり時間がかかるが,これぐらい簡単なら plot でも何の問題もない。

plot(df[df$N03_001 == "岐阜県", "geometry"], col="aliceblue", asp=1)

output_12_0.png

5. ある特定の都道府県のみを指定する場合

岐阜県と隣接する岐阜県,長野県,山梨県を同時に描画する。

plot(df[df$N03_001 %in% c("岐阜県", "長野県", "山梨県"), "geometry"], col="aliceblue", asp=1)

output_14_0.png

6. 複数の都道府県を同時に指定し色分けする場合

上と同じく,岐阜,長野,山梨を同時に色分けして描画するというのは,R ではできないかな(ggplot ではできるかもしれない。Julia ではちゃんとできる)。

以下のような図が描きたいのに...
スクリーンショット 2023-05-02 12.42.57.png

7. 前節の応用(区域ごとに色分けする)

これも R ではできないかな。Julia ではできる。

以下のような図が描きたいのに...
スクリーンショット 2023-05-02 12.43.15.png

8. 特定の市町村を描画する

ある都道府県の市町村を指定して描画する。

plot(df[df$N03_001 == "愛媛県" & df$N03_004 == "伊方町", "geometry"], col="aliceblue", asp=1)

output_16_0.png

9. その他の応用

その他も,データフレームから特定のデータを抽出することで,どのような行政区の地図も描くことができる。

plot(df[df$N03_001 %in% c("北海道", "東京都", "沖縄県"), "geometry"], col="aliceblue", asp=1)

output_18_0.png

10. さらなる応用

基本がわかれば,いろいろなことができる

  • 指定した経緯度に文字列を描く
  • 行政区画ごとのデータで色分けする
  • 行政区画ごとにグラフを表示する(2次元棒グラフなど)
  • その他,あれやこれや

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?