Skip to content

Instantly share code, notes, and snippets.

@eikes
Created June 5, 2010 00:06
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save eikes/426114 to your computer and use it in GitHub Desktop.
Save eikes/426114 to your computer and use it in GitHub Desktop.
#!/usr/bin/perl
# configure here:
# first top left (north west)
my $startlon = 13.40991;
my $startlat = 52.48905;
# then bottom right (south east)
my $endlon = 13.42209;
my $endlat = 52.47982;
#zoom level:
my $zoom = 16;
# end of configuration
use strict;
use LWP;
use GD;
use Math::Trig;
sub getTileNumber {
my ($lat,$lon,$zoom) = @_;
my $xtile = int( ($lon+180)/360 *2**$zoom ) ;
my $ytile = int( (1 - log(tan(deg2rad($lat)) + sec(deg2rad($lat)))/pi)/2 *2**$zoom ) ;
return ($xtile, $ytile);
}
(my $xstart, my $ystart) = getTileNumber($startlat, $startlon, $zoom);
(my $xend, my $yend) = getTileNumber($endlat, $endlon, $zoom);
my $tilesize = 256;
# calc image size
my $xsize = ($xend-$xstart+1) * $tilesize;
my $ysize = ($yend-$ystart+1) * $tilesize;
my $img = GD::Image->new($xsize, $ysize, 1);
my $white = $img->colorAllocate(248,248,248);
$img->filledRectangle(0,0,$xsize,$ysize,$white);
my $ua = LWP::UserAgent->new();
$ua->env_proxy;
for (my $x=$xstart;$x<=$xend;$x++) {
for (my $y=$ystart;$y<=$yend;$y++) {
my $url = sprintf("http://c.tile.openstreetmap.org/%d/%d/%d.png", $zoom, $x, $y);
print STDERR "$url... ";
my $resp = $ua->get($url);
print STDERR $resp->status_line;
print STDERR "\n";
next unless $resp->is_success;
my $tile = GD::Image->new($resp->content);
next if ($tile->width == 1);
$img->copy($tile, ($x-$xstart)*256,($y-$ystart)*256,0,0,256,256);
}
}
binmode STDOUT;
print $img->png();
@tengel
Copy link

tengel commented Sep 21, 2011

The resulting png file is pretty large. I tried to reduce the size using:
$img->trueColorToPalette(0, 255);
print $img->png(9);
which works fine, but I think the original files are still smaller then the files created by this script. Any ideas how to get smaller files without corrupting colours?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment