package Geo::Coder::Multimap; use strict; use warnings; use Carp qw(croak); use Encode (); use JSON; use LWP::UserAgent; use URI; use URI::Escape qw(uri_unescape); our $VERSION = '0.01'; $VERSION = eval $VERSION; sub new { my ($class, %params) = @_; my $key = $params{apikey} or croak q('apikey' is required); my $self = bless { key => uri_unescape($key), }, $class; if ($params{ua}) { $self->ua($params{ua}); } else { $self->{ua} = LWP::UserAgent->new(agent => "$class/$VERSION"); } return $self; } sub ua { my ($self, $ua) = @_; if ($ua) { croak q('ua' must be (or derived from) an LWP::UserAgent') unless ref $ua and $ua->isa(q(LWP::UserAgent)); $self->{ua} = $ua; } return $self->{ua}; } sub geocode { my $self = shift; my %params = (@_ % 2) ? (location => shift, @_) : @_; my $location = $params{location} or return; my $country = $params{country}; $location = Encode::encode('utf-8', $location); my $uri = URI->new( 'http://developer.multimap.com/API/geocode/1.2/' . $self->{key} ); $uri->query_form( qs => $params{location}, output => 'json', $country ? (countryCode => $country) : (), ); my $res = $self->ua->get($uri); return unless $res->is_success; my $data = eval { from_json($res->decoded_content) }; return unless $data; my @results = @{ $data->{result_set} || [] }; return wantarray ? @results : $results[0]; } 1; __END__ =head1 NAME Geo::Coder::Multimap - Geocode addresses with the Multimap Open API =head1 SYNOPSIS use Geo::Coder::Multimap; my $geocoder = Geo::Coder::Multimap->new(apikey => 'Your API Key'); my $location = $geocoder->geocode( location => 'Hollywood and Highland, Los Angeles, CA, US' ); =head1 DESCRIPTION The C module provides an interface to the geocoding functionality of the Multimap Open API. =head1 METHODS =head2 new $geocoder = Geo::Coder::Multimap->new(apikey => 'Your API Key') Creates a new geocoding object. An API key can be obtained here: L. Accepts an optional B parameter for passing in a custom LWP::UserAgent object. =head2 geocode $location = $geocoder->geocode(location => $loc) $location = $geocoder->geocode(location => $loc, country => $code) @locations = $geocoder->geocode(location => $loc) The C string should either include the country or the C paramter should be given. Note, the C parameter will produce better results in most cases. In scalar context, this method returns the first location result; and in list context it returns all locations results. Each location result is a hashref; a typical example looks like: { 'geocode_quality' => '3a', 'point' => { 'lat' => '34.10156', 'lon' => '-118.33872' }, 'zoom_factor' => 14, 'address' => { 'postal_code' => '90028', 'country_code' => 'US', 'areas' => [ 'HOLLYWOOD', 'CA' ], 'display_name' => 'HOLLYWOOD, CA, 90028' }, 'geocode_score' => '0.409' } =head2 ua $ua = $geocoder->ua() $ua = $geocoder->ua($ua) Accessor for the UserAgent object. =head1 SEE ALSO L L, L, L, L =head1 REQUESTS AND BUGS Please report any bugs or feature requests to L. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes. =head1 SUPPORT You can find documentation for this module with the perldoc command. perldoc Geo::Coder::Multimap You can also look for information at: =over =item * GitHub Source Repository L =item * AnnoCPAN: Annotated CPAN documentation L =item * CPAN Ratings L =item * RT: CPAN's request tracker L =item * Search CPAN L =back =head1 COPYRIGHT AND LICENSE Copyright (C) 2009 gray , all rights reserved. This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 AUTHOR gray, =cut