package Geo::Coder::Many::Google;
use strict;
use warnings;
use Carp;
use Geo::Coder::Many::Util;
use base 'Geo::Coder::Many::Generic';
=head1 NAME
Geo::Coder::Many::Google - Plugin for the google maps geocoder
=head1 VERSION
Version 0.02
=cut
our $VERSION = '0.02';
# Requires Geo::Coder::Google 0.06 or above
sub _MIN_MODULE_VERSION { return '0.06'; }
=head1 SYNOPSIS
This class wraps Geo::Coder::Google such that it can be used in
Geo::Coder::Many, by converting the results to a standard form.
Note: Geo::Coder::Google uses the deprecated version 2 of the Google
geocoder. There is a newer Geo::Coder::Googlev3 (also supported by
Geo::Coder::Many).
=head1 METHODS
=head2 geocode
Takes a location string, geocodes it using Geo::Coder::Google, and returns the
result in a form understandable to Geo::Coder::Many
=cut
# see details of google's response format here:
# v2: http://code.google.com/apis/maps/documentation/javascript/v2/services.html#Geocoding
# v3: http://code.google.com/apis/maps/documentation/geocoding/
sub geocode {
my $self = shift;
my $location = shift;
defined $location or croak "Geo::Coder::Many::Google::geocode
method must be given a location.";
my @raw_replies = $self->{GeoCoder}->geocode( $location );
my $Response = Geo::Coder::Many::Response->new( { location => $location } );
foreach my $raw_reply ( @raw_replies ) {
my $precision = 0; # unknown
if (defined($raw_reply->{ExtendedData})
&& defined($raw_reply->{ExtendedData}{LatLonBox}) ){
my $box = $raw_reply->{ExtendedData}{LatLonBox};
# lng and lat in decimal degree format
$precision =
Geo::Coder::Many::Util::determine_precision_from_bbox({
'lon1' => $box->{south},
'lat1' => $box->{west},
'lon2' => $box->{north},
'lat2' => $box->{east},
});
}
my $tmp = {
address => $raw_reply->{address},
country => $raw_reply->{AddressDetails}{Country}{CountryNameCode},
latitude => $raw_reply->{Point}{coordinates}[1],
longitude => $raw_reply->{Point}{coordinates}[0],
precision => $precision,
};
$Response->add_response( $tmp, $self->get_name());
}
return $Response;
}
=head2 get_name
The short name by which Geo::Coder::Many can refer to this geocoder.
=cut
sub get_name { my $self = shift; return 'google ' . $self->{GeoCoder}->VERSION; }
1;