Node.jsでAPIを叩いてリバースジオコーディング


Node.jsでXMLの処理をしたかったのでついでにリバースジオコーディングをしたときのメモです。
XMLの解析には`xml2js`のモジュールを利用しています。

##利用するAPI
###Yahoo!JAPAN 逆ジオコーダAPI
[YOLP(地図):Yahoo!リバースジオコーダAPI - Yahoo!デベロッパーネットワーク](http://developer.yahoo.co.jp/webapi/map/openlocalplatform/v1/reversegeocoder.html)

色々と逆ジオコーディングをするAPIはあって議論はあると思いますが，個人的には日本国内の場合はYahoo!Japanの地図が情報がしっかりしていると思います。

※例えば，2014年1月1日に岩手県岩手郡滝沢村が市制移行して滝沢市になりましたが，Google MAP APIでは現時点(2014年2月)で`滝沢村`表記ですが，Yahooでは`滝沢市`になっています。[滝沢市市制移行](http://www.city.takizawa.iwate.jp/shiseiikou)

###サンプルリクエスト
※appidは各自取得して下さい

http://reverse.search.olp.yahooapis.jp/OpenLocalPlatform/V1/reverseGeoCoder?appid=(あなたが取得したAPPID)&lat=39.802157&lon=141.137170

必須パラメータは以下です．
・appid ユーザー毎のID
・lat 緯度
・lon 経度

####39.802157,141.137170の座標で試してみる
[39.802157,141.137170は岩手県立大学の座標です](https://maps.google.co.jp/maps?q=39.802157,141.13717&ie=UTF-8&ei=41ADU5voKdHYkgXAy4DwBg&ved=0CAkQ_AUoAQ)

####レスポンスはこんな感じ
```response.xml
{
    "YDF": {
        "$": {
            "firstResultPosition": "1", 
            "totalResultsAvailable": "1", 
            "totalResultsReturned": "1", 
            "xmlns": "http://olp.yahooapis.jp/ydf/1.0"
        }, 
        "Feature": [
            {
                "Geometry": [
                    {
                        "Coordinates": [
                            "141.137170,39.802157"
                        ], 
                        "Type": [
                            "point"
                        ]
                    }
                ], 
                "Property": [
                    {
                        "Address": [
                            "岩手県滝沢市巣子"
                        ], 
                        "AddressElement": [
                            {
                                "Code": [
                                    "03"
                                ], 
                                "Kana": [
                                    "いわてけん"
                                ], 
                                "Level": [
                                    "prefecture"
                                ], 
                                "Name": [
                                    "岩手県"
                                ]
                            }, 
                            {
                                "Code": [
                                    "03216"
                                ], 
                                "Kana": [
                                    "たきざわし"
                                ], 
                                "Level": [
                                    "city"
                                ], 
                                "Name": [
                                    "滝沢市"
                                ]
                            }, 
                            {
                                "Kana": [
                                    "すご"
                                ], 
                                "Level": [
                                    "oaza"
                                ], 
                                "Name": [
                                    "巣子"
                                ]
                            }, 
                            {
                                "Kana": [
                                    ""
                                ], 
                                "Level": [
                                    "aza"
                                ], 
                                "Name": [
                                    ""
                                ]
                            }
                        ], 
                        "Country": [
                            {
                                "Code": [
                                    "JP"
                                ], 
                                "Name": [
                                    "日本"
                                ]
                            }
                        ]
                    }
                ]
            }
        ], 
        "ResultInfo": [
            {
                "CompressType": [
                    ""
                ], 
                "Copyright": [
                    "Copyright (C) 2014 Yahoo Japan Corporation. All Rights Reserved."
                ], 
                "Count": [
                    "1"
                ], 
                "Description": [
                    "指定の地点の住所情報を取得する機能を提供します。"
                ], 
                "Latency": [
                    "0.0043249130249023"
                ], 
                "Start": [
                    "1"
                ], 
                "Status": [
                    "200"
                ], 
                "Total": [
                    "1"
                ]
            }
        ]
    }
}
```

##node.jsから呼び出す
###`xml2js`をインストール
```
$ npm install xml2js
```

http.get()を使ってリクエストURLを叩き、responseデータであるbody変数に対してparseString()を行い要素を取り出す．住所にはdata.YDF.Feature.Property.Addressでアクセスできます。

・xml2jsのドキュメントはこちら[Leonidas-from-XIV/node-xml2js ](https://github.com/Leonidas-from-XIV/node-xml2js) 他にも色々出来るみたいです


```index.js
//リバースジオコーディング
var parseXML = require('xml2js').parseString;
var http = require('http');
var url = 'http://reverse.search.olp.yahooapis.jp/OpenLocalPlatform/V1/reverseGeoCoder';
url += '?appid=あなたのappid';
url += '&lat=39.802157';
url += '&lon=141.13717';

var address = "";
http.get(url, function(res){
	var body = '';
	res.setEncoding('utf8');
	
	res.on('data', function(chunk){
		body += chunk;
	});
 
	res.on('end', function(res){
		parseXML(body, {
			trim: true,
			explicitArray: false
		},function (err, data) {
			if (err) {
				throw err;
			}
console.log(data.YDF.Feature.Property.Address); //結果
		});
	});
}).on('error', function(e){
	console.log(e.message); //エラー時
});
```

###出力結果
```結果
岩手県滝沢市巣子
```