Conveyal R5で公共交通到達圏解析 (wip)

前記事では、OpenTripPlannerとQGISプラグインにより、GTFSに含まれるバスルートや停留所の簡単表示を試みたが、到達圏解析(isochrone)をしようとすると、OTPを1系に落とさなくてはならなかったり(現在のOTPバージョン2.9)なかなか厄介なハマり点が出てきたため、もう一つの解析エンジンConveyal社のR5を使ってみる。

1.必要ツール

1. Python(推奨:3.11系)

Python公式サイト:
Python Downloads

初めてPythonインストールなら、インストール時に  Add Python to PATH にチェックを入れる。
※Windowsなら、直接3.11.9の実行型インストーラダウンロードでもよい
Python 3.11.9 Windows installer (64-bit)

※2つ以上のバージョンを共存させるなら、Add Python to PATH を入れずに c:\Python311 などのフォルダを作成し、そこにインストールする。(R5実行時に指定)

コマンドプロンプトで確認。 python --version 
※D:ドライブにPython311フォルダを作成し、そこにインストールした場合の確認。
D:\Python311\python --version

2. Java(推奨:Java 17 LTS)

R5 は内部で Java を利用して動作する。

Eclipse Temurin Downloads

コマンドプロンプトで確認。 java -version 

3. r5py 関連ライブラリ

コマンドプロンプトで以下を実行する。
pip install r5py geopandas pyogrio
※使用するPythonを明示したい場合は、
Ⅾ:\Python311\Scripts\pip install r5py geopandas pyogrio など

2. R5の作業フォルダ整備

作業用フォルダを (ここでは外部SSDに r5フォルダ作成)用意
(例えば)D:¥r5
この下に、kiyobusなどのフォルダを作成し、GTFSとOSMデータを配置。
同じフォルダに、出力用 output フォルダと キャッシュ用 cache フォルダなども作成しておくとよい。

3.解析用プログラムテンプレート

ファイル位置や解析したい場所情報、出力先などを決める必要がある。
make_iso.py ファイルの冒頭に下記テンプレートを配置しておくとよい(わかりやすい)。

  • OSMファイル
  • GTFSファイル
  • 目的地(清瀬駅など)
  • 出発地点
  • 出発時刻
  • 出力先
# ============================================
# R5 到達時間解析テンプレート
# きよバスgtfsである場所(Origin01)から清瀬駅まで
# Origin01の座標は、QGISとQGIS-GOから取得
# ============================================

import datetime

import geopandas as gpd
import r5py

from shapely.geometry import Point

# ============================================
# OSM / GTFS
# ============================================

OSM_FILE = r"D:/r5/kiyobus/kanto-260511.osm.pbf"

GTFS_FILE = r"D:/r5/kiyobus/kiyobus.gtfs.zip"

# ============================================
# 出力先
# ============================================

OUTPUT_FILE = r"D:/r5/kiyobus/output/travel_time.gpkg"

# ============================================
# 目的地(清瀬駅)
# ============================================

DEST_NAME = "KiyoseStation"

DEST_LON = 139.5265
DEST_LAT = 35.7857

# ============================================
# 出発地点
# ============================================

ORIGIN_NAME = "Origin01"

ORIGIN_LON = 139.497806
ORIGIN_LAT = 35.775772

# ============================================
# 出発時刻
# ============================================

DEPARTURE_YEAR = 2026
DEPARTURE_MONTH = 5
DEPARTURE_DAY = 19

DEPARTURE_HOUR = 8
DEPARTURE_MINUTE = 0

# ============================================
# 条件
# ============================================

MAX_TRAVEL_MINUTES = 60

TRANSPORT_MODES = ["WALK", "TRANSIT"]

# ============================================
# 歩行速度(m/s)
# ============================================

WALK_SPEED = 1.0

# ============================================
# R5 ネットワーク生成(冒頭に続く本体)
# ============================================

print("R5 network 作成中...")

network = r5py.TransportNetwork(
OSM_FILE,
[GTFS_FILE]
)

print("R5 network 作成完了")

# ============================================
# 目的地
# ============================================

destinations = gpd.GeoDataFrame(
{
"id": [DEST_NAME]
},
geometry=[
Point(DEST_LON, DEST_LAT)
],
crs="EPSG:4326"
)

# ============================================
# 出発地点
# ============================================

origins = gpd.GeoDataFrame(
{
"id": [ORIGIN_NAME]
},
geometry=[
Point(ORIGIN_LON, ORIGIN_LAT)
],
crs="EPSG:4326"
)

# ============================================
# 到達時間計算
# ============================================

print("到達時間計算中...")

travel_times = r5py.TravelTimeMatrix(
transport_network=network,

origins=origins,
destinations=destinations,

transport_modes=TRANSPORT_MODES,

departure=datetime.datetime(
DEPARTURE_YEAR,
DEPARTURE_MONTH,
DEPARTURE_DAY,
DEPARTURE_HOUR,
DEPARTURE_MINUTE
),

max_time=datetime.timedelta(
minutes=MAX_TRAVEL_MINUTES
)
)

# ============================================
# 結果表示
# ============================================

print(travel_times)

# ============================================
# 保存
# ============================================

travel_times.to_file(
OUTPUT_FILE,
driver="GPKG"
)
origins.to_file(
r"D:/r5/kiyobus/output/origins.gpkg",
driver="GPKG"
)

destinations.to_file(
r"D:/r5/kiyobus/output/destinations.gpkg",
driver="GPKG"
)
origins.to_file(
r"D:/r5/kiyobus/output/origins.gpkg",
driver="GPKG"
)

print("===================================")
print("出力完了")
print(OUTPUT_FILE)
print("===================================")

4.解析実行例

Pythonの実行
D:\Python311\python D:\r5\kiyobus\make_iso.py
※javaが見つからないなどのエラーが出た場合は、set JAVA_HOME=C:\java などで
一時的にJAVA_HOME の場所を設定

実行成功すると
出力完了
D:/r5/kiyobus/output/travel_time.gpkg
などで終了する。


主な解析例

  • 公共交通到達圏(Isochrone)
  • 時間帯別到達圏比較
  • 徒歩+公共交通解析
  • 到達人口分析
  • 医療・避難施設アクセシビリティ解析

など。