package Geo::Coder::Many::Ovi;
use warnings;
use strict;
use Carp;
use Geo::Coder::Many::Util;
use base 'Geo::Coder::Many::Generic';
=head1 NAME
Geo::Coder::Many::Ovi - Ovi plugin Geo::Coder::Many
=head1 VERSION
Version 0.02
=cut
our $VERSION = '0.02';
# Requires Geo::Coder::Ovi 0.01 or above
sub _MIN_MODULE_VERSION { return '0.01'; }
=head1 SYNOPSIS
This module adds Ovi support to Geo::Coder::Many.
Use as follows:
use Geo::Coder::Many;
use Geo::Coder::Ovi;
my $options = { };
my $geocoder_many = Geo::Coder::Many->new( $options );
my $GCO = Geo::Coder::Ovi->new();
my $options = {
geocoder => $GCO,
};
$geocoder_many->add_geocoder( $options );
my $location = $geocoder_many->geocode(
{
location => 'London EC1M 5RF, United Kingdom'
}
);
=head1 MORE INFO
please see http://search.cpan.org/dist/Geo-Coder-Ovi/
=head1 SUBROUTINES/METHODS
=head2 geocode
This is called by Geo::Coder::Many - it sends the geocoding request (via
Geo::Coder::Ovi) and extracts the resulting location, returning it in a
standard Geo::Coder::Many::Response.
Note: the precision score is set based on the size of the bounding box returned.
Not all queries seem to return a bounding box. In that case precision in undef
=cut
sub geocode {
my $self = shift;
my $location = shift;
defined $location or croak "Geo::Coder::Many::Ovi::geocode
method must be given a location.";
my @raw_replies = $self->{GeoCoder}->geocode( location => $location );
my $response = Geo::Coder::Many::Response->new( { location => $location } );
foreach my $raw_reply ( @raw_replies ) {
my $lng = undef;
my $lat = undef;
if (defined($raw_reply->{properties})){
$lat = $raw_reply->{properties}{geoLatitude};
$lng = $raw_reply->{properties}{geoLongitude};
}
if (defined($lng) && defined($lat)){ # did we get anything?
my $precision = $self->_determine_precision($raw_reply);
my $tmp = {
address => $raw_reply->{title},
country => $raw_reply->{addrCountryName},
longitude => $lng,
latitude => $lat,
precision => $precision,
};
$response->add_response( $tmp, $self->get_name() );
}
}
my $http_response = $self->{GeoCoder}->response();
$response->set_response_code($http_response->code());
return $response;
}
# return number between 0 and 1
sub _determine_precision {
my $self = shift;
my $raw = shift;
my $precision = undef;
# if we have a bounding box we can calculate a precision
if (defined($raw->{properties})
&& defined($raw->{properties}{geoBbxLatitude2})
){
$precision =
Geo::Coder::Many::Util::determine_precision_from_bbox({
'lon1' => $raw->{properties}{geoBbxLongitude1},
'lat1' => $raw->{properties}{geoBbxLatitude1},
'lon2' => $raw->{properties}{geoBbxLongitude2},
'lat2' => $raw->{properties}{geoBbxLatitude2},
});
}
return $precision;
}
=head2 get_name
Returns the name of the geocoder type - used by Geo::Coder::Many
=cut
sub get_name { my $self = shift; return 'ovi ' . $self->{GeoCoder}->VERSION; }
1;
__END__