Geo::Coder::YahooJapan なるモジュールがアップされたので早速使ってみる。 Googleのgeocoderは日本の住所で現在検索できないらしく、他のサービスだとgeocoding.jpが有名みたい。 Geo::Coder::YahooJapanは「Yahoo Japan Geocoder API」のラッパー(そんなのあったのね、ウィジェット用みたい)で、日本語の地名で検索→緯度経度取得が可能。
今回は、Geo::Coder::YahooJapanで検索をして、その結果得られた座標点を中心とするGoogle Mapsを表示するってのを作ってみた。方針として極力シンプルに、非同期通信などせずに、得られた座標点をそのままテンプレートに渡して表示、テンプレートはGoogle Maps APIのドキュメントにあるサンプルをあまり変えずにって感じで。
これが動いているサンプル→Geo::Coder::YahooJapan + Google Maps(六本木ヒルズで検索)
これ、検索結果の返りが意外なのがあって結構面白い。 例えば、 japanで検索すると「BEAMSJAPAN」がでてきたり、 江ノ島で検索すると「江ノ島電鉄 七里ケ浜駅」がでてきたり、おれんちがある 鎌倉山で検索すると鎌倉の鎌倉山がでてこないで長野の鎌倉山がでてきたり。 (追記: これはいくつか複数の検索結果から1件だけ取得して表示しているからだとは思う) 以下ソース。
maps.cgi
#!/usr/bin/perl
use strict;
use CGI;
use Template;
use Geo::Coder::YahooJapan;
use Location::GeoTool;
use Data::Dumper;
my $cgi = new CGI;
my $q = $cgi->param('q');
my $r = lookup($q);
my ($lat, $lng) = ( $r->{latitude}, $r->{longitude} );
my $tokyo = Location::GeoTool->create_coord($lat, $lng, 'tokyo', 'degree');
my $wgs = $tokyo->datum_wgs84;
($lat, $lng) = ($wgs->lat , $wgs->long);
my $template = Template->new;
my $output;
my $dumper = Dumper($r);
my $vars = {q => $q , r => $r, dumper=> $dumper, lat => $lat, lng => $lng};
$template->process( 'maps.tt', $vars, \$output );
print $cgi->header(-type=>'text/html',-charset=>'utf-8');
print $output;
maps.tt
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
<title>Geo::Coder::YahooJapan + Google Maps</title>
<script src="http://maps.google.com/maps?file=api&v=2&key="
type="text/javascript"></script>
<script type="text/javascript">
//<![CDATA[
function load() {
if (GBrowserIsCompatible()) {
var map = new GMap2(document.getElementById("map"));
map.addControl(new GLargeMapControl());
map.addControl(new GMapTypeControl());
map.addControl(new GScaleControl());
map.setCenter(new GLatLng([% lat %], [% lng %]), 13);
var textnode = "[% r.title %] <br> [% lat %], [% lng %]";
var marker = new GMarker(map.getCenter());
map.addOverlay(marker);
marker.openInfoWindowHtml(textnode);
}
}
//]]>
</script>
</head>
<body onload="load()" onunload="GUnload()">
<form action="maps.cgi" method="get">
Search: <input type="text" name="q" size="32" value="[% q %]"/>
<input type="submit" />
</form>
<p>Result of <strong>[% q %]</strong> by Geo::Coder::YahooJapan / render as Google Maps</p>
<h1>[% r.title %]</h1>
<p>[% r.description %]</p>
<p>[% r.genre %]</p>
<div id="map" style="width: 600px; height: 400px"></div>
<pre>
[% dumper %]
</pre>
</body>
</html>


コメント (3)
はじめまして。このページを参考にさせていただいています。
一点自分試している時つまづいたところを補足させていただきます。
2006/11/6現在で試したところ、GoogleMapsの座標がwgs84ではなく
tokyoの方らしく、このサンプルそのままに実行すると
得られる結果がずれてしまいます。
記事内の六本木ヒルズで検索するサンプルは正しくポイントされるので
修正されているようなのですがCGIの以下の2行をコメントアウトすると良いようです。
my $wgs = $tokyo->datum_wgs84;
($lat, $lng) = ($wgs->lat , $wgs->long);
では。
投稿者: pickles | 2006年11月 6日 08:10
日時: 2006年11月 6日 08:10
おお、ご指摘どうもですー
投稿者: ゆーすけべー
|
2006年11月 8日 20:35
日時: 2006年11月 8日 20:35
PHP4、PHP5版ってつくれないですか
投稿者: 774 | 2007年12月28日 15:06
日時: 2007年12月28日 15:06