0

我正在尝试使用Geo::Coder::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";     
}

现在的问题是,每次找不到位置时,都会将先前位置的坐标推入其中。因此,之后只需摆脱重复项即可。我使用坐标来填充 JavaScript,以便使用 google maps API 生成位置图。但是,代码仍然会生成错误输出:

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 回答