M.C.P.C.

―むり・くり―プラスコミュニケーション(更新終了)


| トップページ |

2010年11月23日 17:28

Adobe Creative Suite 出力対応店一覧をGoogle Mapsで表示させる(14)

このエントリーをはてなブックマークに追加 mixiチェック

アドビの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

Googlemapcenter01s

Googlemapcenter02s

Googlemapcenter03

これを、逆ジオコーディングしてみます。

緯度・経度から、住所を求める逆ジオコーディングスクリプトは、次の通りです。

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

コメントする