update Tue Mar 2 18:37:00 PST 2010
[pkgsrc.git] / geography / gpsdrive / patches / patch-ac
1 $NetBSD: patch-ac,v 1.1.1.1 2004/07/26 23:33:35 wiz Exp $
2
3 Drew Einhorn's gpsfetchmap.pl enhancements from:
4
5 http://s2.selwerd.nl/~dirk-jan/gpsdrive/archive/msg01772.html
6
7 --- src/gpsfetchmap.pl.orig     Sun Nov 24 11:04:38 2002
8 +++ src/gpsfetchmap.pl  Wed Jan  8 12:13:17 2003
9 @@ -1,4 +1,4 @@
10 -#!/usr/bin/perl
11 +#!/usr/bin/env perl
12  
13  # gpsfetchmap
14  #
15 @@ -9,38 +9,71 @@
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>
20 -Version 1.04
21 +modified (Nov 21, 2002) by Magnus Månsson <ganja\@0x63.nu>
22 +modified (Dec 24, 2002) by Drew Einhorn <drew.einhorn\@starband.net>
23 +Version 1.05
24  EOP
25  
26  use strict;
27  use Getopt::Long;
28  use Pod::Usage;
29 -
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 /; 
36  
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);
40 -my $failcount = 0;
41 +my (@SCALES,$lat,$lon,$slat,$endlat,$slon,$endlon,$waypoint,$area,$unit,$debug,$force,$version,$man,$help);
42 +
43 +my $failcount;
44 +my $writecount;
45 +my $cachecount;
46  my $polite = 'no';
47  my $scale = '50000';
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';
54 +my $replace       = '0';
55 +my $mapdir        = "";
56  
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)
62     or pod2usage(1);
63  
64 +if ($mapdir eq "") {
65 +  $mapdir = $CONFIG_DIR;
66 +} else {
67 +  $mapdir = $CONFIG_DIR/$mapdir;
68 +}
69 +my $LOCK_SH = 1;
70 +my $LOCK_EX = 2;
71 +my $LOCK_NB = 4;
72 +my $LOCK_UN = 8;
73 +
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";
76 +
77 +# Setup possible scales
78 +my %ts1;
79 +if ($mapserver eq "terraserver") {
80 +  my ($s, $ts);
81 +
82 +  @SCALES = ();
83 +  $s = 2757;
84 +  for ($ts = 10; $ts <= 16; $ts++) {
85 +    @SCALES = (@SCALES, $s);
86 +    $ts1{$s} = $ts;
87 +    $s *= 2;
88 +  }
89 +} else {
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);
93 +}
94 +
95  pod2usage(1) if $help;
96  pod2usage(-verbose=>2) if $man;
97  
98 @@ -55,7 +88,6 @@
99  
100  
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;
106 @@ -64,7 +96,7 @@
107  
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);
112  
113  # Get the center waypoint if they want one
114  if ($waypoint) {
115 @@ -82,7 +114,7 @@
116  unless ($slat && $slon && $endlat && $endlon) {
117     ($slat,$slon,$endlat,$endlon) = get_coords(\$lat,\$lon,\$area,\$unit); 
118  }
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);
121  
122  unless ($force) {
123     my $count = file_count(\($slat,$slon,$endlat,$endlon));
124 @@ -93,67 +125,136 @@
125  
126  print "\nDownloading files:\n";
127  
128 -# Change into the gpsdrive maps directory 
129 -chdir($CONFIG_DIR);
130 -chdir($mapdir);
131 -
132  # Ok start getting the maps
133  foreach my $scale (@{$SCALES_TO_GET_ref}) {
134 -   # Setup k
135 -   my $k = $DIFF * $scale;
136 -   my $lati = $slat;   
137 -   while ($lati < $endlat) {
138 -      my $long = $slon;
139 -      while ($long < $endlon) {
140 -         my $filename = "$FILEPREFIX$scale-$lati-$long.gif";
141 -         if (! -s $filename) {
142 -            LOOP: {
143 -               if ($mapserver eq 'expedia') {
144 -                  next LOOP if ($scale <=1000);
145 -                  my $expediascale= sprintf("%d",$scale / $EXPEDIAFACT);
146 -                  my $where;
147 -                  if ($lon < -30) {
148 -                     $where = 'USA0409';
149 -                  } else {
150 -                     $where = 'EUR0809';
151 -                  }
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"
153 -                     if ($debug);
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"
158 -                     if ($debug);
159 -                  `wget -nd -q -O tmpmap.gif "http://www.mapblast.com/myblastd/MakeMap.d?\&CT=$lati:$long:$scale\&IC=\&W=1280\&H=1024\&LB="`;                  
160 -               }      
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);
165 -                  print ".";
166 -                  print "\nWrote $filename\n" if ($debug);
167 -               } else {
168 -                  $failcount++;
169 -                  print ",";
170 -               }
171 -            }
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);
175 -         }
176 -         $long += $k;
177 -      }
178 -      $lati += $k;
179 -   }
180 -}
181 -print "Failcount: $failcount\n";
182 -print "\n";
183 +  # Setup k
184 +  my $k = sprintf("%.4f", $DIFF * $scale);
185 +  getmaps($scale, $slat, $endlat, $slon, $endlon, $k);
186 +}   
187  
188  ################################################################################
189  #
190  # Subroutines
191  #
192  ################################################################################
193 +
194 +sub getmaps {
195 +  my ($scale, $slat, $endlat, $slon, $endlon, $k) = @_;
196 +
197 +  print "Getting maps for scale: $scale\n";
198 +
199 +  my $l = floor($slat / $k);
200 +  my $lati = $k * $l;
201 +
202 +  $l = ceil($endlat / $k);
203 +  my $elat = $k * $l;
204 +  
205 +  while ($lati <= $elat) {
206 +    $l = floor($slon / $k);
207 +    my $long = $k * $l;
208 +    
209 +    $l = ceil($endlon / $k);
210 +    my $elon = $k * $l;
211 +    
212 +    while ($long <= $elon) {
213 +      getmap($scale, $lati, $long);
214 +      $long += $k;
215 +    }
216 +    $lati += $k;
217 +  }
218 +  print "\n";
219 +  print "Failcount: $failcount\n";
220 +  print "Cachecount: $cachecount\n";
221 +  print "Writecount: $writecount\n";
222 +}
223 +
224 +sub lock {
225 +  flock KOORD, $LOCK_EX;
226 +  # Move past addtions by other processes
227 +  seek KOORD, 0, 2;
228 +}
229 +
230 +sub unlock {
231 +  flock KOORD, $LOCK_UN;
232 +}
233 +
234 +sub getmap {
235 +  my ($scale, $lati, $long) = @_;
236 +  my $filename;
237 +  my $url;
238 +  my $la;
239 +  my $lo;
240 +
241 +  $la = sprintf("%.4f", $lati);
242 +  $lo = sprintf("%.4f", $long);
243 +
244 +  my $EXPEDIAFACT   = 1378.6;
245 +  $filename = mapfilename("$FILEPREFIX", $scale, $la, $lo);
246 +  $url = "";
247 +  if (! $replace && -e "$mapdir/$filename") {
248 +    $cachecount++;
249 +    print "=";
250 +    print "\nCached $filename\n" if ($debug);
251 +  } else {
252 +    if ($mapserver eq 'expedia' && $scale > 1000) {
253 +      my $expediascale= sprintf("%d",$scale / $EXPEDIAFACT);
254 +      my $where;
255 +      if ($lon < -30) {
256 +       $where = 'USA0409';
257 +      } else {
258 +       $where = 'EUR0809';
259 +      }
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";
269 +    }
270 +    if ($url ne "") {
271 +      my $p = "--wait=$polite --random-wait" if (!$polite);
272 +      my ($fh, $tempfile) = tempfile( "temp_XXXXXX", DIR => "$mapdir" );
273 +
274 +      `wget $p -nd -q -O $tempfile $url`;                  
275 +      print $url if ($debug);
276 +
277 +      if (-s $tempfile) {
278 +       lock();
279 +       print KOORD "$filename $la $lo $scale\n";
280 +       unlock();
281 +       rename($tempfile, "$mapdir/$filename");
282 +       print ".";
283 +       print "\nWrote $filename\n" if ($debug);
284 +       $writecount++;
285 +      } else {
286 +       $failcount++;
287 +       print "\nFailed $filename\n";
288 +      }
289 +      # NEED convert to greyscale 
290 +      # and draw grid lines?
291 +      # using ImageMaqick?
292 +    }
293 +  }
294 +}
295 +
296 +sub mapfilename {
297 +  my ($prefix, $scale, $lati, $long) = @_;
298 +  my $pathname;
299 +  my $filename;
300 +
301 +  if ($mapserver eq 'terraserver') {
302 +    $scale = $ts1{$scale};
303 +  }
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";
310 +}
311  
312  sub error_check {
313     my $status;