2012-12-05 1 views

Répondre

3

Voici une fonction perl rapide pour obtenir la latitude et la longitude d'une adresse arbitraire. Il utilise LWP :: Simple et JSON du CPAN et l'API Geocode de Google. Vous pouvez faire json ou xml si vous voulez les données complètes, celui-ci utilise json et attrape et retourne le lat et le 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); 
} 
+1

Donc, vous avez répondu à votre propre question en seulement 1 minute? :) –

+0

Je voulais l'afficher parce que j'ai cherché pendant un certain temps à le comprendre et je voulais sauver le gars suivant un certain temps. – jpgunter

+0

OK. [Vous pouvez fournir la réponse dans la question et poser la question "est-ce qu'il y a une meilleure réponse".] (Http://meta.stackexchange.com/questions/17845/etiquette-for-answering-your-own-question –

1

Il y a un module wrapper pour l'API Google géocodage, 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}; 

Ce code imprime:

\ { 
    lat 34.101545, 
    lng -118.3386871 
} 

Il est généralement préférable d'utiliser un impromptu CPAN Ce module est supporté par le service CPAN Testers, donc, si l'API se casse, il sera facile de repérer et de signaler.

+0

Très bien, et comme @Oesor l'a souligné, vous pouvez utiliser Geo :: Coder :: Many pour comparer les résultats de quelques API. – jpgunter

+0

Y a-t-il un moyen d'obtenir un message «statut limite» de la bibliothèque? –

2

Vous pouvez utiliser Geo :: Coder :: Many pour comparer différents services pour trouver celui qui pense que c'est le plus précis. J'ai eu de la chance avec ça (US) dans un mélange d'adresses rurales et urbaines.

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

Nice, j'aime l'idée de comparer de nombreux services de différence. – jpgunter

Questions connexes