Google Mapを使って住所から緯度経度を取得
Google Mapを使って住所から緯度経度を取得
住所から緯度経度を取得できるとなかなか便利です。
例えば、指定した2つの住所間の直線距離を算出するとか、そんなことができます。
本来であれば、住所と緯度経度のデータを全てDBに溜めておいて、そこから引っ張ってこないといけないわけですが、そんな膨大なデータを溜めておくだけでもけっこう大変だし、統廃合時の保守を考えたらめちゃめちゃ大変です。
そこで、Google Mapを使って緯度経度を簡単に求める方法を紹介します。
元ネタはどこぞのサイトにあったのですが失念(/_\;)
アルゴリズム
アルゴリズムというほどたいそうなもんではないです。
Google Mapに住所を示す文字列をパラメータとして検索させ、その結果返されるコンテンツ内の緯度経度情報を拾うというだけです。
現状では、Google MapのURLはhttp://maps.google.co.jp/maps、住所の文字列を渡すパラメータはqですので、
http://maps.google.co.jp/maps?q=住所文字列
というような呼び出し方をすればOKです。
ただし、住所文字列のエンコードはUTF-8である必要があるので注意。
しかし、この方法だと以下の問題点があります。
・Google MapのURLが変更となった場合に動作しない
・Google Mapのパラメータ仕様が変更となった場合には動作しない
・当然、Google Mapが障害、サービス停止、サービス廃止となった場合には動作しない
・住所と緯度経度との精度はGoogle Mapに依存
要するに完全にGoogle Mapに依存しているので、Google Map様の機嫌が悪くなると破綻します。
実装例
指定した住所に対応する緯度と経度を返すサブルーチンの例です。
use LWP::Simple qw(get); sub get_latitude_longitude { my ($address) = @_; $address =~ s/(\W)/'%' . unpack('H2', $1)/eg; my $r = get("http://maps.google.co.jp/maps?q=$address"); $r =~ /lat:([\d\.]+),lng:([\d\.]+)/; return ($1, $2); }