3

在 Perl 中,如何从任意地址获取 lat 和 long?可以使用外部 API。

4

3 回答 3

3

这是一个快速的 perl 函数,用于获取任意地址的纬度和经度。它使用来自 CPAN 的 LWP::Simple 和 JSON 以及 Google 的 Geocode API。如果你想要完整的数据,你可以使用 json 或 xml,这个使用 json 并且只获取并返回 lat 和 long。

use strict;
use LWP::Simple; # from CPAN
use JSON qw( decode_json ); # from CPAN

sub getLatLong($){
  my ($address) = @_;

  my $format = "json"; #can also to 'xml'

  my $geocodeapi = "https://maps.googleapis.com/maps/api/geocode/";

  my $url = $geocodeapi . $format . "?sensor=false&address=" . $address;

  my $json = get($url);

  my $d_json = decode_json( $json );

  my $lat = $d_json->{results}->[0]->{geometry}->{location}->{lat};
  my $lng = $d_json->{results}->[0]->{geometry}->{location}->{lng};

  return ($lat, $lng);
}
于 2012-12-05T04:50:48.117 回答
2

您可以使用 Geo::Coder::Many 来比较不同的服务,以找到认为最准确的服务。我在农村和城市地址的混合使用它(美国)很幸运。

use Geo::Coder::Bing;
use Geo::Coder::Googlev3;
use Geo::Coder::Mapquest;
use Geo::Coder::OSM;
use Geo::Coder::Many;
use Geo::Coder::Many::Util qw( country_filter );

### Geo::Coder::Many object
my $geocoder_many = Geo::Coder::Many->new( );

$geocoder_many->add_geocoder({ geocoder => Geo::Coder::Googlev3->new });
$geocoder_many->add_geocoder({ geocoder => Geo::Coder::Bing->new( key => 'GET ONE' )});
$geocoder_many->add_geocoder({ geocoder => Geo::Coder::Mapquest->new( apikey => 'GET ONE' )});
$geocoder_many->add_geocoder({ geocoder => Geo::Coder::OSM->new( sources => 'mapquest' )});

$geocoder_many->set_filter_callback(country_filter('United States'));
$geocoder_many->set_picker_callback('max_precision');

for my $location (@locations) {
  my $result = $geocoder_many->geocode({ location => $location });
}
于 2012-12-05T15:30:32.527 回答
1

Google Geocoding API 有一个包装模块Geo::Coder::Google

#!/usr/bin/env perl
use strict;
use utf8;
use warnings qw(all);

use Data::Printer;
use Geo::Coder::Google;

my $geocoder = Geo::Coder::Google->new(apiver => 3);
my $location = $geocoder->geocode(location => 'Hollywood and Highland, Los Angeles, CA');

p $location->{geometry}{location};

此代码打印:

\ {
    lat   34.101545,
    lng   -118.3386871
}

通常最好使用现成的 CPAN 模块,因为它由CPAN Testers服务支持,因此,如果 API 发生故障,很容易发现和报告。

于 2012-12-05T13:41:24.800 回答