Geo-Cloudmade
view release on metacpan or search on metacpan
lib/Geo/Cloudmade.pm view on Meta::CPAN
print $geo->error(), "\n" unless @arr;
print "Number of results: ", scalar (@arr), "\n";
foreach (@arr) {
print $_->name,":\n", $_->centroid->lat, "/", $_->centroid->long, "\n"
}
# finding closest POI (Point of Interest)
# for list all available objects please look at http://developers.cloudmade.com/projects/show/geocoding-http-api
@arr = $geo->find_closest('library', [59.12, 81.1]);
print "No closest variants\n" unless @arr;
# reverse geocoding
my ($reverse) = $geo->find_closest('address', [52.4870,13.4248]);
if (defined $reverse) {
print join ' ', $reverse->properties('addr:housenumber', 'addr:street', 'addr:postcode', 'addr:city'), "\n";
} else { print "No results, sorry\n" }
#calculate route
my $route = $geo->get_route([47.25976, 9.58423], [47.66117, 9.99882], { type=>'car', method=>'shortest' } );
print "Distance: ", $route->total_distance, "\n";
print "Start: ", $route->start, "\n";
print "End: ", $route->end, "\n";
print "Route instructions:\n";
print join (',', @$_), "\n" foreach (@{$route->instructions});
#get tile
my $tile = $geo->get_tile([47.26117, 9.59882], {zoom=>10, tile_size=>256});
open (my $fh, '>', 'test.png') or die "Cannot open file $!\n";
binmode $fh;
print $fh $tile;
=cut
use strict;
use warnings;
use LWP::UserAgent;
use URI;
use JSON;
use Math::Trig;
use constant HOST => 'cloudmade.com';
use constant DEBUG => $ENV{GEO_CLOUDMADE_DEBUG};
=head1 CONSTRUCTOR
=head2 new API-KEY
Usage : my $geo = Geo::Cloudmade->new('your-ip-key');
Function : Constructs and returns a new Geo::Cloudmade object
Returns : a Geo::Cloudmade object
API-KEY : api key provided by Cloudmade. For request api key please visit http://developers.cloudmade.com/projects>
=cut
sub new {
my ($class, $key) = @_;
bless {
key => $key,
ua => LWP::UserAgent->new( keep_alive => 2 ),
error => '',
http_status => 0,
}, $class
}
# internal method
# TODO - add comment
sub call_service {
my ($self, $path, $params, $subdomain) = @_;
my $host = defined $subdomain ? "$subdomain.".HOST : HOST;
my $uri = URI->new;
$uri->scheme('http');
$uri->host($host);
$uri->path("$self->{key}/$path");
$uri->query_form($params);
print "uri=", $uri->as_string, "\n" if DEBUG;
my $request = new HTTP::Request(GET => $uri->as_string);
my $response = $self->{ua}->request($request);
$self->{http_status} = $response->code;
if ($response->is_success) {
$self->{error} = '';
return $response->content;
}
else {
$self->{error} = "HTTP request error: ".$response->status_line."\n";
return undef;
}
}
=head1 OBJECT METHODS
=head2 find QUERY, PARAMS
Usage : my @arr = $geo->find("Potsdamer Platz,Berlin,Germany", {results=>5, skip=>0});
Function: Returns geo objects (bound box and\or location) by query or nothing
Returns : Array of Geo::Cloudmade::Result objects or one Geo::Cloudmade::Results if scalar value was expected
QUERY : Query in format POI, House Number, Street, City, County like "Potsdamer Platz, Berlin, Germany".
Also near is supported in queries, e.g. "hotel near Potsdamer Platz, Berlin, Germany"
PARAMS : Hash for control ouptut. Valid elements are bbox, results, skip, bbox_only, return_geometry, return_location
For more info about parameters please look at http://developers.cloudmade.com/wiki/geocoding-http-api/Documentation
=cut
sub find {
my ($self, $name, $opt) = @_;
my %params = ( query=>$name, return_geometry => 'true', %$opt );
my $content = $self->call_service("geocoding/v2/find.js", [%params], 'geocoding');
return unless $content;
my $ref = from_json($content, {utf8 => 1});
my @objs;
push @objs, bless $_, 'Geo::Cloudmade::Result' foreach (@{$ref->{features}});
return @objs if wantarray;
return bless [ objs=>\@objs ], 'Geo::Cloudmade::Results'
}
=head2 find_closest OBJECT POINT PARAMS
( run in 2.403 seconds using v1.01-cache-2.11-cpan-8f98c5d2c55 )