新しいAPIに対応した記事を書きましたので,こちらのページを参照してください。
施設の点検や資産管理などの業務アプリケーションを構築する場合に,位置情報(緯度・経度)からその場所の住所へ変換したい場合があります。先に位置情報が分かっていて,そこの住所を知りたい場合は次のようなケースが考えられます。
- Google Mapや電子国土などのWeb GISと連携し,地図画面上でクリックした地点の住所を知りたい
- スマートフォンやGPS付きデジカメで撮影した写真の位置情報から住所を知りたい
これらのような位置情報をExcelに取り込んだあと,逆ジオコーディングのサービスを利用して住所に変換することが出来ます。
例えば,既知の位置情報として緯度がA2セルに,経度がB2セルに入力済みとし,住所に変換してC2セルに出力するという,簡単な例です。
位置情報から住所を求めるための逆ジオコーディングの関数を別途作成するとして,メインのマクロは以下のようになります。標準モジュールを作成し,以下のコードを記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Option Explicit Sub 逆ジオコーディングテスト() Dim 緯度 As Single, 経度 As Single, 住所 As String 緯度 = Range("A2").Value 'A2セルから緯度を取得 経度 = Range("B2").Value 'B2セルから経度を取得 住所 = ReverseGeoCoding(緯度, 経度) '住所へ変換 Range("C2").Value = 住所 '住所をC2セルに表示 End Sub |
10行目で呼び出しているように,引数に緯度・経度,戻り値が住所となるようなReverseGeoCodingという関数を作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
'緯度,経度から住所へ変換する Function ReverseGeoCoding(lat As Single, lon As Single) As String Dim xReq As MSXML2.XMLHTTP60 Dim xDoc As MSXML2.DOMDocument60 Dim xNodeList As MSXML2.IXMLDOMNodeList Dim xNode As MSXML2.IXMLDOMNode Dim URL As String 'ローカルサーチAPI 上から順にAPIキー,緯度,経度,検索半径(km), '世界測地系,カテゴリー(住所) URL = "http://map.yahooapis.jp/LocalSearchService/V1/LocalSearch" + _ "?appid=<あなたのアプリケーションID>" + _ "&lat=" + CStr(lat) + _ "&lon=" + CStr(lon) + _ "&dist=1" + _ "&datum=wgs" + _ "&category=address" Set xReq = New MSXML2.XMLHTTP60 'XMLHTTPオブジェクトをセット With xReq .Open "GET", URL, varAsync:=False '非同期モードで通信を開始 .send 'リクエストを送信 If .Status <> 200 Then Exit Function 'リクエストが成功しなかったら終了 Set xDoc = .responseXML '受信したXMLをDOMDocumentにして処理する End With With xDoc .setProperty "SelectionLanguage", "XPath" 'XPath形式でノードリスト取得 Set xNodeList = .SelectNodes("//Item") End With '最も近い住所を返す ReverseGeoCoding = xNodeList(0).SelectSingleNode("Address").Text Set xReq = Nothing Set xDoc = Nothing Set xNodeList = Nothing End Function |
〔4~7行目〕
逆ジオコーディングではXML形式でデータを受信しますので,その処理のためにXML通信やドキュメント・ノードなどのオブジェクトを用意する必要があります。XMLを利用できるよう,VBEの参照設定から Microsoft XML, V6.0 を選択しておきます。
〔12~18行目〕
APIへのリクエストURLを作成しています。逆ジオコーディングが可能なマップサービスは何種類かあると思いますが,ここではYahoo!デベロッパーネットワークで公開されている地図サービス(YOLP)のAPIを用います。
リバースジオコーダというずばりそのもののAPIもありますが,山中など住所・地名が見つからない場合もあったので,ローカルサーチAPIを用いて,半径1km以内の最も近い住所を探すようにします。
<あなたのアプリケーションID>には,Yahoo!デベロッパーネットワークに登録して取得したアプリケーションIDで置き換えます。
詳細な利用方法や利用規約などは以下のリンクから確認して下さい。
〔20~27行目〕
ローカルサーチAPIでリクエストするためのXMLオブジェクトを作成し,逆ジオコーディングのリクエストを行い,XML形式で受信します。
〔29~35行目〕
受信した結果の住所の一覧から読み取れるような処理をします。半径1km以内に見つかった住所のうち最も近いものを戻り値に設定します。
簡単ですが以上ですので,実行してみます。
必要に応じてボタンなどメニューを設ければ良いと思いますが,今回はマクロのメニューから直接実行します。
このように住所へ変換することができました。
このとき,APIにより以下のようなXMLを受信しています。LocalSearchResult以下の,Itemタグには,指定した位置情報から近い順に10箇所の住所が記載されているため,この中から一番最初の(0番目の)Addressタグを取得しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?xml version="1.0"?> <LocalSearchResult xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:yahoo:jp:maps http://map.yahooapis.jp/LocalSearchService/V1/LocalSearchResponse.xsd"> <Count>569</Count> <ViewCount>10</ViewCount> <Query/> <Item> <Category>Address</Category> <Title>東京都千代田区丸の内1丁目2</Title> <Address>東京都千代田区丸の内1丁目2</Address> <AddressLevel>5</AddressLevel> <DatumTky97> <Lat>35.67899444</Lat> <Lon>139.76615556</Lon> </DatumTky97> <DatumWgs84> <Lat>35.68223160</Lat> <Lon>139.76292215</Lon> </DatumWgs84> <Url/> </Item> <Item> … (繰り返し近い順に10件の住所のリスト) </Item> </LocalSearchResult> |
ダウンロード
上記の手順で作成することが可能ですが、自分で作るのは面倒という方は、上記のコードを含んだサンプルファイルをGumroadからダウンロードできます。