OpenStreetMap のノートデータを GeoJSON モドキに変換する
OpenStreetMap のノート機能によって残されたノートを取り出して解析しやすくできたらいいなと思ってデータを変換してみました。
まずノートのデータは Planet OSM の notes
から最新のデータをダウンロードして解凍。
データは次のような 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 utf8
みたいな感じで使います。
出力された GeoJSON モドキは最後の3行が
}, ] }
となっているので、テキストエディタで
} ] }
となるようにカンマを消さないとエラーが出ます、油断大敵です。
出来上がった GeoJSON も世界中のデータが乗っているので、日本だけ切り出すために QGIS でクリップの処理か、日本のあたりだけ選択して選択されたオブジェクトだけを保存すると日本のデータだけが取り出せます。
XML を一気に読まないで逐次処理する方法探した方がいいだろうな…。