OpenStreetMapでOverpass APIを使って数値地図データを得る方法

2019年10月12日

kunimiyasoftのAndroidアプリケーションで使っている数値地図データは国土地理院のものですが、要件を満たさない部分も多いです。例えば「基盤地図情報」は特殊性が高いため一般の地図を作るのには不適ですし、主に使っている「日本地図センター」の20万分の1数値地図は、道路や鉄道などの内容が希望どおりではありません。

そこで、本腰を入れてOpenStreetMapの地図利用を考えてみました。

1.OpenStreetMapは数値地図データを取得できる

地図をラスタイメージ(地図画像)で取得できるイメージが強いOpenStreetMapですが、数値地図データ(ベクターイメージ)でも地図を取得できます。その数値地図データを使えば、OpenStreetMap本家の地図とは違う、オリジナルの地図が作成できます。

それなら何故に今まで使わなかったのかと言うと、OpenStreetMapの日本地図が不完全だったことと、次のような問題があったからです。

2.OpenStreetMapの数値地図データは膨大で処理が大変

OpenStreetMapの数値地図のデータ量は膨大で、私の持っているパソコンでは処理が重すぎるので、今まで使っていませんでした。

その数値地図データを取得する方法は、次のような方法があります。

OpenStreetMapのサイト画面から数値地図を得る

OpenStreetMapのサイト画面で「エクスポート」を選ぶと、指定した範囲の数値データを取得できます。しかし、少し範囲が広くなるとエクスポート不能になってしまい、北海道全体だと途方もない回数が必要になります。あくまでも、狭い範囲を取得するだけの機能です。

OpenStreetMapのサイト画面にあるOverpassを使う

上記の方法だと狭い範囲でしかエクスポートできませんが、「Overpass」のボタンを押してエクスポートすると、広い範囲もダウンロードが可能です。しかし、札幌エリアだけ指定してダウンロードしたとしてもデータサイズが大きすぎて、私の作ったGISであるJSMAP2で処理するには重すぎます。

planet.osmをダウンロードする

全世界の数値地図データが「planet.osm」で提供されています。しかしギガバイト単位のデータ量を持つので、とても扱えません。抽出する手段があるにしても、面倒です。

Geofabrik のダウンロード

こちらのボタンで提供される画面では、世界のリージョン別に数値地図をダウンロードできます。「Asia」「Japan」と選んで行くと「Hokkaido」があります。ここでダウンロードできる数値地図ファイルのサイズは100MB強と小さめですが、圧縮されています。解凍すれば、やはりサイズが大きくなります。

Geofabrikでダウンロードできる数値地図は、Garmin GPS用の地図作成に便利です。

Overpass APIを使う


リンク:http://overpass-api.de/query_form.html

残された最後の手段は、「Overpass API」です。「Overpass API」を使うと、地図の抽出に条件を付けることができます。例えば北海道の道路地図であれば、検索キーに「緯度経度」と「道路」を指定すれば良いことになります。

OverPass APIの仕様

しかし、このAPIの仕様が理解できずに苦しみました。いろいろコマンドを作って実行しても、予期しないデータが取得されて難航していました。この度、ようやく取得できたので、公開します。

3.Overpass APIで道路データを取得する

「20万分の1帯広」の地図範囲で、高速道路の地図データを取得します。コマンドの内容は以下のとおりです。

<osm-script>
  <union>
    <query type="node">
      <has-kv k="highway" v="motorway"/>
      <bbox-query s="42.67" n="43.33" w="143" e="144"/>
    </query>
    <query type="way">
      <has-kv k="highway" modv="" v="motorway"/>
      <bbox-query s="42.67" n="43.33" w="143" e="144"/>
    </query>
    <query type="relation">
      <has-kv k="highway" modv="" v="motorway"/>
      <bbox-query s="42.67" n="43.33" w="143" e="144"/>
    </query>
  </union>
  <union>
    <item/>
    <recurse type="down"/>
  </union>
  <print/>
</osm-script>

高速道路と高規格道路だけのデータなので、取得する地図データ量は少ないです。これを、私の作ったGISであるJSMAP2に読み込ませてみます。

表示できました!。インターチェンジの部分が抜けていますが、これはmotorway_link属性の部分のはずです。

4.Overpass APIで博物館データを取得する

今度は、ウェイポイントを取得してみます。Overpass仕様書を見ると、「amenity=museum」とあります。これを、コマンドにすると

<query type="node">
  <!-- ボックスを指定 -->
  <bbox-query s="41.00" n="46.00" w="139.00" e="146.00" />
  <!-- 指定のみ抜き出す -->
  <has-kv k="amenity" v="museum" />
</query>
<print/>

これで、博物館のosmファイルが取得できます。取得できるデータですが、かなり偏りがあります。図書館でもそうですが、全体のほんの一部だけしか取得できないのが現状です。⇒これは、ポイントで指定されずに、ポリゴン図形の建物に名称が付いているため、取得できないようです。現状、良い取得方法が分かりません。

5.Overpass APIでOpenStreetMapの地図データを活用しよう!

このように、Overpass APIを使うことによって、条件分だけのOpenStreetMapの数値地図が手に入りました。これで、OpenStreetMapの数値地図データを利用した地図アプリケーションを作成できそうです。地図アプリの「東京周辺マップ」や「さっぽろ周辺マップ」も、道路と鉄道に関してOpenStreetMapのデータに置き換えて行こうと思います。

OpenStreetMapの地図が充実してきましたので、皆さんも利用してみてはいかがでしょうか。

※ライセンスの表記問題

後で気付いたことですが、OpenStreetMapの地図データを利用する場合、地図画面にライセンス表記が必要なようです。地図画面には正直、ライセンス記述は載せたくないのですが。

ライセンスに関しては以下のサイトで記述されていますが、考えてみます。

JA:License/Use Cases