1 $NetBSD: patch-ac,v 1.1.1.1 2004/07/26 23:33:35 wiz Exp $
3 Drew Einhorn's gpsfetchmap.pl enhancements from:
5 http://s2.selwerd.nl/~dirk-jan/gpsdrive/archive/msg01772.html
7 --- src/gpsfetchmap.pl.orig Sun Nov 24 11:04:38 2002
8 +++ src/gpsfetchmap.pl Wed Jan 8 12:13:17 2003
16 gpsfetchmap (c) 2002 Kevin Stephens <gps\@suburbialost.com>
17 modified (Sept 06, 2002) by Sven Fichtner <sven.fichtner\@flugfunk.de>
18 modified (Sept 18, 2002) by Sven Fichtner <sven.fichtner\@flugfunk.de>
19 -modified (Nov 21, 2002) by Magnus Månsson <ganja\@0x63.nu>
21 +modified (Nov 21, 2002) by Magnus Månsson <ganja\@0x63.nu>
22 +modified (Dec 24, 2002) by Drew Einhorn <drew.einhorn\@starband.net>
30 -# Setup possible scales
31 -my @SCALES = (1000,1500,2000,3000,5000,7500,10000,15000,20000,30000,50000,75000,
32 - 100000,150000,200000,300000,500000,750000,1000000,1500000,2000000,3000000,
33 - 5000000,7500000,10000000,15000000,20000000,30000000,50000000,75000000);
34 +use POSIX qw(floor ceil);
35 +use File::Temp qw/ tempfile tempdir /;
37 # Set defaults and get options from command line
38 Getopt::Long::Configure('no_ignore_case');
39 -my ($lat,$lon,$slat,$endlat,$slon,$endlon,$waypoint,$area,$unit,$mapdir,$debug,$force,$version,$man,$help);
41 +my (@SCALES,$lat,$lon,$slat,$endlat,$slon,$endlon,$waypoint,$area,$unit,$debug,$force,$version,$man,$help);
48 my $CONFIG_DIR = "$ENV{'HOME'}/.gpsdrive"; # Should we allow config of this?
49 my $CONFIG_FILE = "$CONFIG_DIR/gpsdriverc";
50 my $WAYPT_FILE = "$CONFIG_DIR/way.txt";
51 -my $KOORD_FILE = 'map_koord.txt'; # Should we allow config of this?
52 my $FILEPREFIX = 'map_';
53 my $mapserver = 'mapblast';
57 GetOptions ('lat=f' => \$lat, 'lon=f' => \$lon, 'start-lat=f' => \$slat, 'end-lat=f' => \$endlat, 'start-lon=f' => \$slon, 'end-lon=f' => \$endlon, 'scale=s' => \$scale, 'mapserver=s' => \$mapserver,
58 'waypoint=s' =>, \$waypoint, 'area=s' => \$area, 'unit=s' => \$unit,'mapdir=s' => \$mapdir, 'polite:i' => \$polite,
59 'WAYPOINT=s' => \$WAYPT_FILE, 'CONFIG=s' => \$CONFIG_FILE, 'PREFIX=s' => \$FILEPREFIX,
60 - 'FORCE' => \$force, 'debug' => \$debug, 'MAN' => \$man, 'help|x' => \$help, 'version' => \$version)
61 + 'FORCE' => \$force, 'debug' => \$debug, 'MAN' => \$man, 'help|x' => \$help, 'version' => \$version, 'replace' => \$replace)
65 + $mapdir = $CONFIG_DIR;
67 + $mapdir = $CONFIG_DIR/$mapdir;
74 +my $KOORD_FILE = "$mapdir/map_koord.txt"; # Should we allow config of this?
75 +open(KOORD,">>$KOORD_FILE") || die "Can't open: $KOORD_FILE";
77 +# Setup possible scales
79 +if ($mapserver eq "terraserver") {
84 + for ($ts = 10; $ts <= 16; $ts++) {
85 + @SCALES = (@SCALES, $s);
90 + @SCALES = (1000,1500,2000,3000,5000,7500,10000,15000,20000,30000,50000,75000,
91 + 100000,150000,200000,300000,500000,750000,1000000,1500000,2000000,3000000,
92 + 5000000,7500000,10000000,15000000,20000000,30000000,50000000,75000000);
95 pod2usage(1) if $help;
96 pod2usage(-verbose=>2) if $man;
101 # Setup up some constants
102 -my $EXPEDIAFACT = 1378.6;
103 my $DIFF = 0.0000028;
104 my $RADIUS_KM = 6371.01;
105 my $LAT_DIST_KM = 110.87;
108 # Get the list of scales we need
109 my $SCALES_TO_GET_ref = get_scales(\$scale);
110 -print "Scale to download: ", join(",",sort {$a <=> $b} @{$SCALES_TO_GET_ref}), "\n" if ($debug);
111 +print "Scales to download: ", join(",",sort {$a <=> $b} @{$SCALES_TO_GET_ref}), "\n" if ($debug);
113 # Get the center waypoint if they want one
116 unless ($slat && $slon && $endlat && $endlon) {
117 ($slat,$slon,$endlat,$endlon) = get_coords(\$lat,\$lon,\$area,\$unit);
119 -print "Upper left: $slat $slon, Lower Right: $endlat, $endlon\n" if ($debug);
120 +print "Lower left: $slat $slon, Upper Right: $endlat, $endlon\n" if ($debug);
123 my $count = file_count(\($slat,$slon,$endlat,$endlon));
124 @@ -93,67 +125,136 @@
126 print "\nDownloading files:\n";
128 -# Change into the gpsdrive maps directory
132 # Ok start getting the maps
133 foreach my $scale (@{$SCALES_TO_GET_ref}) {
135 - my $k = $DIFF * $scale;
137 - while ($lati < $endlat) {
139 - while ($long < $endlon) {
140 - my $filename = "$FILEPREFIX$scale-$lati-$long.gif";
141 - if (! -s $filename) {
143 - if ($mapserver eq 'expedia') {
144 - next LOOP if ($scale <=1000);
145 - my $expediascale= sprintf("%d",$scale / $EXPEDIAFACT);
148 - $where = 'USA0409';
150 - $where = 'EUR0809';
152 - print "http://msrvmaps.mappoint.net/isapi/MSMap.dll?ID=3XNsF.\&C=$lati,$long\&L=$where\&CV=1\&A=$expediascale\&S=1280,1024\&O=0.000000,0.000000\&MS=0\&P=\n"
154 - `wget -nd -q -O tmpmap.gif "http://msrvmaps.mappoint.net/isapi/MSMap.dll?ID=3XNsF.\&C=$lati,$long\&L=$where\&CV=1\&A=$expediascale\&S=1280,1024\&O=0.000000,0.000000\&MS=0\&P="`;
155 - $scale = $expediascale * $EXPEDIAFACT;
156 - } elsif ($mapserver eq 'mapblast') {
157 - print "http://www.mapblast.com/myblastd/MakeMap.d?\&CT=$lati:$long:$scale\&IC=\&W=1280\&H=1024\&LB=\n"
159 - `wget -nd -q -O tmpmap.gif "http://www.mapblast.com/myblastd/MakeMap.d?\&CT=$lati:$long:$scale\&IC=\&W=1280\&H=1024\&LB="`;
161 - if (-s 'tmpmap.gif') {
162 - open(KOORD,">>$KOORD_FILE") || die "Can't open: $KOORD_FILE";
163 - print KOORD "$filename $lati $long $scale\n";
164 - rename('tmpmap.gif',$filename);
166 - print "\nWrote $filename\n" if ($debug);
172 - # sleep if polite is turned on to be nice to the webserver of the mapserver
173 - sleep($polite) if ($polite =~ /\d+/);
174 - sleep(1) if (!$polite);
181 -print "Failcount: $failcount\n";
184 + my $k = sprintf("%.4f", $DIFF * $scale);
185 + getmaps($scale, $slat, $endlat, $slon, $endlon, $k);
188 ################################################################################
192 ################################################################################
195 + my ($scale, $slat, $endlat, $slon, $endlon, $k) = @_;
197 + print "Getting maps for scale: $scale\n";
199 + my $l = floor($slat / $k);
200 + my $lati = $k * $l;
202 + $l = ceil($endlat / $k);
203 + my $elat = $k * $l;
205 + while ($lati <= $elat) {
206 + $l = floor($slon / $k);
207 + my $long = $k * $l;
209 + $l = ceil($endlon / $k);
210 + my $elon = $k * $l;
212 + while ($long <= $elon) {
213 + getmap($scale, $lati, $long);
219 + print "Failcount: $failcount\n";
220 + print "Cachecount: $cachecount\n";
221 + print "Writecount: $writecount\n";
225 + flock KOORD, $LOCK_EX;
226 + # Move past addtions by other processes
231 + flock KOORD, $LOCK_UN;
235 + my ($scale, $lati, $long) = @_;
241 + $la = sprintf("%.4f", $lati);
242 + $lo = sprintf("%.4f", $long);
244 + my $EXPEDIAFACT = 1378.6;
245 + $filename = mapfilename("$FILEPREFIX", $scale, $la, $lo);
247 + if (! $replace && -e "$mapdir/$filename") {
250 + print "\nCached $filename\n" if ($debug);
252 + if ($mapserver eq 'expedia' && $scale > 1000) {
253 + my $expediascale= sprintf("%d",$scale / $EXPEDIAFACT);
256 + $where = 'USA0409';
258 + $where = 'EUR0809';
260 + $url = "http://msrvmaps.mappoint.net/isapi/MSMap.dll?ID=3XNsF.\\&C=$la,$lo\\&L=$where\\&CV=1\\&A=$expediascale\\&S=1280,1024\\&O=0.000000,0.000000\\&MS=0\\&P=";
261 + } elsif ($mapserver eq 'mapblast') {
262 + $url = "http://www.mapblast.com/myblastd/MakeMap.d?\\&CT=$la:$lo:$scale\\&IC=\\&W=1280\\&H=1024\\&LB=";
263 + } elsif ($mapserver eq 'terraserver') {
264 + my $sc = $ts1{$scale};
265 + $url = "http://terraservice.net/GetImageArea.ashx?t=1\\&lat=$la\\&lon=$lo\\&s=$sc\\&w=1280\\&h=1024";
266 + } elsif ($mapserver eq 'tiger') {
267 + my $s = $scale / 300000.0;
268 + $url = "http://tiger.census.gov/cgi-bin/mapper/map.gif?lat=$la\\&lon=$lo\\&wid=0.001\\&ht=$s\\&iwd=1280\\&iht=1024\\&on=majroads\\&on=places\\&on=shorelin\\&on=streets\\&on=interstate\\&on=statehwy\\&on=ushwy\\&on=water\\&tlevel=-\\&tvar=-\\&tmeth=i";
271 + my $p = "--wait=$polite --random-wait" if (!$polite);
272 + my ($fh, $tempfile) = tempfile( "temp_XXXXXX", DIR => "$mapdir" );
274 + `wget $p -nd -q -O $tempfile $url`;
275 + print $url if ($debug);
277 + if (-s $tempfile) {
279 + print KOORD "$filename $la $lo $scale\n";
281 + rename($tempfile, "$mapdir/$filename");
283 + print "\nWrote $filename\n" if ($debug);
287 + print "\nFailed $filename\n";
289 + # NEED convert to greyscale
290 + # and draw grid lines?
291 + # using ImageMaqick?
297 + my ($prefix, $scale, $lati, $long) = @_;
301 + if ($mapserver eq 'terraserver') {
302 + $scale = $ts1{$scale};
304 + $pathname=sprintf("%s/%s/%03d/%08.4f/%d/", $mapserver, $scale, $lati, $lati, $long);
305 + `mkdir -p "$mapdir/$pathname"`;
306 + # I know there's a builtin mkdir, but last time I fussed with it
307 + # there was no -p, and using it was tedious
308 + $filename = sprintf("%s%d-%08.4f-%09.4f.gif", $prefix, $scale, $lati, $long);
309 + return "$pathname$filename";