読者です 読者をやめる 読者になる 読者になる

OpenStreetMap のノートデータを GeoJSON モドキに変換する

Windows PowerShell OSM

OpenStreetMap のノート機能によって残されたノートを取り出して解析しやすくできたらいいなと思ってデータを変換してみました。

まずノートのデータは Planet OSMnotes から最新のデータをダウンロードして解凍。
データは次のような XML になっていました

<?xml version="1.0" encoding="UTF-8"?>
<osm-notes>
<note id="4" lat="36.7232991" lon="68.8641500" created_at="2013-04-24T08:07:02Z" closed_at="2013-04-24T08:08:51Z">
  <comment action="opened" timestamp="2013-04-24T08:07:02Z" uid="1626" user="FredB">test</comment>
  <comment action="closed" timestamp="2013-04-24T08:08:51Z" uid="1626" user="FredB"></comment>
</note>
<note id="6" lat="35.5170066" lon="139.6322554" created_at="2013-04-24T08:12:38Z">

こんなんが約 205MB 分くらい書かれています。

最初は PowerShell でまじめに

PS> [xml](Get-Content planet-notes-latest.osn)

とかやろうとしたのですが、速攻でメモリが無くなったのであきらめました。

とりあえず今回ほしかったのは note 要素が持つ属性だけだったので、<note がある行だけを抜き出して文字列として処理する PowerShell スクリプトを書きました。
取り出した要素を GeoJSON っぽいフォーマットで表示させます。この方法だと一気に全部読まずに逐次処理するのでそんなにメモリを食いませんでした。
一応、ソースを乗っけておきますが、ほかの人が見ると頭を抱えそうなひどいコードです。

PS> ConvertFrom-Osn-to-GeoJSONmodoki.ps1 | Out-File notes.geojson -Encoding Default

みたいな感じで使います。

出力された GeoJSON モドキは最後の3行が

},
  ]
}

となっているので、テキストエディタ

}
  ]
}

となるようにカンマを消さないとエラーが出ます、油断大敵です。

出来上がった GeoJSON も世界中のデータが乗っているので、日本だけ切り出すために QGIS でクリップの処理か、日本のあたりだけ選択して選択されたオブジェクトだけを保存すると日本のデータだけが取り出せます。

XML を一気に読まないで逐次処理する方法探した方がいいだろうな…。