#!/opt/perl/bin/perl -w # # View UI-View maps based on latitude/longitude # use strict; my $MAPDIR = "/home/mats/radio/ui-view/maps"; my $VIEWER = "iv"; my $PAGER = ($ENV{'PAGER'} || 'more'); my $PAGEOPT = ($PAGER eq "less" ? " -F" : ""); my @info; sub getll { my $ll = shift; my $neg = 0; $ll =~ /[SsWw]$/ and $neg++; $ll =~ s/[SsNnWwEe]$//; my ($d, $m) = ($ll =~ /^([^\.]+)\.(.*)$/); return ($neg ? -($d + $m/60.) : $d + $m/60.); } opendir(DIR, $MAPDIR) or die "Can't opendir `$MAPDIR': $!\n"; while (my $name = readdir(DIR)) { $name =~ /^\.+$/ and next; $name !~ /\.[Ii][Nn][Ff]$/ and next; open(INF, "<$MAPDIR/$name") or die "Can't open `$name': $!\n"; my @data = ; close(INF); for (my $i = 0; $i < 3; $i++) { $data[$i] =~ s/[\015\012]+$//; } my $fname = ("$MAPDIR/$name" =~ /^(.*)\.[Ii][Nn][Ff]$/)[0]; SWITCH: { -f "${fname}.png" and do { $fname .= ".png"; last }; -f "${fname}.PNG" and do { $fname .= ".PNG"; last }; -f "${fname}.gif" and do { $fname .= ".gif"; last }; -f "${fname}.GIF" and do { $fname .= ".GIF"; last }; } my ($minlon, $maxlat) = split(/[, ]+/, $data[0]); my ($maxlon, $minlat) = split(/[, ]+/, $data[1]); $minlat =~ /[WwEe]$/ and do {my $tmp = $maxlon; $maxlon = $minlat; $minlat = $tmp}; $maxlat =~ /[WwEe]$/ and do {my $tmp = $minlon; $minlon = $maxlat; $maxlat = $tmp}; my $desc = $data[2]; push @info, { 'fname' => $fname, 'desc' => $desc, 'minlat' => getll($minlat), 'maxlat' => getll($maxlat), 'minlon' => getll($minlon), 'maxlon' => getll($maxlon) }; } close(DIR); scalar(@info) or die "No maps found\n"; my ($llstr, $latstr, $lonstr); my ($lat, $lon); my ($latd, $latm, $lats, $lond, $lonm, $lons); while (1) { print "\nEnter lat/lon"; if (defined $llstr) { print " ["; if ($latstr =~ /:/) { printf "%02d:%02d:%02d", $latd, $latm, $lats; } else { print "$lat"; } if ($lonstr =~ /:/) { printf " %03d:%02d:%02d", $lond, $lonm, $lons; } else { print " $lon"; } print "]"; } print ": "; defined ($llstr = ) or exit; chomp $llstr; ($latstr, $lonstr) = split(' ', $llstr); (defined $latstr && defined $lonstr) or exit; if ($latstr =~ /:/) { ($latd, $latm, $lats) = split(/:/, $latstr); $lat = abs($latd); if (defined $latm) { $lat += ($latm / 60.); } else { $latm = 0; } if (defined $lats) { $lat += ($lats / 3600.); } else { $lats = 0; } $latd < 0 and $lat = -$lat; } else { $lat = $latstr; } if ($lonstr =~ /:/) { ($lond, $lonm, $lons) = split(/:/, $lonstr); $lon = abs($lond); if (defined $lonm) { $lon += ($lonm / 60.); } else { $lonm = 0; } if (defined $lons) { $lon += ($lons / 3600.); } else { $lons = 0; } $lond < 0 and $lon = -$lon; } else { $lon = $lonstr; } my @hits = (); for (my $i = 0; $i < scalar(@info); $i++) { my $rec = $info[$i]; if ($lat >= $$rec{'minlat'} and $lat <= $$rec{'maxlat'} and $lon >= $$rec{'minlon'} and $lon <= $$rec{'maxlon'}) { my $area = ($$rec{'maxlon'} - $$rec{'minlon'}) * ($$rec{'maxlat'} - $$rec{'minlat'}); my $j; for ($j = 0; $j < scalar(@hits); $j++) { next if $area > ${$hits[$j]}[1]; splice @hits, $j, 0, [$i, $area]; last; } if ($j == scalar(@hits)) { push @hits, [$i, $area]; } } } next if ! scalar(@hits); SELECT: while (1) { open (PIPE, "| $PAGER $PAGEOPT"); my $n = 0; foreach my $h (@hits) { my $rec = $info[$$h[0]]; printf PIPE "%3d: %s\n", $n++, $$rec{'desc'}; } close(PIPE); while (1) { print "\nSelect map: "; defined ($n = ) or exit; chomp $n; last SELECT if $n eq ""; $n =~ /^[0-9]+$/ or do {print "\nInvalid entry\n"; next}; ($n < 0 || $n >= scalar(@hits)) and do {print "\nInvalid entry\n"; next}; my $rec = $info[${$hits[$n]}[0]]; system("$VIEWER '$$rec{'fname'}'"); last; } } } .