#!/usr/bin/perl

# boomzoom.cgi - get some parameters, produce an animated gif.
# what should it do?  Simplest useful thing and all.

use Image::Magick;

use LWP::Simple;
use CGI;
use CGI::Carp qw(fatalsToBrowser);
use URI::Escape;
use warnings;
use strict;

my $cgi  = CGI->new;
my %data = $cgi->Vars;

my $msg = 'Parameters: ';

$data{width} = $data{width} || 300; # starting width in degrees
$data{pixels} = 320;

$data{lat} = $data{lat} || 38.4119;
$data{long} = $data{long} || -122.8422;
$data{mlabel} = $data{mlabel} || "O'Reilly";

my $imgname = '';

if ($data{show_source}) {
	print "Content-type: text/plain\n\n";
	open IN, "$0";
	print <IN>;
	close IN;
	exit;
}
if ($data{run}) {
	make_tiger_zoom(\%data);
}
print $cgi->header;
print load_template();

########################################
use Data::Dumper;
sub make_tiger_zoom {
	my $d = shift;
	$msg .= Dumper($d);

	my $file_id = $$; # just the pid, okay?

	my $lat = $d->{lat}; # center on this latitude
	my $long = $d->{long}; # center on this longitude
	my $width = $d->{width}; # starting width in degrees

	my $mlat = $lat;  # put a marker on this latitude
	my $mlong = $long; # put a market on this longitude.
	my $mlabel = $d->{mlabel};

	my $minwid = .005; # ending width in degrees
	my $cnt = 0;
	my @filelist;
	my $image = Image::Magick->new;
	while ($width >= $minwid) {
		print "width: $width\n";
		$width = $width * .3;
		my $url = "http://homer.ssd.census.gov/cgi-bin/mapper/map.gif?lat=$lat&lon=$long&wid=$width&ht=$width&iht=359&iwd=422&&on=majroads&tlevel=-&tvar=-&tmeth=i&mlat=$mlat&mlon=$mlong&msym=redpin&mlabel=$mlabel&murl=&conf=mapnew.con";
		$cnt = sprintf("%03.0f", $cnt);
		my $name = "/var/www/html/www.testingrange.com/cgi-bin/boomzoom_tmp/file_" . $file_id . "_$cnt.gif";
	    push @filelist, $name;
		open OUT, ">$name";
		my $st = get $url;
	#$msg .= "trying to add a get'd url to image\n";
	#$msg .= $image->Read($st);
		print OUT $st;
		close OUT;
		$cnt++;
	}

	# convert it...
	$msg .= $image->Read(@filelist);
	$image->Set(loop=>'0');
	$image->Set(delay=>'100');
	$imgname = "/geotest/anim_" . $file_id . ".gif";
	$msg .= $image->Write($imgname);
	undef $image;
	foreach my $f (@filelist) {
		`rm $f`;
	}
}

sub load_template {
return qq (
<h2>create an animated zooming map</h2>
Use the Census Tiger Mapserver to create an animated zoom effect.  Limited to US addresses.  Please look at the source code and make it better!  After clicking it can take a while-lots is happening, stay in your happy place.<hr>
center the map here...
<form action="boomzoom.cgi">
	Lat: <input type="text" name="lat" size="10" value="$data{lat}" />
	Long: <input type="text" name="long" size="10" value="$data{long}" /><br>
	Marker label?: <input type="text" name="mlabel" size="20" value="$data{mlabel}" />
	 <input name="run" type="submit" value="Make zoomy thing" />
	 <input name="show_source" type="submit" value="Show source code " />
</form>

<img src="$imgname">
<hr>
<pre>
$msg
</pre>
); # end of template
}

=head1 COPYRIGHT AND LICENSE

Copyright (C) 2004 by Rich Gibson rich@testingrange.com

This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself, either Perl version 5.8.3 or,
at your option, any later version of Perl 5 you may have available.

