Geo::Coder::Multimap - Geocode addresses with the Multimap Open API


Geo-Coder-Multimap documentation Contained in the Geo-Coder-Multimap distribution.

Index


Code Index:

NAME

Top

Geo::Coder::Multimap - Geocode addresses with the Multimap Open API

SYNOPSIS

Top

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

DESCRIPTION

Top

The Geo::Coder::Multimap module provides an interface to the geocoding functionality of the Multimap Open API.

METHODS

Top

new

    $geocoder = Geo::Coder::Multimap->new(apikey => 'Your API Key')

Creates a new geocoding object.

An API key can be obtained here: https://www.multimap.com/openapi/signup/.

Accepts an optional ua parameter for passing in a custom LWP::UserAgent object.

geocode

    $location = $geocoder->geocode(location => $loc)
    $location = $geocoder->geocode(location => $loc, country => $code)
    @locations = $geocoder->geocode(location => $loc)

The location string should either include the country or the country paramter should be given. Note, the country 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'
    }

ua

    $ua = $geocoder->ua()
    $ua = $geocoder->ua($ua)

Accessor for the UserAgent object.

SEE ALSO

Top

http://www.multimap.com/openapidocs/1.2/web_service/ws_geocoding.htm

Geo::Coder::Bing, Geo::Coder::Google, Geo::Coder::Mapquest, Geo::Coder::Yahoo

REQUESTS AND BUGS

Top

Please report any bugs or feature requests to http://rt.cpan.org/Public/Bug/Report.html?Queue=Geo-Coder-Multimap. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.

SUPPORT

Top

You can find documentation for this module with the perldoc command.

    perldoc Geo::Coder::Multimap

You can also look for information at:

* GitHub Source Repository

http://github.com/gray/geo-coder-multimap

* AnnoCPAN: Annotated CPAN documentation

http://annocpan.org/dist/Geo-Coder-Multimap

* CPAN Ratings

http://cpanratings.perl.org/d/Geo-Coder-Multimap

* RT: CPAN's request tracker

http://rt.cpan.org/Public/Dist/Display.html?Name=Geo-Coder-Multimap

* Search CPAN

http://search.cpan.org/dist/Geo-Coder-Multimap

COPYRIGHT AND LICENSE

Top

AUTHOR

Top

gray, <gray at cpan.org>


Geo-Coder-Multimap documentation Contained in the Geo-Coder-Multimap distribution.

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__