OSMとturf.jsで、館林の最寄りバス停発見データを作ってみる (基礎データ生成編)


この記事はOpenStreetMap Advent Calendar 2020Turf.js Advent Calendar 2020の21日目の記事(前半)になります。

何をやったかを簡単に

公共交通機関のあまり発展していない地方都市で、だからこそ少ない本数のバスを効率的に利用するために、最寄りのバス停を発見するためのデータを作ってみました。
前半後半に分かれており、この記事では前半の、OSMからOverpass Turboを使って基礎データを取り出すところを書きます。

館林の石仏調査、歩きで行うのは限界感

宇宙よりも遠い場所」というアニメの聖地巡礼でたびたび訪れることになった群馬県の館林ですが、歴史的にもとても面白い場所で、Code for History主宰としての興味がうずき、最近ではアニメ聖地巡礼よりも様々な歴史調査を目的に訪れています。
その調査の中で、50年前に現地の地方史研究会が実施した館林全体での石仏などの石造物の悉皆調査文献を見つけたので、その50年後の追調査も今は活動の一つになっています。
この追調査、もともと1人で始めたのですが、ぐんま史料ネットに参加して以降は館林市の教育委員会の方々などにも一部協力いただいたりしています(もっとも、市が行った調査をオープンデータにするか、Code for Historyの方でのデータとマージして公開してよいか、などはまだ未調整なのですが)。

その調査を進めるにあたり、今はCode for History(私)の調査は館林内でも羽附、赤生田といった地域、市の調査は旧館林町内(だいたい館林城内と城下町に一致)を中心にしています。
そのあたりはアニメの聖地でもあるので、まあ勝手知ったる場所になっており、歩きでもほとんど回れるのですが、しかしこの先他の地域にまで調査を広げることを考えると、館林市の端の端まで歩いて調査するというわけにもいきません。
アニメの聖地巡礼を通じて親しくなった現地の飲食店「もり陣」さんに原付を購入しておかせてもらう、といった手も、もしやるならばOKをもらってはいるのですが、原付の購入資金も必要ですし、飽くまで最終手段といったところです。

なにか取れる手はないかなと悩んでいたところ、これまでアニメの聖地巡礼だけでは全く選択肢に考えてなかった、バス路線の活用を思い立ちました。
館林のバス路線はお世辞にも充実しているとはいえず、これまでは行きたい先のそばピンポイントにバス停があるわけでもなく、かつ本数も極めて少ないので、だったら歩きの方がむしろ小回りも効くと思い選択肢として全く考えてきませんでした。
しかし、朝一番館林到着後にバスで郊外へ移動し、その地域を徹底調査後、夕方にバスで中央へ戻るという運用ならば、本数が少なくても十分に機能するはずです。

そうなると、効率的に運用するためにも、館林の各地域から最寄りのバス停を簡単に求めるためのデータが欲しくなります。
そのデータ作成を、OSMとturf.jsを使って行ってみました。

Overpass Turboを使って、基礎データを取得

幸い、館林のバス停やバス路線のデータは、どなたかがOSMで完全に整備してくれていました。
これをOverpass Turboを使ってデータを引っこ抜いてみます。

まずはバス停データから。
表示範囲を館林市域全体を含むようにして、クエリは以下のような感じになります。

結果をbus.geojsonとして保存
[out:json][timeout:25];
(
  node["highway"="bus_stop"]({{bbox}});
);
out body;
>;
out skel qt;


よく考えるとバス停だけじゃダメですね。
鉄道駅が近いところなら鉄道を使えばいいのですから、鉄道駅も取得しましょう。

結果をtrain.geojsonとして保存
[out:json][timeout:25];
(
  node["railway"="station"]({{bbox}});
);
out body;
>;
out skel qt;


鉄道は地図上に描画されてますが、バスルートは記述されてないので、バス停だけ見てもどこに行けるのかピンときません。
バスルートも抜き出しましょう。

結果をroutes.geojsonとして保存
[out:json][timeout:25];
(
  relation["route"="bus"]({{bbox}});
);
out body;
>;
out skel qt;


一応調査の対象は館林市内全域なので、どこまでなのか館林市を判定する境界情報も欲しいですね。

結果をboundary.geojsonとして保存
[out:json][timeout:25];
(
  relation["name"="館林市"]({{bbox}});
);
out body;
>;
out skel qt;


これで基礎データ収集は終了です、超簡単。
Overpass Turboむっちゃ便利ですね!
もちろん、一番素晴らしいのはデータを整備してくれた方ですが。

==========================================
前半の記事はここまでです。
続きは、Turf.jsを使って最寄りのバス停、鉄道駅を導出する基礎データを生成する、後半の記事をご覧ください。