緯度・経度から地名を検索
以下、緯度・経度から地名を検索するメモ。
http://refits.cgk.affrc.go.jp/index.htmlのhttp://refits.cgk.affrc.go.jp/tsrv/jp/rgeocode.htmlを利用する。WebサービスのURLはhttp://refits.cgk.affrc.go.jp/tsrv/rgeocode.phpと記述されてるけど、実際はhttp://refits.cgk.affrc.go.jp/tsrv/jp/rgeocode.php。リクエストURLの形式は以下。
http://refits.cgk.affrc.go.jp/tsrv/jp/rgeocode.php?lat=36.1105388888889&lon=137.592175
IEでリクエストしてみると以下のように表示されるXMLが返ってくる。
- <rgeocode> <status>true</status> - <prefecture> <pcode>20</pcode> <pname>長野県</pname> </prefecture> - <municipality> <mcode>20202</mcode> <mname>松本市</mname> </municipality> <meta name="thanks" content="このサービスは 国土交通省 提供 国土数値情報(行政区域データ) を利用しています" /> </rgeocode>
この方法でCGIから呼び出せば利用できるんだけど、今回はJavaScriptから利用してみるテスト。
JavaScriptから呼び出してXMLデータ取得しても良いんだけど、JSONPが使えるらしいので試してみる。リクエストするURLにパラメタ追加する。以下参照。
http://refits.cgk.affrc.go.jp/tsrv/jp/rgeocode.php?lat=36.1205305555556&lon=137.647558333333&jsonp=func_name
とりあえず、このURLをIEで開いたら、phpファイルのダウンロードに。うん?保存したファイルの内容は以下。あぁそういう事か。
func_name({ 'status' : true, 'result' : { 'prefecture' : { 'pcode' : 20, 'pname' : '長野県' }, 'municipality' : { 'mcode' : 20202, 'mname' : '松本市' } }, 'argument' : { 'latitude' : 36.1205305555556, 'longitude' : 137.647558333333 }, 'uri' : '/tsrv/jp/rgeocode.php?lat=36.1205305555556&lon=137.647558333333&jsonp=func_name', 'meta' : [ { 'name' : 'thanks', 'content' : 'このサービスは 国土交通省 提供 国土数値情報(行政区域データ) を利用しています' } ] });
ドメインを超えるのでJSONscriptRequest()を使用する(Ajax.Request()してeval()しようと思ったら、ドメイン超えられずに失敗したw)。JSONscriptRequest()を利用する時はJSON and the Dynamic Script Tag: Easy, XML-less Web Services for JavaScriptからjsr_class.jsを引っ張ってくる。
このあたりを参考にさせていただきました。
で、ReFitsのrgeocodeを利用するコードは以下。
// 緯度経度から地域名を取得する(テスト) function call_rgeocode() { var lat = 36.1205305555556 ; var lng = 137.647558333333 ; // パラメタ var params = "?lat=" + lat + "&lon=" + lng + "&jsonp=func_name" ; // rgeocedeWebサービスのURL var req = "http://refits.cgk.affrc.go.jp/tsrv/jp/rgeocode.php" ; // JSONscriptRequestオブジェクトの生成 var bObj = new JSONscriptRequest( req + params ); // Build the dynamic script tag bObj.buildScriptTag(); // Add the script tag to the page bObj.addScriptTag(); } // jsonpパラメタで指定する関数 function func_name( rgeo ) { if( rgeo.status == true ) { // 県名 var pname = rgeo.result.prefecture.pname ; // 市町村名 var mname = rgeo.result.municipality.mname ; var lat = rgeo.argument.latitude ; // 緯度 var lng = rgeo.argument.longitude ; // 経度 alert( '(' + lat + ',' + lng + ') : ' + pname + mname ) ; } else { // error } }
bObj.AddScriptTag()を呼び出したタイミングでfunc_name()が呼び出されるっぽい。この方法、楽なんだけど…他のサイトでも言われてたけど、サーバが変なことするレスポンス返してきたらやばそうな感じ。ちなみにこっち()も試してみたんだけど…なんでか住所データは見つかりませんでしたと言われる…
ReFitsは市町村がもう少し細かくなるとありがたいなぁ…