Google Ajax Search APIでジオコーディング

ジオコーディングの定義がよくわかっていないのですが、この記事では検索文字->座標を割り出すことにしてます。

さて、以前にたくさんの座標を取得する必要があり、 http://www.geocoding.jp/api/ なんかを頼りに一つ一つ調べていたのですが、あまりの多さにらちがあかないと思い、自動化しようと思いました。

ジオコーディングは実はGoogle Ajax Search APIで実現できます。(
現在はGoogle Maps APIで代用できるようです。わかり次第報告します。)Google Ajax Search APIはその名前の通りAjaxでGoogle検索する代物です。ご存じの方も多いと思いますが、Google検索にはWeb検索、画像検索、地図検索のように対象ごとに検索エンジンが分かれています。これはGoogle Ajax Search APIでも同様でこのAPIで地図検索をすればジオコーディングができてしまいます。

さて、Google Ajax Search APIを使うには以下からAPIKeyを取得する必要があります。

http://code.google.com/apis/ajaxsearch/signup.html
ただどうやらURLごとに発行されるこのKeyはGoogle Maps APIで取得したKeyと同じようですでにGoogle Maps APIでkeyを取得されている方はそのkeyをそのまま使うことができます。

keyを取得したらページの中に以下のようなJavaScriptを追加すればokです。

<script src="http://www.google.com/uds/api?file=uds.js&v=0.1&key=***" type="text/javascript" charset="utf-8"></script>
検索の仕方ですが地図検索はGlocalSearchクラスで行えます。Google Ajax Search APIはAjaxの部分が完全に隠蔽されているので、検索結果を受け取るメソッドをsetSearchCompleteCallbackで指定し、executeを呼び出すだけで終わりです。JavaScriptで以下のように書きます。

var query = "東京駅";
var gls = new GlocalSearch();
gls.setSearchCompleteCallback(null, onQueryComplate);
gls.execute(str);

setSearchCompleteCallbackの第一引数は、globalな関数を第二引数に指定するときは不要です。次にonQueryComplateの実装ですが、GlocalSearchオブジェクトのresultsに検索結果が格納されているので、その中身をチェックすれば良いです。

function onQueryComplate() {
if (gls.results[0]==undefined) {
alert("見つかりません");
} else {
var point = gls.results[0];
var gpoint = new GLatLng(point.lat,point.lng);
alert(query + "=" + gpoint)
}
}

resultsに格納されているオブジェクトの詳細は以下のGlocalResultクラスを見るとよいです。

http://code.google.com/apis/ajaxsearch/documentation/reference.html#_class_GlocalResult
今回の一通りのコードをまとめたのが以下です。(実行する際はapikeyのところだけ置き換えてください)

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Google Ajax Search API Test</title>
<script src="http://maps.google.com/maps?file=api&v=2&key=***" type="text/javascript" charset="utf-8"></script>
<script src="http://www.google.com/uds/api?file=uds.js&v=0.1&key=***" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
<!--
var query = "東京駅";
var gls = new GlocalSearch();
gls.setSearchCompleteCallback(null, onQueryComplate);
gls.execute(query);
function onQueryComplate() {
if (gls.results[0]==undefined) {
alert("見つかりません");
} else {
var point = gls.results[0];
var gpoint = new GLatLng(point.lat,point.lng);
alert(query + "=" + gpoint)
}
}
//-->
</script>
</head>
<body>
<h1>Google Ajax Search API Test</h1>
</body>
</html>