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

たなちの開発日誌

プログラミングのメモを中心に気になったことを書いていきます。

住所を緯度経度に変換する方法(ジオコーディング)

概要

住所→緯度経度に変換することを「ジオコーディング」
その逆は「逆ジオコーディング」というらしいですね。

GoogleMapのAPIだとそのまま使えそうな機能が用意されているらしいのだけれど、
OpenStreetMapで使える方法として調査しました。

住所、緯度経度の情報を持つレコードをDBに格納し、SQLで取得することで実現する方法を書きます。

国土交通省のGISデータを使ってみる

国土交通省のGISデータはこちらから取得できます。
位置参照情報ダウンロードサービス
※GISデータとは、地理情報システム(Geographic Information System)のこと。

名寄せという問題がありますが、対応が難しいので今回は完全一致を前提として進めます。

住所名の揺れ対応が難しい
「兵庫県XXX市1-2-3」 と 「ヒョウゴ県xxx市1丁目2番地3号」 を同じ緯度経度としたいが、名寄せ(データクレンジング)して同一視させるのは大変。

初めて地図周りの技術に触れた時に作ったまとめ資料 - Qiita

ダウンロードページをみると国土交通省のAPIがあるみたいだけど試行版だからいずれ正式版が出るのでしょうか?現状はこれを用いて開発した人のブログ等が見つからないので知ってる方いたら教えてください。

また、他のWebAPIではNominatimというものがありますが、街区レベルの取得はできないようです。
OpenStreetMapでジオコーディング -でじうぃき

DBへインポート

国土交通省からDLしたデータを下記の方法でphpMyAdminに突っ込みました。

・「ファイルの最初の行にテーブルのカラム名が含まれている。(これをチェックしなかった場合、最初の行はデータの一部と見なされます。)」にチェックを入れる。
・csvの文字コードをUTF-8(BOM無し)に変換 。
・「CSV using LOAD DATA」を選択し、「フィールド区切り記号」を「;」から「,」に変更する。
teratail.com

取りこんだ結果

select文のwhere句でカラム(都道府県名、市区町村名、大字・町丁名、街区符号・地番 の4列)を指定すれば緯度・経度を取得できます。実際のデータの中身はこんな感じです。f:id:chi_tana:20170316214405p:plain

実際のコードはいずれ書くかもしれないが、ひとまずこんな感じで自前のジオコーディングができることがわかりました。ただ、実用としては定期的に最新データを自分でダウンロードする必要があるので、やはりWebAPIで最新の情報を取得できた方が嬉しいですね。

参考にさせていただいたサイト

住所(市区町村番地)から緯度経度を取得する - Qiita
自前で逆ジオコーディングをやってみる - そうだ車輪と名づけよう 7th

市区町村一覧
総務省|電子自治体|全国地方公共団体コード