0

Geo::Coder::Google場所の配列から座標のリストを取得するために使用しようとしています。私の問題は、場所の配列が別のスクリプトによって生成され、Google マップでは見つからない奇妙な場所、つまりCorseMétéoが含まれることがあります。

これにより、次のエラー メッセージが生成されます。

"Google Maps API returned error: 500 Can't connect to maps.google.com:80 (Bad hostname) at geoTest.pl line 24.". 

私のコードは次のようになります:

#!/usr/bin/perl -w

use strict;
use locale;
use warnings;
#use diagnostics;
use utf8;

binmode(STDIN, "encoding(utf8)");
binmode(STDOUT, "encoding(utf8)");
binmode(STDERR, "encoding(utf8)");

use Geo::Coder::Google;

my @place = ('Daluis', 'Corse', 'CorseMétéo');
my ($long, $lat);

foreach my $place(@place){
     my $geocoder = Geo::Coder::Google->new(apikey => '{MyAPIkey}');

     my $response;
     until (defined $response){
         $response = $geocoder->geocode(location => $place);
         }
     ($long, $lat) = @{ $response->{Point}{coordinates} };
     print "$long\n";
     print "$lat\n";
 }

通常、この perl モジュールは番地の位置を特定するために使用されますが、より大きな地理的位置ではかなりうまく動作するようです。

誰かが同様の問題を抱えていましたか?

ありがとうございました。

4

2 に答える 2

0

私はそれを機能させ続ける方法を見つけることができました、それはこのように見えます:

#!/usr/bin/perl -w

use strict;
use locale;
use warnings;
#use diagnostics;
use utf8;

binmode(STDIN, "encoding(utf8)");
binmode(STDOUT, "encoding(utf8)");
binmode(STDERR, "encoding(utf8)");

use Geo::Coder::Google;


my @place = ('Daluis', 'Corse', 'CorseMétéo', 'New Delhi');
my ($long, $lat);

foreach my $place(@place){
    my $geocoder = Geo::Coder::Google->new(apikey => '{MyAPIkeyHere}');

    my $response;
    until (defined $response){
        eval{
            $response = $geocoder->geocode(location => $place);
            if ($@){
                "Couldn't get location : $place\n";
            }else{
                ($long, $lat) = @{ $response->{Point}{coordinates} };
            }
        }

    }
    print "$place\n";
    print "$long\n";
    print "$lat\n";     
}

これで、場所が見つからないたびに、前の場所の座標がプッシュされます。したがって、その後は、重複を取り除くだけの問題です。Google Maps APIを使用してロケーションマップを生成するために、座標を使用してJavaScriptを入力します。ただし、コードは引き続きエラー出力を生成します。

Useless use of a constant (Couldn't get location) in void context at get_LatLng.pl line 48.

しかし、コードは今のところ機能します。誰かがこのエラーを管理する方法を知っているなら、それは素晴らしいでしょう。

ともあれ、ありがとう !!!

于 2013-03-01T12:28:41.500 に答える
0

エラーが発生してもコードを継続させたい場合は、evalブロックを使用します。

 until (defined $@ or defined $response){
     eval {
          $response = $geocoder->geocode(location => $place);
     }
 }

 if ($@)
 {
     #some error handling.
 }

eval { BLOCK }と同じではないことに注意してくださいeval "string of code"。実行時にコードをコンパイルしないため、セキュリティ上の問題はありません。これは、例外処理の単純な方法です。

于 2013-02-28T11:56:17.077 に答える