15
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

オープンデータを使って日本地図を描画する

Posted at

はじめに

一年ほど前から、仕事で社会課題をICTで解決する企画作りに取り組んでいます。今回は「オープンデータを使って、社会課題の解決につながるものが作れないか」というアプローチで挑戦し、まずは勉強を兼ねて「都道府県ごとの人口の推移を見える化」してみました。(詳細はこちらのブログをご覧ください)

初めてオープンデータを扱ったので、その手順やポイントを備忘録としてまとめていきたいと思います。

作ったもの

完成した成果物はこちらです。

1975年から2022年までの都道府県別の総人口データをもとに、1975年を基準年として各年の総人口増減率を色分けして表現しました。白は変化なし、青が濃いほど増加、赤が濃いほど減少を示します。アニメーション化することで、都道府県ごとの総人口推移が一目でわかるようになりました。

人口推移_base_1975 (1).gif

使用したオープンデータは以下になります。

また、開発はすべてGoogle Colabで行いました。

地図データの作成

アニメーションの一枚一枚は、県で色分けした日本地図の画像です。
まずは都道府県の境界データを含む日本地図のGISデータを国土数値情報ダウンロードサイトからダウンロードしました。しかし、ダウンロードしたデータはファイルサイズが大きく、地図描画に30秒以上かかります。アニメーション作成のために地図を50回描画すると単純計算で25分かかってしまい、効率がよくありません。1回の地図描画を1秒以内にできるよう、GISデータを加工することにしました。

以下はダウンロードからの手順です。

1. ダウンロード

こちらのページから、地域が「全国」のデータをダウンロードして解凍します。
以下は、解凍したN03-20240101_prefecture.geojsonをそのまま使って描画した日本地図です。この時点ではデータ加工をしていないため、地図の精度は高いですが、描画時間がかかる状態です。

N03-20240101_prefecture.png

2. 地理情報の単純化

Google Colabで解凍したファイルN03-20240101_prefecture.geojsonの地理情報を簡略化します。以下のコードを使用しました。

import geopandas as gpd
import matplotlib.pyplot as plt

# ファイルを読み込む
japan_map = gpd.read_file("N03-20240101_prefecture.geojson")

# 都道府県名("N03_001"列)でデータを結合し、県単位のポリゴンにまとめる
japan_map = japan_map.dissolve(by="N03_001")
japan_map.reset_index(inplace=True)

# 必要な列(都道府県名と地理情報)だけを残す
japan_map = japan_map[['N03_001', 'geometry']]

# 地理情報の簡略化を実行(トポロジーを維持しながら許容誤差 0.01 で形状を単純化)
japan_map["geometry"] = japan_map["geometry"].simplify(tolerance=0.01, preserve_topology=True)

# 加工後のデータを保存
japan_map.to_file("japan_p.geojson", driver="GeoJSON")

加工前後の地図の比較

以下は、加工前後の地図を比較した画像です(一部を拡大しています)。境界線が少し簡略化されているものの、視覚的にはほとんど変化がなく、クオリティを維持できています。

比較1.jpg

改善結果

  • ファイルサイズ:321.2MB → 20.4MB(約93%削減)
  • 描画時間:33.63秒 → 27.44秒(約18%短縮)

ファイルサイズは大幅に削減できましたが、描画速度はさほど短縮できませんでした。

3. さらに簡略化

次に、MapshaperというGISデータ編集ツールを使って、データを簡略化します。MapshaperはGUIツールもありますが、今回はGoogle Colab上でコマンドラインツールを使用しました。
以下のコードで、頂点数を元データの5%に削減しました。

# Node.js をインストール
!curl -sL https://deb.nodesource.com/setup_18.x | sudo -E bash -
!sudo apt-get install -y nodejs

# mapshaper をインストール
!npm install -g mapshaper

# 入力と出力のファイルのパスを指定
input_file = 'japan_p.geojson'
output_file = 'japan_p_simply5.geojson'

# mapshaperで簡略化を実行
# -simplify 5%: 頂点数を元データの5%に削減して形状を簡略化
# -clean: 不要なジオメトリ(重複や孤立した要素など)を削除
!mapshaper {input_file} -simplify 5% -clean -o {output_file}

加工前後の地図の比較

以下は、Mapshaper使用前後の地図を比較した画像です。頂点数をかなり削減しましたが、視覚的には問題なく使用可能です。

比較2.png

改善結果

  • ファイルサイズ:20.4MB → 0.7MB(約97%削減)
  • 描画時間:27.44秒 → 0.56秒(約98%短縮)

ファイルサイズ、描画時間ともに大幅に削減できました!

4. 地図データ完成

今回の目的に合う実用的なデータができたので、GISデータの加工作業はこれで終了です。
以下は、最終的なGISデータを使って描画した日本地図です。

japan_p_simply5.png

終わりに

今回は、情報量が多すぎる地図データを、自分の目的に合う形へ加工する方法についてまとめました。次回の記事では、この地図データと都道府県別の総人口データを結合し、アニメーションを作るプロセスをご紹介します。

15
7
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
15
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?