緯度・経度から地名を検索

以下、緯度・経度から地名を検索するメモ。
http://refits.cgk.affrc.go.jp/index.htmlhttp://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は市町村がもう少し細かくなるとありがたいなぁ…