2012年4月4日水曜日

Perlを使って、XMLのデータを取得する方法(geocodingで経度・緯度を取得する)

http://www.ibm.com/developerworks/jp/xml/library/x-xmlperl2.html


ここのブログがとても参考になりました。
ありがとうございます!!


住所の一覧があるのですが、それを使って
一度に全ての住所の経度・緯度を取得したくて数日悩んでおりました。

PerlでXMLを操作することで、
経度緯度をgoogleのgeocoding(ジオコーディング)を使って
取得することが出来たのでメモ。


まずはソースから。
こんな感じです。
----------------

#!/user/local/bin/perl

use strict;
use Jcode;
use LWP::Simple;
use URI::Escape;
use XML::Simple;
use Data::Dumper;

my $query = 'ここに好きな住所を入れる';
$query = Jcode->new($query, 'utf8')->utf8;
$query = uri_escape($query);
my $url = "http://www.geocoding.jp/api/?v=1.1&q=$query";

my $document = LWP::Simple::get($url) or die "cannot get content from $url";

my $parser = XML::Simple->new;
my $data = $parser->XMLin($document);


print Dumper($data) . "\n";

------

いつものように、復習しながら見ていきたいと思います。
まず最初のuse ~がついているところ。

use strict;
use Jcode;
use LWP::Simple;
use URI::Escape;
use XML::Simple;
use Data::Dumper;


use strictは、プログラムする際にミスが少なくなるように使います。
コレを使うときは、my $xxみたいに「my」を付けないとエラーが返ってきます。
その下の、
use Jcode;
use LWP::Simple;
use URI::Escape;
use XML::Simple;
use Data::Dumper;

これはCPANのモジュールです。
まだCPANをインストールしていない方は以下のページをよく見て
インストールしてください!



my $query = 'ここに好きな住所を入れる';
$query = Jcode->new($query, 'utf8')->utf8;
$query = uri_escape($query);


これは、文字コードが違う場合は、
文字化けしてしまわないように指定します。
もし文字コードが同じなら、特に指定しなくても大丈夫です。


my $url = "http://www.geocoding.jp/api/?v=1.1&q=$query";


今回はグーグルのジオコーディングを使うので、
そのAPIのURLを指定します。


my $document = LWP::Simple::get($url) or die "cannot get content from $url";

指定した住所と、googleのURLを合体させて、
そこで得られた情報を
$document変数に代入します。


my $parser = XML::Simple->new;
my $data = $parser->XMLin($document);

$documentに代入できた情報をパースして、
$data変数に入れます。


print Dumper($data) . "\n";

最後に$dataを表示させます。


---
34.710834
137.726126
34,42,39.002
137,43,34.054


こんな情報が得られるので、
経度はlatの「34.710834」
緯度はlngの「137.726126」

です!



0 件のコメント:

コメントを投稿