#!/usr/bin/perl -w use strict; use Getopt::Std; my (%opts, $ll, $ur, $n, $x, $y, $fn); %opts = ( l => "N21E120", u => "N25E122", s => 30, ); getopts('l:u:s:', \%opts); @$ll = parse($opts{l}) or die "'-l' parse error"; @$ur = parse($opts{u}) or die "'-u' parse error"; die "-s must be a divisor of 1200. e.g. 6, 40, 100, ..." unless 1200 % $opts{s} == 0; $n = 0; for ($y=$ll->[1]; $y<=$ur->[1]; ++$y) { for ($x=$ll->[0]; $x<=$ur->[0]; ++$x) { $fn = coord2fn($x, $y); if (not -r $fn) { print STDERR "missing file(s):" if $n <= 0; ++$n; print STDERR " $fn"; } } } if ($n > 0) { print STDERR "\n"; # die "\n"; } my (@fh, $i, $j); for ($y=$ll->[1]; $y<=$ur->[1]; ++$y) { for ($x=$ll->[0]; $x<=$ur->[0]; ++$x) { $fn = coord2fn($x, $y); if (-r $fn) { open $fh[fhid($x)], $fn; } else { $fh[fhid($x)] = undef; } } for ($i=0; $i*$opts{s}<1200; ++$i) { for ($x=$ll->[0]; $x<=$ur->[0]; ++$x) { for ($j=0; $j*$opts{s}<1200; ++$j) { my ($d, @a); if (defined $fh[fhid($x)]) { seek $fh[fhid($x)], ((1200/$opts{s}-$i)*$opts{s}*1201+$j*$opts{s})*2, 0; read($fh[fhid($x)], $d, 2); @a = unpack("C*", $d); $d = $a[0]*256 + $a[1]; } else { $d = 32768; } print $d<1e4 ? "$d\n" : "nan\n"; } } print "\n"; } for ($x=$ll->[0]; $x<=$ur->[0]; ++$x) { close $fh[fhid($x)] if defined $fh[fhid($x)]; } } sub parse { return undef unless $_[0] =~ /^([ns])(\d+)([ew])(\d+)$/i; my ($long, $lat) = ($4, $2); $long = - $long if "\L$1" eq "s"; $lat = - $lat if "\L$3" eq "w"; return ($long, $lat); } sub coord2fn { my ($x, $y) = @_; return sprintf "%s%02d%s%03d.hgt", ($y>=0?"N":"S"), abs($y), ($x>=0?"E":"W"), abs($x); } sub fhid { return $_[0]-$ll->[0]; }