公共交通オープンデータを都市政策、交通政策に活用するために
2017年3月の国交省による「標準的なバス情報フォーマット」策定以来、全国で公共交通オープンデータの整備が相次いでいます。一覧ページによると、8月末時点で全国で177件のデータが公開され、誰もがダウンロードして活用出来るようになっています。
「標準的なバス情報フォーマット」は世界のデファクトスタンダード形式であるGTFS形式と互換であり、公開されているデータはGoogle Mapsなどでの検索に使われているほかにも、様々なオープンソースのツールを用いて活用出来ます。このQiitaにおいても、GTFSデータの利用方法を解説する記事が多数投稿されています。
この記事では、公開されたオープンデータを地域の公共交通サービスの実態を把握するために利用する方法を紹介します。利用者の減少などにより、多くの地域で公共交通の維持が困難になっていますが、どんな対策を取るべきか、ここで紹介するような方法でまずは実態を正確に把握した上で議論が進められればと思います。
到達圏解析による等時線地図 (Isochrone Map)
「ある時間内にどこまで行けるのか?」を面的に理解するために、到達圏解析という方法があり、その結果を地図で表したものを等時線地図(Isochrone Map)と呼びます。古くはグラフィックデザイナーの杉浦康平氏の時間地図が知られていますし、Yahoo! Japanが公開した交通利便度の地図も話題になりました。専門家向けには、ArcGISの「交通ネットワーク解析機能」などが提供されています。
以下の地図が、この記事で作り方を解説する等時線地図です。中心にある群馬県庁を平日午後1時に出発したときにバスと徒歩によって移動できる範囲を、10分ごとに色分けして図示しています。時刻表データと道路データに基づいて作図されているので、概算ではなく、特定の場所、時刻に基づいた情報が得られ、地域における公共交通サービスレベルの把握や検討に広く活用できる地図です。この地図を、オープンデータとオープンソースを使って作ってみます。
OpenTripPlannerの利用
等時線地図を作図するために、オープンソースの経路検索エンジンであるOpenTripPlanner (OTP) を利用します。OTPは、一般的な経路検索の他に到達圏解析機能を備えており、その機能を用います。インストールなどは以下の記事を参考に作業を進めますが、主にmacOS版の手順に従います。なお、2つの記事の違いは、OSMデータの切り出しに用いるツール(osmconvert
かosmosis
か)と、ダウンロードに使うツールの違い(wget
かcurl
か)であり、macOS版で用いられているツールは、Windows、Linuxでも利用が可能です。
- オープンソースの経路探索「OpenTripPlanner」をUbuntuで動かして岡山県で経路探索をする
- オープンソースの経路探索「OpenTripPlanner」をmacOSで動かして岡山県で経路探索をする
動作確認した環境
-
macOS Mojave 10.14.6
検証していませんが、WindowsやLinuxでも動作すると思います。 -
QGIS 3.8.2
LTR版のバージョンは3.4.11ですが、追加機能も多いので、特に理由がない限り最新版を導入するのがいいでしょう。 -
JDK1.8.0_202
マージに用いるonebusaway-gtfs-merge-cliはJDK1.8でしかコンパイルが動かない模様。Mac環境へのインストールは「MacのBrewで複数バージョンのJavaを利用する + jEnv」が参考になります。 -
PostgreSQL 11.3
+PostGIS 2.5
(それぞれHomebrew
でインストール)
Step1: OpenTripPlannerのためのデータ準備
今回はバスのGTFSデータが揃っている群馬県を対象にデータを用意します。
1-1. GTFSデータ
過去記事「群馬県公共交通オープンデータ(GTFS)を一括してデータベースに格納する方法」を参考に、群馬県のGTFSデータを「群馬県内バス路線情報(標準的なバス情報フォーマット)」から一括ダウンロードします。日本中央バス、永井運輸に関しては、それぞれのWebページから手作業でダウンロードします。
このままでも構わないのですが、図示することを考えるとPostgreSQLへデータをインポートした方が扱いやすいので、前述記事の手順に従って、GTFSデータの解凍→GTFSデータのマージ、データベースへの投入、と作業を進めておきます。なお、マージの作業は手元の環境では3時間程度掛かったので、時間に余裕があるときに行うことをお勧めします。
1-2. OpenStreetMapデータ
群馬県エリアのOpenStreetMapデータを切り出します。まずはOSMデータを提供しているgeofabrik.deから関東地方のデータをpbfフォーマットで取得します。次に、群馬県エリアのデータを切り出すためにosmosis
をインストールします。macOSなら $ brew install osmosis
でインストールが完了します。Windows、Linuxでは公式ページのインストール方法を参照してください。動作にはJavaが必要です。
最後に、データ切り出しを行います。群馬県の緯度経度の最小値、最大値を調べたら、以下のコマンドで切り出しが完了します。私の環境では、関東全域で247MBあったデータから、38MBのデータが切り出されました。
$ osmosis --read-pbf kanto-latest.osm.pbf --bounding-box top=37.0586280822754 left=138.397018432617 bottom=35.9853324890137 right=139.669952392578 completeWays=yes --write-pbf gunma.pbf
1-3. 都道府県を取り囲む緯度経度を調べる
ところで、ここで出てきた群馬県の緯度経度の最小値、最大値はどのように調べたのでしょうか?地図上で当たりを付けてもいいのですが、データから求めるとしたら、以下のようなやり方になると思います。
-
国土数値情報 行政区域データの入手。
リンク先からダウンロードします。群馬県だけでもいいですが、私は全国版をダウンロードしました。 - データをPostgreSQL+PostGISへ投入。「シェープファイルのデータをインポートしてみよう コマンドライン編」を参考にして行いました。
$ shp2pgsql -W cp932 -D -I -s 4612 N03-19_190101.shp t1 > N03-19_190101.sql
$ psql all_japan -f N03-19_190101.sql
- PostGISの関数を用いてBoundingBoxの座標を取得。
select
n03_001,
count(*),
st_astext(ST_BoundingDiagonal((ST_Multi(ST_Union(geom)))))
from
t1
where
n03_001 = '群馬県'
group by
n03_001
これを実行することで、以下のような結果が得られます。これは、群馬県全体が収まる長方形の対角線であり、必要となる値をここから得られます。なお、他の都道府県で実行する場合は島嶼部などに注意してください。思いのほか広い領域のデータが得られることがあります。
LINESTRING(138.397018432617 35.9853324890137,139.669952392578 37.0586280822754)
Step2. OpenTripPlannerのセットアップと起動
OpenTripPlanner(OTP)は、オープンソースで開発されている公共交通の経路検索エンジンです。いわゆる乗換案内サービスのような仕組みを作ることができ、海外では商用のアプリやサービスにも使われています。ここでは、OpenTripPlannerを用意しデータを読み込ませ起動します。
2-1. OpenTripPlannerのダウンロード
コンパイル済みのファイルがMaven Central Repositoryの OTPディレクトリに置かれているので、最新(記事時点で1.4.0)の otp-1.4.0-shaded.jar
をダウンロードします。Maven環境を構築することで、ソースコードから自分でビルドすることも出来ます。
2-2. OpenTripPlannerの起動
ダウンロードしたjarファイル、GTFSファイル、OSMを切り出した.pbfファイルを同一のディレクトリに置き、以下のコマンドでOTPを起動します。起動には多少時間が掛かります。
$ java -Xmx3G -jar otp-1.4.0-shaded.jar --build ./ --inMemory
3-3. OpenTripPlannerの動作確認
起動が成功すると、 http://localhost:8080
でサーバにアクセスできるようになります。この状態で例えば以下のURLにアクセスすると、群馬県庁(緯度36.390714, 経度139.060474)から高崎市役所(緯度: 36.321909 経度: 139.003305)への経路の情報がXML形式で取得出来ます。詳細は、前述記事や公式ドキュメントを参照してください。
http://localhost:8080/otp/routers/default/plan?fromPlace=36.390714,139.060474&toPlace=36.321909,139.003305&time=1:02pm&date=08-30-2019&mode=TRANSIT,WALK&maxWalkDistance=500&arriveBy=false&numItineraries=5
Step3. 到達圏を示すGeoJSONデータを得る
OpenTripPlannerの機能として、到達圏を示す図をGeoJSON形式で出力することが出来ます。冒頭に示した地図は、以下のURLで得られたデータを可視化しています。
http://localhost:8080/otp/routers/default/isochrone?fromPlace=36.390714,139.060474&mode=WALK,TRANSIT&date=08-30-2019&time=1:00pm&maxWalkDistance=500&cutoffSec=600&cutoffSec=1200&cutoffSec=1800&cutoffSec=2400&cutoffSec=3000&cutoffSec=3600&cutoffSec=4200&cutoffSec=4800&cutoffSec=5400
URLに渡すパラメータは、APIドキュメントのLIsochroneに説明されています。主なパラメータを解説します。
共通パラメータ
パラメータ | 値 | 備考 |
---|---|---|
mode | WALK,TRANSIT | 利用する交通モード。ここでは徒歩と公共交通を指定。 |
maxWalkDistance | 500 | 徒歩移動の最大距離(単位はメートル)。バス停まで長距離徒歩で移動するのは現実的ではないので、ここでは500mに設定。 |
cutoffSec | 600など、複数指定 | この秒数で到達する領域の図形が出力される。この例では、10分ごとに90分まで指定している。 |
例: 前橋駅を12:55に出発
パラメータ | 値 | 備考 |
---|---|---|
fromPlace | 36.383337,139.073288 | 前橋駅の緯度経度 |
toPlace | 不要 | |
arriveBy | デフォルト値なので不要。値を設定する場合はfalse。 | |
date | 08-30-2019 | 出発日 |
time | 12:55pm | 出発時刻 |
例: 群馬大学荒牧キャンパスに午前9時までに到着
パラメータ | 値 | 備考 |
---|---|---|
fromPlace | 36.390714,139.060474 | どの地点でもよさそうだが設定しないとエラーになる |
toPlace | 36.431807,139.046411 | 群馬大学荒牧キャンパスの緯度経度 |
arriveBy | true | |
date | 08-30-2019 | 到着日 |
time | 9:00am | 到着時刻 |
適当にパラメータを設定し、URLを叩いて得られたGeoJSONファイルを保存します。
Step4. QGISでデータを表示する
得られたGeoJSONファイルをQGISに読み込ませます。
4-1. GeoJSONファイルを読み込む
レイヤ→レイヤの追加→ベクタレイヤの追加
でデータソースマネージャの画面を開き、OpenTripPlannerから出力したGeoJSONファイルを以下のように設定し読み込みを行います。
「追加」を押すと、データが読み込まれQGISの画面に表示されます。この段階では、色はランダムに割り当てられます。
4-2. ベースとなる地図を設定
読み込ませたデータを解釈するために、ベースとなる地図を読み込ませます。ここでは地理院地図の淡色地図を使いますが、OpenStreetMapやMIERUNE地図なども同様の方法で設定出来ます。
左上のブラウザ
ウィンドウまたはレイヤ→データソースマネージャ→ブラウザ
画面中のXYZ Tiles
を右クリック、「新しい接続」を選択。地理院地図のWebページを参考に、以下のように情報を設定します。
XYZ Tilesの中で「地理院地図(淡色)」を選べるようになるので、これをダブルクリック、またはドラッグアンドドロップして左下の「レイヤ」ウィンドウに追加します。レイヤの上下関係を調整し、地理院地図が下、GeoJSONデータが上に重なるようにします。ここまでの操作で以下のような画面が得られます。
画面は自由にスクロールや拡大、縮小が出来ます。もしスクロールしすぎて元の位置を見失った場合、「レイヤ」ウィンドウのGeoJSONデータを右クリックし、「レイヤの領域にズーム」を選択することで、データ全域が表示される縮尺に自動調整されます。
4-3. レンダリングに用いる座標系を設定する
GeoJSONファイルの座標系は標準でWGS84であり、QGISでもこれを引き継いでWGS84の座標系(EPSG:4326)でレンダリングが行われます。しかしこの座標系は、背景となる地理院地図と合っていないため、よく見ると文字がつぶれています。画面右下の「EPSG: 4326」と書かれた部分をクリックし、プロジェクトのプロパティから「WGS 84 / Pseudo-Mercator(EPSG 3857)」を選択することで、ベース地図に合わせた歪みの少ない地図表示が可能になります。なお、この投影法はGoogle Mapsで用いられている投影法と同じです。
4-3. 色を設定する
表示しているデータは、10分で行ける範囲を示すポリゴン、20分範囲のポリゴン・・・というように、9分類のポリゴンデータを含んでいます。このままでは意味が伝わりませんが、適切に塗り分けることで等高線のような形で情報の意味を表現出来るようになります。
レイヤウィンドウを右クリックし、プロパティを表示します。ここで、レイヤに関する様々な設定が出来るので、色や文字情報を設定します。
まず、色は「シンボロジ」として設定が出来ます。一番上の種別を「単一シンボル(single)」から「分類された(categolized)」に変更し、分類に使うカラムを「time」、カラーランプを「Spectral」に変更して「分類」ボタンを押します。これで9色に塗り分けられるようになります。凡例の文字列を適切に設定し、「Apply」を押すと表示が切り替わります。
このままだと境界線が強すぎるので、「シンボル」の「変更」をクリックし、「シンプル塗りつぶし」の「ストローク色」を黒からグレーに、ストローク太さも細くしました。これで色の塗り分けがすっきりします。
最後に、「レイヤレンダリング」の▲をクリックして詳細を表示させ、不透明度を調整することで下の地図が見える表示になります。
これでデータの塗り分けは出来ました。「レイヤ」画面では、表示させるレイヤを選択出来るようになるので、例えば30分範囲だけを表示、といったことが出来ます。
4-4. ラベルを設定する(未完)
色だけでなく、地図上に文字で時間を示すことでよりわかりやすい表示が実現します。同じくレイヤのプロパティから「ラベル」を選択し、設定を進めます。
まずはいちばん上を「ラベルなし」から「単一のラベル」に変更し、ラベルとしてtime
を設定します。このままでは秒単位で表示されてしまうので、to_string(time/60) + '分'
とすると分単位のわかり易い表示になります。「テキスト」の設定においてフォントや文字の大きさなども適切に設定してください。この段階ではラベルが置かれる位置は気にしないことにします。また、「バッファ」の設定において「テキストバッファを描画する」にチェックを付け、文字が目立つように周りに縁取りをします。
ラベルとなる文字の位置は、図形の中心より境界線に沿っているほうが分かりやすいと思います。「配置」の設定において「境界線の使用」を選択し、「許容される位置」を「ラインの左」とし、境界線の内側に文字を表示するため「ラインの方向に依存した位置」もチェックします。ここで「ライン上」を選択することも出来ますし、そのほうが等高線らしい気もするのですが、個人的には境界線の内側にラベルが表示される方が見やすく感じました。線が長いときに繰り返しラベルを表示する「反復」も適切な値に設定します。
続いて「描画」の設定において「マルチパート地物の各パートに出力」をチェックします。ひとつの時間帯に紐付いたエリアが複数のポリゴンから成り立っているため、このチェックが必要になります。
ここまで設定することで、等高線のラベルが出力されるはずなのですが、よく見るとうまくいっていません。
下図のように拡大してよく見ると、同一の線上に20分、30分、40分、50分、60分、70分、80分が描画されており、どう読み取ったらいいか分かりません。この原因は、各時間帯の到達圏が重なっているためです。徒歩を最大500mとしているため、バスがないエリアではこれ以上進むことが出来ず、到達圏が広がらないのです。図形としては20分の色で塗られているのですが、その下に30〜90分の到達圏も同じところに重なっていることが、表示レイヤーを切り替えることで確認できます。ラベルは下に隠れた図形に関しても表示されるため、同一線上に異なる時間が表示されるのです。
地理的な等高線ならこのようなことはほとんど起こらないと思われるので、いろいろと検索しても記事投稿時点でこの現象をどのように抑えられるか分からず、このまま投稿しております。「ルールに基づいたラベル」に設定し、各時間帯ごとに異なる優先度やz-indexを設定してもほとんど結果は変わらず、どのようにしたらいいか分かっておりません。
修正方法がおわかりの方、また、よりふさわしいラベルの出力方法を考えられた方、是非コメントを頂けたらと思います。
Step5. GTFSデータを表示する
上記までの作業で等時線地図は作成出来たのですが、GTFSデータに含まれるバス停や路線の情報を地図上に重ねることで、バスによる到達圏がより理解しやすくなります。このため、Step1-1においてGTFSデータはダウンロードするだけでなくマージして一括してPostgreSQLに投入しておくことが望ましいです。以下は、PostgreSQLにデータがある前提で説明します。
5-1. バス停データを読み込む
「レイヤ」→「レイヤの追加」→「PostGISレイヤの追加」からGTFSデータを入力したPostgreSQLのデータベースを指定し、stops
テーブルを選択して追加します。
初回の接続では、PostgreSQLの接続を設定する必要があります。適切なホスト名、データベース名などを設定してください。以下は私の環境における設定例です。
この段階で地図上に点が表示されます。あとは、適宜色やラベルを設定してください。ラベルの文字はstop_name
の値を設定します。ラベルの数が多いので、「描画」設定の「ラベル付けする地物の数を制限」を200に設定しました。他にも、縮尺ごとに設定を変えるなどの設定も出来ます。
同一のバス停名が並んで表示されるのは、バス停データが全ての乗り場や代表点の位置などを含んでいるからです。これを名寄せするとすっきりした地図が作れますが、この記事の範囲を超えているのでここでは解説しません。端的に述べると、例えば「県庁前」を拡大すると、事業者ごとに微妙に表記が違うバス停が微妙に違う位置にそれぞれ設定されており、これをまとめるのはちょっとした作業になってしまうのです。
5-2. 路線データを読み込む
一部のGTFSデータは、路線の形状データ(及びその色情報)を持っています。バス程度同様に「レイヤ」→「レイヤの追加」→「PostGISレイヤの追加」からGTFSデータを入力したPostgreSQLのデータベースを指定し、routes
テーブルを選択して追加します。GTFSデータにおいて、路線はshapes.txt
に点の集合として定義されているのですが、PostgreSQLに読み込む段階で、routeの属性のひとつとして、MultiLineに変換され格納されています。
一部のデータは路線の色情報を持っているので、これを表示に反映させましょう。「レイヤプロパティ」の「シンボロジ」「シンプルライン」の「色」ボタンの右側のアイコンをクリックし、「編集」を選びます。そこで出てくる「式文字列エディタ」にif ( length("route_color") > 0, '#ff' + "route_color", '#ffbac044')
と入力すると、route_color
が設定されているときだけ、線の色が反映されるようになります。色情報を持っていない場合の色は#bac044
としています(特に理由はありません)。
これで路線が描画されるようになります。ただし、現状路線データを持っているのは、自社でデータ整備をしている永井バスと日本中央バスのみになります。これ以外のバス路線は線が引かれないので、どうしても路線図を作りたい場合はバス停間を直線でつなぐなどの工夫が必要になります。
Stop6. データを追加してQGISの表示を整える(任意)
背景地図とバスの情報だけでなく、いくつかのデータを追加して重ねることで、その地域の交通網をより把握、理解しやすくなります。そんな用途に使えるデータをいくつか紹介します。
追加データ1: 国土数値情報 鉄道データ
今回の到達圏には鉄道データがなく、バスのみによるデータとなっています。しかし、都市の交通ネットワークを把握するためには鉄道路線を理解することは必要です。そのため、国土数値情報から鉄道データをダウンロードし、QGISに追加します。データには線路形状と駅が含まれており、新幹線、在来線、私鉄を分類してレンダリングします。ただし、時刻データを含んでいるわけではないので、今回の用途においては下絵のような位置付けになります。
追加データ2: 国土数値情報 行政区域データ
群馬県を囲む緯度経度を求めた行政区域データを表示することで、市町村名や市町村界を図示できます。交通政策は都市単位で議論されることが多いので、どこが境界かを把握することは重要です。例においては、行政区域ごとに色を塗り分け透過表示しています。行政区域データは、昭和の大合併、平成の大合併以前のデータも整備されているので、地域の成り立ちなども踏まえて理解するときは、過去のデータを重ねるのも有効です。
追加データ3: 運行頻度路線図
(株)トラフィックブレインの太田恒平氏が作り方も含めて紹介されている運行頻度図を作図して重ねてみました(例えば2019年4月20日開催の標準的なバス情報フォーマット/GTFS勉強会 #1で実習形式で作成方法を紹介しています)。路線ごとに運行本数が太さで可視化されているので、サービスの充実具合を具体的に把握できます。ここではまとめていますが、事業者ごとに色分けするなども出来ます。なお、運行頻度路線図を作図する際にはバス停を名寄せすることが望ましいです。群馬県のデータに対してどのように名寄せが出来るかは、別記事で解説するかも知れません。
追加データ4: 国勢調査 人口データ
e-StatのWebページから、2015年の国勢調査の[人口等基本集計に関する事項」をダウンロード出来ます。群馬県に絞り込んだデータはこのリンクからダウンロード出来ます。データはCSVファイルで提供されており、地理情報を含んでいないので、別に4次メッシュの境界データダウンロードします。これらのデータを紐付けてQGISに読み込んでください。
ギャラリー
これらのデータを利用して、いくつか到達圏解析を試してみました。
前橋駅12:55発の到達圏解析
JRに乗って前橋駅に到着したことを想定してバスによる到達圏を示してみました。広く、放射状に広がっていることが分かります。1日の便数が15本前後(1時間に1本程度)のバス路線沿線にも到達圏が広がっていますが、JRを1本ずらしたらどのくらい広く(狭く)なるか興味が湧きます。ただし、この解析にはJRや私鉄を含んでいないので、上毛電鉄沿線が到達圏外になっているなど実感とは異なりそうです。地域の交通を本当に分析するためには、バスだけ出なく鉄道のデータも必要になることが分かります。
群馬大学9:00着の到達圏解析
群馬大学に公共交通で通うためにはどこに住んだらいいでしょうか?実は、このエリアは南北に関越交通の路線が延びており、1日70往復程度(前橋駅方面)、50往復程度(渋川駅方面)とそれなりの本数運行しているのです。そのため、南北方向からは比較的大学に通いやすいことが分かります。それ以外は一度前橋駅に行ってから乗り換えが必要なようで、時間も掛かります。しかしよく見ると、公共交通が繋がっていない東西方向には国道17号線バイパスが走っており、自動車を使えば遥かに広いエリアから容易にアクセスできそうです。大学生が実際にどこに住んでどう通っているか、調べて比較してみると興味深そうですね。
前橋赤十字病院8:30着の到達圏解析
前橋赤十字病院は2018年6月に朝日町から移転したばかりの、大規模な総合病院です。バスに乗って診療受付開始時刻の8:30に到着するためには、どれくらい前に家を出る必要があるでしょうか。実は周辺から赤十字病院との間のバスの本数派と手も少なく、1日5,6往復の路線がいくつかの方向に出ているだけです。病院の立地は人口がそれほど多くない田園地帯ですので、バスで来れる人口は限られそうです。前歯橋駅は30分圏内ですが、到達圏が孤立しており、直行バスで繋ぐことで速達性を実現しているようです。また、前橋にある病院ですが、高崎市方面からも直行するバスがあるようです。この地図と、前橋赤十字病院の公式Webページの交通案内とを見比べてみるのも面白いかも知れません。
高崎駅21:30発の到達圏解析
高崎駅前(西口)を21:30に出ても、まだこの3方向ならばバスがあるようです。沿線に住んでいれば、2次会はともかく、1次会までなら参加出来そうです。なお注意が必要なのは、ベースとしているOpenStreetMapのデータにおいて高崎駅の東西が接続されておらず、徒歩で東西を跨ぐことが検索の時に考慮されていないようでした。この時間に、東口からのバスはないようなので結果への影響はほとんどないですが、利用しているデータの制約に注意が必要です。
まとめ
この記事では、オープンデータ、オープンソースを活用した到達圏解析の方法について紹介しました。技術的にはまだ洗練されているとは言い難いですが、誰にでも手に入れられるデータやソフトウェアで、ここまで地域の交通を網羅的に把握出来るということが伝えられたかと思います。この図を作るだけでもかつては大仕事でしたし、ダイヤを使わず平均所要時間などで作図していたので、必ずしも実情に合っていませんでした。ただし、データがバスに限ることと、OpenStreetMapのデータの制約で徒歩経路の検索の信頼性が高くないことには注意が必要です。OpenTripPlannerのアルゴリズムも検証が必要かも知れません。
いずれにしても、せっかく公開されている公共交通オープンデータですので、今後更に使い道を拡げられればと思っています。今回の記事で紹介した到達圏解析による等時線地図の作成も、QGISプラグインで出来るようにしたり、Webサービス化することも出来そうです。是非、様々な活用が広がることを期待しています。