ダム日和スマートフォン用の表示で見るまずまずのダム日和この広告は、90日以上更新していないブログに表示しています。日本全国の河川とその流域を地図に表した「DamMaps:川と流域地図」という地図タイルを公開しています。去年の秋口に思いつきで作り始め、今年の初めにVersion1.0を公開することができました。この地図タイル、国土交通省が公開している国土数値情報のデータを利用しています。地図タイル制作の全体的な話は以前ブロクで書いたのですがdambiyori.hatenadiary.jpshapefileという標準的なデータ形式で配布されており、またFOSS4Gの各種ツールが揃っているので、「データ全部読み込ませてちょこちょこと設定したら完成!」くらいの気持ちでいました。ところがデータに起因するあれこれで落とし穴があって大変だったという話を書いてみたいと思います。消えないヘアライン川と流域地図の最も重要な要素である流域は、国土数値情報の「流域メッシュ」のデータをもとに作成しています。これは「3次メッシュ1/30細分区画(100mメッシュ)」と呼ばれる日本列島の緯度を3秒間隔、経度を4.5秒間隔で区切り、それぞれがどこの川の流域に属しているのかを表したデータで、一つ一つのメッシュをその四隅の経緯度を持った方形の地物の集まりとして表現されたデータになっています。地図タイルをつくるにあたっては、同じ流域のメッシュはくっつけて一つの地物としてまとめておきたいため、QGISの空間演算ツールにある「融合(最新の2.18.1ではDissolve)」という処理を行うのですがどうも上手くいかないのです。メッシュ(JPGIS2.1)」により作成グリッド状の細い隙間ができてしまうのです。試しにもう一度融合処理を行ってみたりしても一向に消えてくれない。データによっては融合処理がいつになっても終わらないという事態に陥ることもある始末。これは一体なんなのか。結論からいうと、これは配布されている国土数値情報の流域メッシュのshapefileのデータの経緯度の精度が悪いことに起因していました。前述の通り流域メッシュの区画は経緯度を等分割したものでキリの良い数字になるはずなのですが、小数点第8位以下くらいからおかしな値が入ってる。小数点第6位くらいで丸めてあげたら見事に融合できる流域メッシュのデータが出来上がります。QGISで流域メッシュのshapefileをgeoJSON形式に変換して出力、その後にrubyで書いたこんな感じのプログラムに通してあげれば上手くいくデータが吐かれます。JSON.pretty_generate(j)調べてみるとJPGIS版のXMLデータでは経緯度が正しいようなので、どうやらshapefileの変換に問題がありそうな気がします。流域メッシュのデータはメッシュの流域がどの河川のものなのかを表すデータとしてコードと名称をそれぞれ持っています。ところが全ての河川にユニークなコードが振られているわけではなく、一部の川が単一のコードにまとめられてしまっているようです。流域を分類するには河川コードだけではなく名称も使用しないといけなくなるのですが、この名称の精度が悪いのです。どんな感じなのか説明するとメッシュによって名前の前の部分が途切れてたりする。例として処理に使用している河川名を集計したデータをあげるとと、こんな感じ。北海道にあるヤリキレナイ川はコードが振られているもののただの川。何がどうなるとこんなデータになるのかよくわかりませんが、仕方ないのでDamMaps:川と流域地図では後方一致で河川名同士を比較して文字数の最も多いものを河川名として採用するという名寄せ処理をしてます。より作成)おそらく間違っていると思われるこんな感じのポツポツとごま塩降ったように分布するノイズのようなデータが場所によって含まれていたりしてどうにかしないとなーと思っているんですが1年経ってしまいました。いうわけで、日本国内をほぼカバーする流域のデータの存在というのは大変素晴らしいですし、これがなかったら個人でこんな地図タイルの制作と公開なんてできなかったわけですけど微妙に精度が悪いという話でした。おいて現況と誤差が含まれている」ということなのでこれが間に合っているデータ精度ということなのでしょうか。いうか、こんなバッドノウハウを書いて公開してる場合じゃなくて公開元にフィードバックするべきじゃないかという気がしてきたのでとっととメールしようと思います。冬コミのお知らせ月別アーカイブはてなブログをはじめよう!dambiyoriさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。