Overpass APIで日本の道路を取得する
なにこれ
routrace(https://routrace.ponkotuy.com)というアプリを作っているのですが、どうしてもOSMの元データに沢山のエラッタがあって、直さざるをえなかったり、調査が必要になったりすることが多いので、Overpass APIの使い方をざっくりまとめておきます。
Overpass APIは独自のクエリを使ってOSMの巨大な地理データから必要なデータを取り出すことができるAPIです。
実行するときはOverpass Turboを使うと便利です。https://overpass-turbo.eu/
予習:wayとrelationの違い
ChatGPTまとめです
wayはノードを並べた線や閉じた面という「形」そのものを表し、relationはノード/way/他relationを役割付きで束ねてルート・境界・マルチポリゴンなどの「関係やまとまり」を表す。
高速道路の取得
まずwayを取得する方法。
[out:json][timeout:30];
way["highway"="motorway"]["name"~"東名"];
(._;>;);
out body;
ちなみに~なので東名高速道路と、新東名高速道路と、東名阪自動車道が引っ掛かります。=にすると完全一致です。
2行目がキモなので、以降は2行目のみ書きます。
wayが取得できればおわり、そう思っていた時期がぼくにもあったのですが、routraceのような地図を書きたい場合はrelationの取得が必要です。なぜなら、トンネルなどはnameがトンネル名になっててnameの検索からは取得できないことがあるからです。というのでrelationの取得は以下です。
relation["name"~"東名高速"]["route"="road"];
こまったことに高速道路を正しく取得する方法が名前から類推するしか無いようです。
relationもwayも共通する話として、E1Aなどから取得したい場合は検索条件をrefにするといいです。
国道の取得
wayを取得する方法。
way["ref"="58"]["highway"];
国道はrefがかなりちゃんとしているのでrefで検索すれば大体問題ないです。
relationを取得する方法。
relation["ref"="58"]["route"="road"]["network"~"JP:national"];
国道のrelationはnetworkがちゃんと書かれていることが多いのでこれを軸に取得します。refだけだと同じ番号の県道とかが引っ掛かってしまうんですね。
ちなみにこのままだとおそらく海上国道という書類上の路線が、あたかも海の上に国道があるかのように描写されるため、殆どの場合除外する必要があります。 [!"access"="no"] などとすればいいでしょう。