1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

国土数値情報の鉄道データをPythonで可視化してみる

Posted at

はじめに

国土数値情報では、道路や鉄道、行政界など、
さまざまな地理空間データがオープンデータとして公開されています。

本記事では、その中から 鉄道データ(N02) を使い、
Pythonで日本全国の鉄道路線を可視化してみます。

  • 国土数値情報の鉄道データを実際に触ること
  • Pythonで地理データを読み込むこと
  • 日本全国の鉄道路線を一枚の地図として描くこと

今回使う鉄道データについて

今回使用するのは、国土数値情報が公開している 鉄道データ(N02) です。

国土数値情報は、国土交通省が整備・公開している地理空間データで、
道路、鉄道、行政界、土地利用など、さまざまな分野のデータが含まれています。

鉄道データ(N02)には、主に次のような情報が含まれています。

  • 鉄道路線(線データ)
  • 駅(点データ)
  • 事業者名や路線名などの属性情報

データの一覧や最新情報は、以下の公式ページで確認できます。

データフォーマットについて

鉄道データ(N02)は、GML を基準とした形式で提供されていますが、
配布ファイルには Shapefile や GeoJSON も含まれています。

今回は、次の理由から GeoJSON 形式 を使用します。

  • Python から扱いやすいこと
  • GeoPandas でそのまま読み込めること
  • フォーマットの理解に時間をかけずに済むこと

データ構造の詳細については、製品仕様書にまとめられています。

環境準備

今回は Python を使って地理データを扱います。
地理情報系のライブラリは依存関係が多いため、仮想環境(venv)を使用します。

※Windows 環境で Git Bash を使用する前提です

# プロジェクトのルートディレクトリで仮想環境を作成
python -m venv .venv

# 作成した仮想環境を有効化
source .venv/Scripts/activate

# 今回使用するライブラリをインストール
pip install geopandas folium

# 確認
python -c "import geopandas, folium; print('ok')"

鉄道路線データを読み込む

ここから、国土数値情報の鉄道路線データを Python で読み込んでいきます。

国土数値情報の鉄道データには、GML をはじめ、
Shapefile や GeoJSON 形式のファイルが含まれています。

本記事では、扱いやすさを優先して GeoJSON 形式 のファイルを使用します。

手元のデータは、次のような構成になっている想定です。

data
└─ N02-22_GML
   └─ UTF-8
       └─ N02-22_RailroadSection.geojson

この N02-22_RailroadSection.geojson が、
全国の鉄道路線を表すデータです。

GeoPandas を使うことで、GeoJSON はそのまま読み込めます。

from pathlib import Path
import geopandas as gpd

DATA_DIR = Path("data/N02-22_GML/UTF-8")
RAIL_FILE = DATA_DIR / "N02-22_RailroadSection.geojson"

rail = gpd.read_file(RAIL_FILE) # GeoDataFrame として取得

## 確認
print("rows:", len(rail)) # レコード数を確認する
print("columns:", list(rail.columns)) # カラム一覧を確認する
print("geometry types:")
print(rail.geometry.type.value_counts()) # geometry の型を確認する

## 結果
# rows: 21916
# columns: ['N02_001', 'N02_002', 'N02_003', 'N02_004', 'geometry']
# geometry types:
# LineString    21916
# Name: count, dtype: int64

全国の鉄道路線を地図に描く

読み込んだ鉄道路線データを、地図として描画します。
地図の描画には folium を使用します。

"""
国土数値情報 鉄道データ(N02)を可視化するサンプル

- 鉄道路線(RailroadSection)をGeoJSONから読み込む
- 東京駅を中心に地図を初期化
- 全国の鉄道路線を地図に描画
- HTMLとして保存
"""

from pathlib import Path

import geopandas as gpd
import folium

# -----------------------------
# データ読み込み
# -----------------------------

DATA_DIR = Path("data/N02-22_GML/UTF-8")
RAIL_FILE = DATA_DIR / "N02-22_RailroadSection.geojson"

rail = gpd.read_file(RAIL_FILE)

# 読み込み確認
print("rows:", len(rail))
print("geometry types:")
print(rail.geometry.type.value_counts())

# -----------------------------
# 地図の初期化
# -----------------------------

# 地図の初期表示位置(東京駅付近)
MAP_CENTER = [35.681236, 139.767125]

m = folium.Map(
    location=MAP_CENTER,
    zoom_start=8,
    tiles="cartodbpositron",
)

# -----------------------------
# 鉄道路線を描画
# -----------------------------

folium.GeoJson(
    rail,
    name="RailroadSection",
    style_function=lambda _: {
        "weight": 1.2,
        "opacity": 0.9,
    },
).add_to(m)

folium.LayerControl().add_to(m)

# -----------------------------
# HTMLとして保存
# -----------------------------

OUTPUT_FILE = "japan_railway_map.html"
m.save(OUTPUT_FILE)

print(f"saved: {OUTPUT_FILE}")

生成された HTML ファイルをブラウザで開くと、
全国の鉄道路線を地図として確認できます。

a39e2324e488b97f5d75-1.png

背景地図を非表示にして、鉄道路線だけを表示してみることもできます。

背景地図を非表示にすると、
鉄道路線の分布や密度を線データとして俯瞰しやすくなります。

a39e2324e488b97f5d75-2.png

路線データに加えて、駅データを重ねて表示することもできます。

a39e2324e488b97f5d75-3.png

まとめ

この記事では、国土数値情報の鉄道オープンデータ(N02)を使い、
Pythonで日本全国の鉄道路線を可視化するところまでをハンズオンで進めました。

  • 国土数値情報の鉄道データを読み込み
  • 鉄道路線(線データ)のみを使って
  • 全国の鉄道網を一枚の地図として描画

路線データだけでも、都市部と地方での鉄道密度の違いや、
日本の鉄道網の構造が直感的に分かることが確認できました。

次のステップとしては、

  • 事業者別の色分け
  • 駅データの重ね合わせ
  • 特定エリアの切り出し

なども考えられます。

今回触ってみた範囲では、
国土数値情報の鉄道データは有用で、比較的扱いやすいデータだと感じました。

1
3
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
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?