アオカケスの鳥かご

日々の出来事を綴っていきたい

国土交通省が提供している緯度経度情報を可視化してみた

少し前に作った現在地の住所を表示するwebアプリ。
aokakes.hatenablog.com

自分で使っていて、ある特定の地域に行くと住所が表示されないという不具合を発見しました。
住所が表示されない一番の原因は、緯度経度情報から住所を検索する速度を上げるためにある程度検索範囲を絞っていたからなのですが、それにしてもおかしいような気がしました。

1座標あたり数百件程度の住所から検索するようにチューニングしていたつもりでしたが、どうやら甘かったようです。

実際に移動中に使ってみると、結構長い間住所が表示されていなかったため、予想以上に広い範囲で緯度経度が登録されていなそうです。

住所検索の際に使用している緯度経度情報は国土交通省が提供している位置参照情報ダウンロードサービスからお借りしているものなので、住所が表示されていなかった市のデータを確認してみました。
nlftp.mlit.go.jp

すると、どうやらその市の島の情報しかなく、本土の情報は一切ありませんでした。

私は確信しました。
日本全国で同じような場所がいっぱいあるはずだ、と。

とはいえ、実際に移動しながら調べるなんていう芸当は勿論出来ませんし、400万件を超えるデータを1つずつ確認していくなんてことも出来ません。

そこで、緯度経度情報を可視化してみることにしました。

下準備

まずはgooglemapで日本全体が収まるような四隅の座標を調べます。
適当に四捨五入して整数にすると以下のように設定しておけば問題無さそうです。

左上:(48,120)
左下:(22,120)
右上:(48,155)
右下:(22,155)

次に、座標を画像化しやすい値に変形させるために少し計算します。

基本的にプログラムで座標を扱うときは左上が原点(0,0)になるので、x座標(緯度)は単純に左上のx座標である120を引くだけです。
y座標(経度)はx座標と同様に引いてしまうと上下が逆になってしまうため、48から可視化したい座標を引きます。

x座標(緯度): x - 120
y座標(経度): 48 - y

生成する画像のサイズを決めます。
HTML5のGeolocation APIで取得できる緯度経度の値は小数点第六位まであります。
最高の精度で可視化しようとなると各値を100万倍すればよいですが、そんなことをやってしまうととんでもないサイズになってしまいます。

実際にやってみたい気は少なからずありますが、今回はどのあたりのデータが足りていないかさえ分かれば十分なので、各値を100倍にします。

画像サイズは4隅の座標のそれぞれの差を取って 3500 × 2600 となります。
(155 - 120) × 1000 = 3500
(48 - 22) × 1000 = 2600

実装

準備が出来たのでプログラムを書いていきます。
言語はpython3です。

日本全国の緯度経度が入っているCSVファイルを読み込み、上述の通りに変換した座標に赤い印を付けるだけです。

緯度経度情報の可視化

実行結果
f:id:aokakes:20190215162423p:plain

ちゃんと日本が浮かび上がりました。うれしい。

さて、赤が緯度経度情報が存在する場所で、黒が存在しない場所です。
関東や名古屋、大阪あたりはかなりの赤さですね。さすが大都会。

こうして可視化してみると、やはり山間部のデータが全然足りてませんね。
北海道なんてかろうじて形が分かるレベルです。

この感じだと住所が表示されない場所はかなり多いですね。
どうしたものか...

まとめ

多くの人の生活圏内は大体網羅していそうですが、少し山のほうに入ると途端に怪しくなる感じでしょうか。
よく見てみると、私が検証した場所はどこも赤い場所ばかりでした。

これでは旅先で使うのは少し厳しいですね。

一応はデータベースの検索範囲を広げるなどで住所が表示されないことについては解決できますが、先ほどの画像を見る限り精度は悪そうです。

市町村の境界の座標を細かく取ってくればかなり正確な住所を取得できることが考えられますが、それをやるには相当な時間と気力が必要そうな気がします。
スクレイピングとかでうまいこと取ってこれないかな...厳しいかな...


おまけ
400万件のデータの画像化には相当な時間がかかると思っていましたが、そんなことはありませんでした。
f:id:aokakes:20190215165604p:plain


おわり。