« MT3.3xでTechnoratiへATOMフィードを使ってタグ情報を送る | メイン | TTのシンプルな使い方 »

Geo::Coder::YahooJapan + Google Maps

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&amp;v=2&amp;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>

トラックバック

このエントリーのトラックバックURL:
http://yusukebe.com/mt/mt-tb.cgi/1947

この一覧は、次のエントリーを参照しています: Geo::Coder::YahooJapan + Google Maps:

» Yahoo Japan Geocoder API 送信元 using API;
Yahoo!デベロッパーネットワークでは公開されていないが、Yahoo!は日本語の地名を投げると緯度経度を返すGeocoding用のRESTのAPIを提供... [詳しくはこちら]

コメント (3)

pickles:

はじめまして。このページを参考にさせていただいています。

一点自分試している時つまづいたところを補足させていただきます。
2006/11/6現在で試したところ、GoogleMapsの座標がwgs84ではなく
tokyoの方らしく、このサンプルそのままに実行すると
得られる結果がずれてしまいます。

記事内の六本木ヒルズで検索するサンプルは正しくポイントされるので
修正されているようなのですがCGIの以下の2行をコメントアウトすると良いようです。
my $wgs = $tokyo->datum_wgs84;
($lat, $lng) = ($wgs->lat , $wgs->long);

では。

おお、ご指摘どうもですー

774:

PHP4、PHP5版ってつくれないですか

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)


ブログSEO対策:track word seo