Postgresqlで逆ジオコーディングDBを作成する方法

MBL開発部 Nです。

GPSを利用したサービスを作成する場合、緯度経度を住所に変換したくなります。
しかし商用利用の場合、有料サービスばかりですし、コストの計算やAPI取得失敗した際の動作を考えたりするの面倒ですよね。
この記事の方法でPostGISが利用出来るpostgresqlサーバがあれば日本国内の逆ジオコーディングデータベースを自前で構築することが出来ます。元データの取得も無料ですし簡単です。

こちらのe-stat 政府統計ポータルサイトの統計地理情報システムより境界データのダウンロードが出来ます。
画面リンクより
地図 > 境界データダウンロード > 小地域 >国勢調査 > 2020年 >小地域(町丁・字等別)(JGD2000)>世界測地系緯度経度・GML >北海道
とリンクを辿っていくと北海道の境界データが取得できます。
今回は 01101 札幌市中央区 という境界データをダウンロードしてみます。

ダウンロードしたzipファイルの中には r2ka01101.gml というXMLが入っています。
こちらのXMLデータから逆ジオコーディングすることだけを考えると

この4つのタグが必要になります。

といった他のタグは今回は使いません。

では取り込んで逆ジオコーディングしてみましょう。

まずテーブルを作成します。例なので最小限のカラムで作成します。

境界データのxmlを逆ジオコーディングテーブルにインポートするプログラムを作成します。プログラム言語はPHPです。import.phpとしましょう。
これも例なのでとりあえず動く程度のものを用意します。

実行するとreverse_geocoding_2020テーブルにデータが作成されます。
※ geography型の「geography_data」は長いため、表示の都合上省いています。

では弊社の座標から住所を取得してみます。弊社は東経141.357154度 北緯43.063176度付近です。
この座標から500m以内のデータを取得し、近い順から10件取得します。

弊社の住所 北海道札幌市中央区北一条東一丁目 が一番近いデータとして取得できました。

国勢調査によるデータなので5年毎に更新とデータの更新スパンが長い点は有料サービス等と比べると見劣りしますが、
住所自体は頻繁に変わるものでは有りませんので大体の方にはこの方法で十分な逆ジオコーディングが出来るのではないでしょうか。