Adobe Creative Suite 出力対応店一覧をGoogle Mapsで表示させる(14)
スポンサードリンク
アドビのCS5対応プリントショップのリストのページから、Google Mapsに表示させるやつの14回目。
前回は、Google Maps APIから取得する箇所で「OVER_QUERY_LIMIT」というステータスが出ている個所の原因が、取得間隔が短すぎることにあると思い、sleep 1; を入れて1秒WAITを入れることで、見事「OVER_QUERY_LIMIT」を消すことができました。しかしまだ「ZERO_RESULTS」というステータスが出る箇所が残っている、というところまでやりました。
今回は、「ZERO_RESULTS」と出る箇所をどのように解消すればいいか、ということを考えてみます。
まず、ZERO_RESULTS、というのは、答えがない、ていうことですので、Google Maps APIで見つからないっていうことだと思います。ということで、どのような問い合わせ(クエリー)をしたら、答えがない、といわれたか、ということを見てみました。
プログラムを以下のように変えます。変えた内容は、statusで「ZERO_RESULTS」が得られたときに、クエリー内容と、返却された値を出力します。
Filename: test13.pl
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use Web::Scraper;
use YAML;
use Encode;
use WebService::Simple;
my $geo = WebService::Simple->new(
response_parser => 'JSON',
base_url => 'http://maps.google.com/maps/api/geocode/',
param => {
region => 'jp',
language => 'ja',
sensor => 'false',
},
);
open my $fh, '<', 'printshop.html';
my $html = decode_utf8(do { local $/; <$fh> });
close $fh;
my $s = scraper {
process '//div[@class="tabcontent"][1]//table[@class="data-bordered max"]/tbody/tr', 'codes[]' => scraper {
process '//td[1]', pref => [ 'TEXT', sub { s/\s//g; } ];
process '//td[2]', company => [ 'TEXT', sub { s/\s//g; } ];
process '//td[3]', address => [ 'TEXT', sub { s/\s//g; s/TEL:.+$//i; return $_; } ];
process '//td[3]', phone => [ 'TEXT', sub { s/\s//g; if(m/TEL:([\d-]+)/i){return $1;};}];
process '//td[3]', fax => [ 'TEXT', sub { s/\s//g; s/:/:/g; if(m/FAX:([\d-]+)/i){return $1;};undef;}];
process '//td[4]', illustratorcs5 => [ 'TEXT', sub { return $_ =~m|yes|i ? 1 : undef; } ];
process '//td[5]', indesigncs5 => [ 'TEXT', sub { return $_ =~m|yes|i ? 1 : undef; } ];
process '//td[6]', pdfx1a => [ 'TEXT', sub { return $_ =~m|yes|i ? 1 : undef; } ];
process '//td[7]', pdfx4 => [ 'TEXT', sub { return $_ =~m|yes|i ? 1 : undef; } ];
};
};
my $scraped = $s->scrape($html);
#print Dump($scraped->{codes});
foreach my $item ( @{$scraped->{codes}} ) {
my $address = $item->{address};
#print "$address\n";
my $res = $geo->get( 'json', { address => $address } );
my $val = $res->parse_response();
next if $val->{status} ne 'ZERO_RESULTS';
print encode_utf8("\nQuery: $address\n");
print Dump( $val );
sleep 1;
}
exit;
__END__
これを実行する。
$ perl test13.pl > results13.txt
$ less results13.txt
Query: 岐阜県岐阜市長良福田町1丁目30番地 --- results: [] status: ZERO_RESULTS Query: 京都府京都市下京区烏丸松原下ル五条烏丸町407-2烏丸KT第2ビル2F --- results: [] status: ZERO_RESULTS Query: 大阪府大阪市西城区南津守7-15-16 --- results: [] status: ZERO_RESULTS
どうやら、この3つの住所がGoogle Maps APIのジオコーディングでは出ないみたいです。
さっそく調べてみましょう。
岐阜県岐阜市長良福田町1丁目30番地
については、アドビのページに掲載されているこの住所に建っている会社さん(岐阜製版さん)のウェブサイトで調べても住所は相違ないんですが、Google Mapsでその会社さんの名前で検索して、その場所の緯度・経度から逆ジオコーディングをしてみます。
Google Mapsで「岐阜製版」で検索し、その場所を拡大して右クリックし、表示されたメニューの中から、「ここを地図の中心とする」を選択したあと、「リンク」をクリックして表示されたアドレスのなかかから、「このリンクをメールに貼り付けて地図を共有できます」の欄に表示されたアドレスは、
http://maps.google.co.jp/maps?f=q&source=s_q&hl=ja&geocode=&q=%E5%B2%90%E9%98%9C%E8%A3%BD%E7%89%88&sll=35.449484,136.773863&sspn=0.007481,0.021136&brcurrent=3,0x6003abc442c1690f:0x6a5eedbaac598cab,0&ie=UTF8&hq=%E5%B2%90%E9%98%9C%E8%A3%BD%E7%89%88&hnear=&ll=35.448821,136.773844&spn=0.000935,0.002642&z=19&iwloc=A
このURLのllっていうところが、緯度・経度となります。
ll=35.448821,136.773844

これを、逆ジオコーディングしてみます。
緯度・経度から、住所を求める逆ジオコーディングスクリプトは、次の通りです。
Filename: test14.pl
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use Web::Scraper;
use YAML;
use Encode;
use WebService::Simple;
use Data::Dumper;
my $geo = WebService::Simple->new(
response_parser => 'JSON',
base_url => 'http://maps.google.com/maps/api/geocode/',
param => {
region => 'jp',
language => 'ja',
sensor => 'false',
},
);
my $ll = '35.448821,136.773844';
my $res = $geo->get( 'json', { latlng => $ll } );
my $val = $res->parse_response();
#print encode_utf8("\nQuery: $address\n");
print Dump( $val );
exit;
__END__
実行結果:
---
results:
- address_components:
- long_name: 30
short_name: 30
types:
- sublocality_level_4
- sublocality
- political
- long_name: 1丁目
short_name: 1丁目
types:
- sublocality_level_2
- sublocality
- political
- long_name: 福田町
short_name: 福田町
types:
- sublocality_level_1
- sublocality
- political
- long_name: 岐阜市
short_name: 岐阜市
types:
- locality
- political
- long_name: 岐阜県
short_name: 岐阜県
types:
- administrative_area_level_1
- political
- long_name: 日本
short_name: JP
types:
- country
- political
formatted_address: '日本, 岐阜県岐阜市福田町1丁目30'
geometry:
location:
lat: 35.4488088
lng: 136.7738601
location_type: APPROXIMATE
viewport:
northeast:
lat: 35.4519564
lng: 136.7770077
southwest:
lat: 35.4456612
lng: 136.7707125
types:
- sublocality_level_4
- sublocality
- political
...
というわけで、この経度・緯度に対応した住所は、Google Mapsによる逆ジオコーディングでは、「日本, 岐阜県岐阜市福田町1丁目30」というわけです。
×岐阜県岐阜市長良福田町1丁目30番地
○岐阜県岐阜市福田町1丁目30
住所の表記の仕方はいくつもあったりしますよね。しょうがないと思います。
大阪府大阪市西城区南津守7-15-16
については、大阪市の人なら気づくのかもしれませんが、間違い探しです。
×大阪府大阪市西城区南津守7-15-16
○大阪府大阪市西成区南津守7-15-16
アドビさっさと直せよ!(申請書類の書き間違いかもしれんけど)
京都府京都市下京区烏丸松原下ル五条烏丸町407-2烏丸KT第2ビル2F
これについては、住所の入力業務を行っている人はわかると思いますが、京都の住所って、上ル下ル入ルは道案内のサジェスチョンであって、なくても住所表記として成り立ちます。よって、
×京都府京都市下京区烏丸松原下ル五条烏丸町407-2烏丸KT第2ビル2F
○京都府京都市下京区五条烏丸町407-2
でGoogle Mapsでは表示される、というわけです。
次回は、京都市内の表記に対応した、「ジオどす」というサービスを使って、京都の住所表記からジオコーディングしてみたいと思います。
投稿 大野 義貴 [GoogleMaps] | 固定リンク |
スポンサードリンク
トラックバック(0)
トラックバックURL: http://blog.dtpwiki.jp/MTOS/mt-tb.cgi/3415







![: Amazon.co.jp: プラスティック・メモリーズ 1【完全生産限定版】(イベントチケット優先販売申込券付) [Blu-ray]](/lists/_9/B00VWX66E8.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 2【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX66K2.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 3【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX6MV0.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 4【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX66IO.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 5【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX6Y0E.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 6【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX69D6.jpg)

コメントする