QGISを使ったOSMデータの品質チェック

OSMデータの品質チェック

OSMデータの品質チェックツールは、OsmoseやOSM inspectorなど様々なツールが提供されています。しかしこれらのツールはタグのエラーチェックであり、地物が実在しているのかはチェックできません。

地物が実在しているかどうかを間接的にチェックする方法として、他データと比較検証する方法があります。ここでは、国が提供している国土数値情報(KSJ)とOSMデータを比較してみます。

下図のように、KSJデータとOSMデータをプロットし、両者の位置がほぼ一致(例えばデータ間の距離が200m以内に収まっている、といった基準で判断できます)していればそのデータは正しいと考えることができます。一方、KSJにはあるがOSMにはないデータは、OSMに追加する必要があるでしょう。また、OSMにあってKSJにないデータは、地物の実在性が怪しかったり、タグが間違っている可能性があります。データのチェックが必要です。

以下本文では、QGISを使ってOSMデータとKSJデータを比較する方法について説明します。

注意:KSJにあってOSMにないデータが見つかった場合、KSJデータをソースにしてOSMデータを作成してはいけません。規約でKSJデータのインポートは禁止されています。追加が必要な地物が見つかったら、他のデータソース(例えば地理院地図)を参照してデータを追加してください。

f:id:muramototomoya:20200118150200p:plain

KSJデータとOSMデータの比較イメージ

データの準備

例として、鹿児島県の学校データをチェックしてみます。

  1. まず見やすいように、背景地図として日本地図データを入手します。「地球地図日本」から「全レイヤ」をダウンロードします*1。ZIPファイルの中に入っている"polbnda_jpn.shp"をあとで使います。"polbnda_jpn.*"ファイルは同じフォルダにまとめておいてください。
  2. Overpass-turboからOSMデータを取得します。ウィザードに、"amenity=school in 鹿児島県"と入力して実行し、《エクスポート》→《ダウンロード/GeoJSON》でファイルを保存します。"export.geojson"という名前でファイルが保存されます。

    f:id:muramototomoya:20200116211452p:plain

    Overpass-turboで検索した鹿児島県のOSM学校データ
  3. 国土数値情報(KSJ)からデータを取得します。学校データの「鹿児島」を選んでファイルをダウンロードします。"P29-13_46.shp"を使います。

QGISに読み込み

  1. QGISをダウンロード・インストールし、起動します。

    f:id:muramototomoya:20200117192831p:plain

    QGIS画面
  2. 日本地図を読み込みます。まず、《レイヤ》→《レイヤの追加》→《ベクタレイヤの追加》をメニューから選び…

    f:id:muramototomoya:20200117193027p:plain

    ベクタレイヤの追加
  3. ベクタデータセットf:id:muramototomoya:20200117194553p:plainアイコンを押して、"polbnda_jpn.shp"を選択します。日本のデータを読み込むときはShiftJISを選択するのが無難。

    f:id:muramototomoya:20200117194720p:plain

    日本地図データの読み込み
  4. 「 座標参照系選択」の画面が出た場合は、《フィルター》にJGD2000と入力し、《世界の座標参照系》の《地理参照系》の下にあるJGD2000を選びます。二つありますが、どっちでも大して変わりません。JGD2000はたくさんありますが、《投影座標系》のものを選んではダメです。

    f:id:muramototomoya:20200117194114p:plain

    座標参照系を選択
  5. これで日本地図が読み込めました。

    f:id:muramototomoya:20200117195310p:plain

    日本地図が読み込めた
  6. 次にOSMデータを読み込みます。先ほどと同じように、《レイヤ》→《レイヤの追加》→《ベクタレイヤの追加》をメニューから選び、Overpass-turboからダウンロードした"export.geojson"を選択します。OSMデータはUTF-8です。

    f:id:muramototomoya:20200117195711p:plain

    OSMデータはUTF-8
  7. ノード(ポイント)で作成された学校と、エリア(ポリゴン)で作成された学校が混在しているようです。どちらも使うので、《全てを選択》して進みます。

    f:id:muramototomoya:20200117195904p:plain

    ノードとエリア
  8. 鹿児島県のOSM学校データが読み込めました。

    f:id:muramototomoya:20200117200159p:plain

    鹿児島県内のOSM学校データ
  9. 読み込まれたデータは左下の《レイヤー》に表示されます。読み込んだOSMデータはノードデータとエリアデータに分かれて読み込まれました。

    f:id:muramototomoya:20200117200932p:plain

    データレイヤー


  10. ノードとエリアが混在しているのも扱いが面倒なので、全部ノードにしてしまいましょう。《ベクタ》→《ジオメトリツール》→《中心点》を選び…

    f:id:muramototomoya:20200117201057p:plain

    エリアをノードに変換
  11. 入力レイヤにOSMのエリアデータを指定します。

    f:id:muramototomoya:20200117201337p:plain

    中心点の作成
  12. エリアデータをノードに変換した「中心点」というデータができました。

    f:id:muramototomoya:20200117201725p:plain

  13. 元からあったノードデータとエリアを変換したノードデータをまとめましょう。《ベクタ》→《データ管理ツール》→《ベクタレイヤの結合》を選び…f:id:muramototomoya:20200117202811p:plain

  14. 《入力レイヤ》から結合するノードデータを選びます。この画面だと"export export"という同じ名前のデータが二つあり、エリアとノードが区別できませんね。あらかじめ名前をわかりやすく変更しておくべきでした。

    f:id:muramototomoya:20200117203306p:plain

  15. 「結合された」データが作成されました。結合前のデータ(レイヤ)は削除して構いません。

    f:id:muramototomoya:20200117203602p:plain

  16. KSJデータの読み込みます。同じように、《レイヤ》→《レイヤの追加》→《ベクタレイヤの追加》をメニューから選び、"P29-13_46.shp"ファイルを読み込みます。
  17. 見やすいように色を適当に変更しましょう。レイヤ名も分かりやすいようにOSMとKSJに変えました。

    f:id:muramototomoya:20200118143154p:plain

    データの読み込み完了

データ処理

まず、KSJにはあるがOSMにはないデータを抽出します。手順としては、(1)OSMデータを中心に半径200mの円を描き、(2)作成した円の中に入っていないKSJデータを抽出する、ことになります。その後、同じようにOSMにはあるがKSJにはないデータを抽出(KSJデータを中心にしたの円に入っていないOSMデータを抽出)します。

  1. まずはデータの前処理です。メニューから、《ベクタ》→《データ管理ツール》→《レイヤの再投影》を選び…
  2. 《入力レイヤ》に"OSM"を指定します。《変換先CRS》のボタンを押して…

    f:id:muramototomoya:20200118213628p:plain

    レイヤの再投影設定
  3. 《投影座標系》から"EPSG:2444"を選んで実行します。処理するデータを赤い枠がカバーするものを選ぶとよいです。すると「再投影された」という名前のレイヤができるはずです。

    f:id:muramototomoya:20200118213451p:plain

    投影座標系を選択
  4. 次に、OSMデータを中心にした反映200mの円を作成します。メニューから《ベクタ》→《空間演算ツール》→《バッファ》を選び…

    f:id:muramototomoya:20200118213823p:plain

    バッファ作成
  5. 《入力レイヤ》に先ほど作成した「再投影された」レイヤを選びます。《距離》には、冒頭で説明したOSMデータとKSJデータの同一性を判断する距離を入力します。ここでは200mにしました。ちなみに、《投影座標系》に変換することでここでの距離をメートル単位で指定することができていますが、入力レイヤに《地理参照系》のデータを指定すると距離を「角度」で指定しなければなりません。《投影座標系》は北緯**度、東経**度という表記なので距離も角度で指定しなければならないのです。《投影座標系》に再投影する際に、北緯**メートル、東経**メートル、という形に変換されたので、距離をメートル単位で指定することができるようになったのです。

    f:id:muramototomoya:20200118214026p:plain

    バッファの設定
  6. 実行すると、「バッファ」という名前でOSMデータを中心にした反映200mの円が作成されます。

    f:id:muramototomoya:20200118214356p:plain

    半径200mの円
  7. 200m円の外側にあるKSJデータを抽出します。メニューから《ベクタ》→《調査ツール》→《場所による選択》を選び…

    f:id:muramototomoya:20200118214522p:plain

    場所による選択
  8. 《地物の選択》に「KSJ」を指定し、《地物のあるところ》に「disjoint」(含まれないという意味)を選択し、《からの特徴を比較することによって》に先ほど作成した200mの円「バッファ」を指定します。

    f:id:muramototomoya:20200118214835p:plain

    場所による選択設定
  9. 実行すると条件に該当する点が選択されます。ウィンドウ下部に

    f:id:muramototomoya:20200118215049p:plainと表示されているはずです。KSJにはあるがOSMにはないデータが6個見つかりました。

  10. ではこの6個のデータをファイルに保存します。「KSJ」レイヤを選択して、《地物をコピー(Ctrl+C)》します。

    f:id:muramototomoya:20200118215232p:plain

    「KSJ」レイヤを選択すること
  11. 《新規レイヤへの地物貼り付け》→《新規ベクタレイヤ》を選び…

    f:id:muramototomoya:20200118215509p:plain

    新規ベクタレイヤに地物を貼り付け
  12. ファイル形式は「GeoJSON」に、ファイル名は適当に、CRSは「WGS 84」を選んで、ファイルを保存します。これで、KSJにはあるがOSMにはないデータをファイルに保存することができました。

    f:id:muramototomoya:20200118220129p:plain

    レイヤを保存
  13. 同じように、OSMにはあるがKSJにはないデータを作成してgeojsonファイルに保存してください。

JOSMに読み込んでOSM編集

  1. では最後にOSM編集です。JOSMの《ファイル》 →《開く…》で、先ほど作成したgeojsonファイルを開きます。
  2. ファイルを開いても、ノードなのでどこにデータがあるのか見えにくいです。《すべて選択》するとデータが見やすくなります。データのひとつを拡大してみると、学校が見つかりました。地理院地図の標準地図に載っているのでマッピング可能ですね。

    f:id:muramototomoya:20200118221132p:plain

    地物の実在をチェック(背景地図:GSImaps/std, seamlessphoto)
  3. OSMデータを作成するために、まずOSMデータをダウンロードします。ここで重要な点ですが、《新しいレイヤーとしてダウンロード》してください。普通の《ダウンロード》だと、ダウンロードしたデータが読み込んだgeojsonデータ(元KSJデータ)と混ざってしまうため、場合にKSJデータがOSMにアップロードされてしまいます。ご注意ください。

    f:id:muramototomoya:20200118221538p:plain

  4. あとはいつもと同じようにマッピングして終了です。お疲れさまでした。Happy validation!

備考

ここでは学校データを検証してみましたが、現在のOSMデータには以下のような課題がありそうです。

  1. OSMにデータインポートされたのちに、廃止された学校がかなりありそう。
  2. 自動車学校や専門学校が`amenity=school`でタグ付けされている。これらの施設はタグが確立されていないけれど、`amenity=school`はあまり適切でないと思われる。

注意

  • QGISについては初心者なので何か間違ったことを書いているかもしれません。
  • 今回はOSMデータの品質チェックを目的にしたので、位置情報の精度については気にしていません。本当は、座標系の違い(WGS84とJGD2000の違い)などを気にしてデータを処理すべきなのでしょうが、大した違いはないので無視します。
  • 国土数値情報の学校データには大学が含まれていますが、OSMのamenity=schoolには大学が含まれません。ちゃんとやる場合はここは修正したほうがよいです。
  • このやり方では、学校の名称が変わった場合についてはチェックできません。

本資料の画像およびデータは以下のものを使用しています。

*1:データは粗いのですが軽いので便利