住所から緯度・経度に変換(ジオコーディング)する。

旧ローカルサーチAPIの提供終了に伴い、現在、本記事で変換ができなくなっております。近々に代替案に差し替えます。


公共施設の維持管理のためGISにプロットしたり,防災マップを作成したりなど,大量の住所データから位置情報データ(緯度・経度)に変換する必要がある場合,ジオコーディングサービスを使って処理することが可能です。逆ジオコーディングの事例同様,Yahoo!のWebサービスを使った例です。

汎用性を持たせるため,やはりジオコーディング部分を関数として作成することを考えます。
つまり,住所(文字列)を引数として与えて,位置情報(緯度・経度)が戻り値となります。通常,一つの関数で戻り値を複数とできませんので,以下のような対応が考えられます。

  1. 緯度と経度が戻り値となる関数を別々に作り,同じ引数(住所)で2回呼び出す。
  2. 緯度と経度をつなげた文字列が戻り値となる関数を作り,呼び出し側で分離する。
  3. 緯度と経度の情報をもつユーザー定義型変数を定義し,1つの関数で戻るようにする。

上記のうち,3の方法が最もスマートと考えられますので,このパターンでコーディングします。
下図のように,A2セルに入力した住所から緯度・経度に変換し,B2~C2セルに出力する簡単な例とします。

ジオコーディング

標準モジュールの宣言セクションにCoodinate(座標)を定義します。Single型で緯度と経度を持たせます。
次に実行部分を下に続けて入力します。

10行目

座標という変数を定義したCoordinate型で宣言します。

13行目

新しく作るGeoCodingという関数で座標へ変換します。引数は住所(文字列)で,戻り値はCoordinate型で緯度・経度が戻ってきます。

15~16行目

ユーザー定義したCoordinate型は.Latで緯度,.Lonで経度が得られます。
次にGeoCoding関数を作成します。

21行目

GeoCodeingという関数を定義しています。Jushoという文字列を引数に,Coordinate型の戻り値になっています。

23~24行目

ジオコーディングではAPIからXML形式でデータを受信しますので,その処理のためにXML通信やドキュメントなどのオブジェクトを用意する必要があります。XMLを利用できるよう,VBEの参照設定から Microsoft XML, V6.0 を選択しておきます。

XMLの参照設定

28~30行目

APIへのリクエストURLを作成しています。オプションの?p=以降には住所を指定しますが,UTF-8でURLエンコードした文字列が必要となるため,さらに別の関数UrlEncodeをあとで作成します。
逆ジオコーディングと同様に,Yahoo!デベロッパーネットワークで公開されている地図サービス(YOLP)のAPIを用います。
<あなたのアプリケーションID>には,Yahoo!デベロッパーネットワークに登録して取得したアプリケーションIDで置き換えます。
詳細な利用方法や利用規約などは以下のリンクから確認して下さい。


Webサービス by Yahoo! JAPAN

32~39行目

ローカルサーチAPIでリクエストするためのXMLオブジェクトを作成し,ジオコーディングのリクエストを行い,XML形式で受信します。

41~51行目

得られたXMLデータ内のCountタグで条件分岐し,0なら見つからなかったので,緯度・経度は0として返すようにします。

見つかった場合は1以上となり,1番最初のDatumWgs84タグ(世界測地系)の1番目の子ノードLatから緯度,2番目の子ノードLonから経度を取得します。

次に,UTF-8でURLエンコードする関数を作ります。ここでは割愛しますが,検索すれば他サイトで詳しく解説が載っていると思います。

これで完成しましたので,マクロを実行してみます。

実行結果

実際,リクエストによって位置情報が見つかった場合,以下のようなXMLデータが得られます。この場合,住所による位置情報と郵便番号による位置情報の2件見つかっているため,Countが2となっています。

もし実際にない住所を入力した場合は見つかりませんので,以下のようにCountが0と得られます。

ダウンロード

上記の手順で作成することが可能ですが、自分で作るのは面倒という方は、上記のコードを含んだサンプルファイルをGumroadからダウンロードできます。

関連記事