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
コメントする