Geo :: Google кажется мертвым, не проходит тесты, что теперь? - PullRequest
4 голосов
/ 04 марта 2011

Я попытался установить Geo :: Google, используя CPAN (http://metacpan.org/pod/Geo::Google v0.05), и он не прошел почти все тесты. Я проверил здесь http://matrix.cpantesters.org/?dist=Geo-Google+0.05, и это подтверждает, что этот модуль отказывает все .

Кажется, это заброшенный модуль, но мне нужно вычислить расстояние вождения между двумя адресами из моей программы Perl . Любой совет?

1 Ответ

10 голосов
/ 04 марта 2011

Я пытаюсь восстановить недостаточно обслуживаемый модуль (Zoidberg), и лучшее, что вы можете сделать, это просмотреть результаты CPANtesters, чтобы увидеть, что пошло не так, чтобы попытаться исправить это.

При этом Google Maps имеет общедоступный API и даже один с простым веб-интерфейсом .Я попытаюсь смоделировать вам пример, но для начала попробуйте выполнить несколько запросов с LWP::UserAgent или WWW::Mechanize, а затем проанализируйте результаты, чтобы найти ваш ответ.

Редактировать: Хорошо, вот пример.Ближе к концу $data находится хеш-код данных, содержащихся в ответе JSON, описанном по ссылке выше.Я также рассчитал общее расстояние для (первого) маршрута.

#!/usr/bin/perl

use strict;
use warnings;

use JSON;

use LWP::UserAgent;
my $ua = LWP::UserAgent->new();

my $origin = "60607";
my $destination = "60067";

my $site = 'http://maps.googleapis.com/maps/api/directions/';
my $mode = 'json';

my $page = $site . $mode . '?origin="' . $origin . '"&destination="' . $destination . '"&sensor=false';

my $response = $ua->get( $page );
my $json = $response->content();

my $data = decode_json $json;

my @legs = @{ $data->{'routes'}[0]{'legs'} };
my $distance_meters = 0;
foreach my $leg (@legs) {
    $distance_meters += $leg->{'distance'}{'value'};
}

my $distance_kilometers = $distance_meters / 1000;
my $distance_miles = $distance_kilometers * 0.62137119;
print $distance_miles . " Miles\n";

Редактировать: И теперь, так как мне было скучно в воскресенье днем:

perl -e 'use JSON;use LWP::Simple;($s,$e)=@ARGV;$m+=$_->{distance}{value}for@{(decode_json get qq<http://maps.googleapis.com/maps/api/directions/json?origin="$s"&destination="$e"&sensor=false>)->{routes}[0]{legs}};printf"%.2f Miles\n",$m*0.6213e-3' 60607 60067

Редактировать: И сейчас, порт одного лайнера для системы Mojolicious :

perl -Mojo -E '$m+=$_->{distance}{value}for@{g("http://maps.googleapis.com/maps/api/directions/json",form=>{origin=>shift,destination=>shift,sensor=>"false"})->json("/routes/0/legs")};printf"%.2f Miles\n",$m*0.6213e-3' 60607 60067
...