使用Perl和Google的地理编码API获取地址的纬度和经度

3
在Perl中,如何从任意地址获取纬度和经度?可以使用外部API。

有没有办法从库中获取“超限状态”消息? - new_linux_user
3个回答

3
这里有一个快速的Perl函数,可获取任意地址的纬度和经度。它使用了来自CPAN的LWP::Simple和JSON以及Google的地理编码API。如果您需要完整的数据,可以使用json或xml,但此函数使用json并仅获取并返回纬度和经度。
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);
}

1
你只用了一分钟就回答了自己的问题? :) - Chankey Pathak
我想发布它,因为我花了一段时间来弄清楚它,并希望节省下一个人的时间。 - jpgunter
好的。是否有更好的答案?(参考链接:http://meta.stackexchange.com/questions/17845/etiquette-for-answering-your-own-question) - Chankey Pathak
@Chankey Pathak:那个问题/答案的总体趋势似乎非常积极,只是回答问题。实际上,如果这个问题采取了你提倡的方法,我可能会考虑将其关闭为“不是一个真正的问题”——更好的答案似乎不太可能。 - ysth
最后几行是使用哈希切片的完美情况:return @{ $$d_json{results}[0]{geometry}{location} }{qw/lat long/};,中间箭头可以忽略。 - amon
@amon 我觉得我的代码可读性更高一点,不过我还是有这个疑问。 - jpgunter

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 });
}

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测试者服务支持,所以如果API出现问题,很容易发现并报告。


非常好,正如@Oesor所指出的那样,您可以使用Geo::Coder::Many来比较几个API的结果。 - jpgunter
有没有办法从库中获取“超过限制状态”的消息? - new_linux_user

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接