悲しくてとてもヤリキレナイ川 - 国土数値情報の流域メッシュデータ処理に関するバッドノウハウ

この記事は
FOSS4G Advent Calendar 2016 19日目の記事です。



日本全国の河川とその流域を地図に表した「DamMaps:川と流域地図」という地図タイルを公開しています。去年の秋口に思いつきで作り始め、今年の初めにVersion1.0を公開することができました。

この地図タイル、国土交通省が公開している国土数値情報のデータを利用しています。地図タイル制作の全体的な話は以前ブロクで書いたのですが

dambiyori.hatenadiary.jp

shapefileという標準的なデータ形式で配布されており、またFOSS4Gの各種ツールが揃っているので、「データ全部読み込ませてちょこちょこと設定したら完成!」くらいの気持ちでいました。ところがデータに起因するあれこれで落とし穴があって大変だったという話を書いてみたいと思います。

消えないヘアライン

川と流域地図の最も重要な要素である流域は、国土数値情報の「流域メッシュ」のデータをもとに作成しています。これは「3次メッシュ1/30細分区画(100mメッシュ)」と呼ばれる日本列島の緯度を3秒間隔、経度を4.5秒間隔で区切り、それぞれがどこの川の流域に属しているのかを表したデータで、一つ一つのメッシュをその四隅の経緯度を持った方形の地物の集まりとして表現されたデータになっています。
ただ、地図タイルをつくるにあたっては、同じ流域のメッシュはくっつけて一つの地物としてまとめておきたいため、QGISの空間演算ツールにある「融合(最新の2.18.1ではDissolve)」という処理を行うのですがどうも上手くいかないのです。
具体的にどんな風になるかというと、
f:id:dambiyori:20161217212424p:plain
※国土数値情報「流域メッシュ(JPGIS2.1)」により作成
グリッド状の細い隙間ができてしまうのです。試しにもう一度融合処理を行ってみたりしても一向に消えてくれない。さらに、データによっては融合処理がいつになっても終わらないという事態に陥ることもある始末。
これは一体なんなのか。結論からいうと、これは配布されている国土数値情報の流域メッシュのshapefileのデータの経緯度の精度が悪いことに起因していました。前述の通り流域メッシュの区画は経緯度を等分割したものでキリの良い数字になるはずなのですが、小数点第8位以下くらいからおかしな値が入ってる。
なので、小数点第6位くらいで丸めてあげたら見事に融合できる流域メッシュのデータが出来上がります。例えばQGISで流域メッシュのshapefileをgeoJSON形式に変換して出力、その後にrubyで書いたこんな感じのプログラムに通してあげれば上手くいくデータが吐かれます。

require 'json'

j = JSON.parse($stdin.read)

j['features'].each do |feature|
	feature['geometry']['coordinates'][0].each do |coordinate|
		coordinate.collect! do |v|
			v.round(6)
		end
	end
end

print JSON.pretty_generate(j)

調べてみるとJPGIS版のXMLデータでは経緯度が正しいようなので、どうやらshapefileの変換に問題がありそうな気がします。

不完全な河川名

流域メッシュのデータはメッシュの流域がどの河川のものなのかを表すデータとしてコードと名称をそれぞれ持っています。ところが全ての河川にユニークなコードが振られているわけではなく、一部の川が単一のコードにまとめられてしまっているようです。なので流域を分類するには河川コードだけではなく名称も使用しないといけなくなるのですが、この名称の精度が悪いのです。
どんな感じなのか説明するとメッシュによって名前の前の部分が途切れてたりする。例として処理に使用している河川名を集計したデータをあげると
f:id:dambiyori:20161217232740p:plain
と、こんな感じ。
北海道にあるヤリキレナイ川はコードが振られているものの
f:id:dambiyori:20161218091237p:plain
ただの川。
一体何がどうなるとこんなデータになるのかよくわかりませんが、仕方ないのでDamMaps:川と流域地図では後方一致で河川名同士を比較して文字数の最も多いものを河川名として採用するという名寄せ処理をしてます。
その他にも
f:id:dambiyori:20161217233547p:plain
※川と流域地図(国土数値情報「流域メッシュ」「河川」「湖沼」国土地理院 地球地図日本「行政界」により作成)
おそらく間違っていると思われるこんな感じのポツポツとごま塩降ったように分布するノイズのようなデータが場所によって含まれていたりしてどうにかしないとなーと思っているんですが1年経ってしまいました。どうにかしなければ。

というわけで、日本国内をほぼカバーする流域のデータの存在というのは大変素晴らしいですし、これがなかったら個人でこんな地図タイルの制作と公開なんてできなかったわけですけど微妙に精度が悪いという話でした。公開ページに記載してますが、「国土数値情報は国土計画関連業務のために作成されたデータが副次的に公開されたものであり、国土計画関連業務に差しさわりがない範囲で時間的、位置的精度において現況と誤差が含まれている」ということなのでこれが間に合っているデータ精度ということなのでしょうか。
っていうか、こんなバッドノウハウを書いて公開してる場合じゃなくて公開元にフィードバックするべきじゃないかという気がしてきたのでとっととメールしようと思います。