sobota, 28 stycznia 2012

Korzystanie z GoogleMaps API z użyciem Google::GeoCoder::Smart

Geokodowanie to zamiana adresu lub nazwy miejsca na parę współrzędnych. Perlowy moduł Google::GeoCoder::Smart wykorzystany w poniższym skrypcie używa geolokalizatora Google'a:

#!/usr/bin/perl
use Google::GeoCoder::Smart;

my %GeoCodeCache; # cache

$geo = Google::GeoCoder::Smart->new();

$location = $ARGV[0];

my $coords = addr2coords( $location );

## ## ## ## ## ##
sub addr2coords {
my $a = shift ; ## address for example "Sopot,Polska"
my $r = shift || 'n'; ## flag--order of coordinates lat/lng or lng/lat
my ($lat, $lng) ;

## ## consult cache first ; $GeoCodeCache is a global hash ## ##
if (exists $GeoCodeCache{"$a"} ) { ($lat,$lng) = split (" ", $GeoCodeCache{"$a"} );  }
else {

my ($resultnum, $error, @results, $returncontent) = $geo->geocode("address" => "$a");
$resultnum--;

if ($resultnum > 0) { print STDERR "** Location $a occured more than once! **" }

if ( $error eq 'OK' ) {
for $num(0 .. $resultnum) {
$lat = $results[$num]{geometry}{location}{lat};
$lng = $results[$num]{geometry}{location}{lng};
##print "*** LAT/LNG:$lat $lng ERROR: $error RES: $resultNo ***\n";
}
} else { print STDERR "** Location $a not found! due to $error **"  }
}

$GeoCodeCache{"$a"} = "$lat $lng"; ## store in cache
##sleep $SLEEP_TIME;

if ($r eq 'r' ) { return "$lng,$lat"; } # KML order lng/lat
else { return "$lat $lng"; ## GPX order lat/lng }
}

Jest limit 2500 żądań/dzień (24 godziny, przy czym nie jest dokładnie opisane kiedy następuje `reset' licznika, tj. rozpoczyna się następna doba). Jeżeli się przekroczy limit to:

perl ./coordinates.pl Wrocław
** Location Wrocław not found! due to OVER_QUERY_LIMIT **** 

Ponieważ w bibliotekach Perla jest wszystko są także moduły Geo::Coder::ManyGeo::Coder::Multiple, który potrafią korzystać z wielu Geokoderów na raz (Google, Yahoo, Bing), zwiększając w ten sposób dzienny limit. Nie używałem...

Dopisane 29 stycznia 2012: W sieci via Google można znaleźć informacje, że reset ma miejsce ,,at midnight 12:00 PST.'' Ale w tym przypadku coś nie bardzo się zgadza, bo exact midnight PST byłoby o 9:00 rano (8:00 GMT), a blokę na mój IP zdjęli około 16.00. (A kwota wyczerpała się o jakieś 18--19 dnia poprzedniego--dokładnie nie pamiętam.)

Brak komentarzy:

Prześlij komentarz