#!/usr/bin/perl -w # NAME: findfix.pl # AIM: Given the name of a fix, search for it... # 18/05/2020 Add to DELL03 machine # 2019-11-18 Review, allow space spearated input list... # 11/02/2014 geoff mclane http://geoffair.net/mperl use strict; use warnings; use File::Basename; # split path ($name,$dir,$ext) = fileparse($file [, qr/\.[^.]*/] ) use Math::Geometry::Planar; use Cwd; my $os = $^O; my $perl_dir = '/home/geoff/bin'; my $PATH_SEP = '/'; my $temp_dir = '/tmp'; if ($os =~ /win/i) { $perl_dir = 'C:\GTools\perl'; $temp_dir = $perl_dir; $PATH_SEP = "\\"; } unshift(@INC, $perl_dir); require 'lib_utils.pl' or die "Unable to load 'lib_utils.pl' Check paths in \@INC...\n"; require 'fg_wsg84.pl' or die "Unable to load fg_wsg84.pl ...\n"; # log file stuff our ($LF); my $pgmname = $0; if ($pgmname =~ /(\\|\/)/) { my @tmpsp = split(/(\\|\/)/,$pgmname); $pgmname = $tmpsp[-1]; } my $outfile = $temp_dir.$PATH_SEP."temp.$pgmname.txt"; open_log($outfile); # user variables my $VERS = "0.0.5 2020-05-18"; #my $VERS = "0.0.4 2019-11-18"; #my $VERS = "0.0.3 2014-11-09"; #my $VERS = "0.0.2 2014-02-11"; my $load_log = 0; my $find_fix = ''; my $verbosity = 0; my $out_file = ''; my $use_xplane = 0; my ($u_min_lon,$u_min_lat,$u_max_lon,$u_max_lat); my $u_got_bbox = 0; my ($bgn_lon,$bgn_lat,$end_lon,$end_lat); my $got_track = 0; my $fudge = 0.01; # degrees my $out_xg = $temp_dir.$PATH_SEP."tempfix.xg"; my $rewrite_csv = 0; # ### DEBUG ### my $debug_on = 0; my $def_file = 'CEDES'; # PIY # ESP # -t "-32.539167,117.074444,-33.680556,121.823889" ### program variables my @warnings = (); my $cwd = cwd(); my @find_fixes = (); my $in_input = 0; my $CDATROOT="F:/fgdata"; # 20140127 - 3.1 if (-d "X:/fgdata") { $CDATROOT = "X:/fgdata"; # 20141109 - 3.3 } if (-d "D:/FG/next/fgdata" ) { $CDATROOT = "D:/FG/next/fgdata"; } my $FGROOT = (exists $ENV{'FG_ROOT'})? $ENV{'FG_ROOT'} : $CDATROOT; my $FIXFILE = "$FGROOT/Navaids/fix.dat.gz"; # the FIX data file my $xp_fix = 'D:\X-Plane-11\Resources\default data/earth_fix.dat'; ### my $xp_fix = 'D:\FG\xplane\1000\earth_fix.dat'; my $fixdata = $FIXFILE; # outfiles, if they do not exist my $fg_csv = $temp_dir.$PATH_SEP."fg-fixes.csv"; my $xp_csv = $temp_dir.$PATH_SEP."xp-fixes.csv"; sub VERB1() { return $verbosity >= 1; } sub VERB2() { return $verbosity >= 2; } sub VERB5() { return $verbosity >= 5; } sub VERB9() { return $verbosity >= 9; } sub show_warnings($) { my ($val) = @_; if (@warnings) { prt( "\nGot ".scalar @warnings." WARNINGS...\n" ); foreach my $itm (@warnings) { prt("$itm\n"); } prt("\n"); } else { prt( "\nNo warnings issued.\n\n" ) if (VERB9()); } } sub pgm_exit($$) { my ($val,$msg) = @_; if (length($msg)) { $msg .= "\n" if (!($msg =~ /\n$/)); prt($msg); } show_warnings($val); close_log($outfile,$load_log); exit($val); } sub prtw($) { my ($tx) = shift; $tx =~ s/\n$//; prt("$tx\n"); push(@warnings,$tx); } sub in_world_range($$) { my ($lt,$ln) = @_; return 0 if ($lt < -90); return 0 if ($lt > 90); return 0 if ($ln < -180); return 0 if ($ln > 180); return 1; } sub in_world($$) { my ($lon,$lat) = @_; if (($lat < -90)|| ($lat > 90)|| ($lon < -180)|| ($lon > 180)) { return 0; } return 1; } sub process_in_file($) { my ($inf) = @_; if (! open INF, "<$inf") { pgm_exit(1,"ERROR: Unable to open file [$inf]\n"); } my @lines = ; close INF; my $lncnt = scalar @lines; prt("Processing $lncnt lines, from [$inf]...\n"); my ($line,$inc,$lnn); $lnn = 0; foreach $line (@lines) { chomp $line; $lnn++; if ($line =~ /\s*#\s*include\s+(.+)$/) { $inc = $1; prt("$lnn: $inc\n"); } } } sub write_csv($$$) { my ($ra,$file,$xp) = @_; my $csv = "latitude,longitude,name\n"; my ($line,@arr,$len,$cnt,$bgn,$itm); my $min = 3; if ($xp) { $csv = "latitude,longitude,name,item,id,num\n"; $min = 6; } $cnt = 0; foreach $line (@{$ra}) { $line = trim_all($line); $len = length($line); next if ($len == 0); @arr = split(/\s+/,$line); $len = scalar @arr; $bgn = $arr[0]; if ($len == 1) { last if ($bgn eq '99'); next; } if ($line =~ /\s+Version\s+/i) { prt("$line\n"); next; } next if ($len < $min); $cnt++; $csv .= join(",",@arr)."\n"; } rename_2_old_bak($file); write2file($csv,$file); prt("Written $cnt fixes to $file\n"); } my @fix_lines = (); #I #1101 Version - data cycle 1708, build 20180717, metadata FixXP1101. Copyright (c) 2018 Navigraph, Datasource Jeppesen # # 33.492513889 9.217400000 07EBA ENRT DT 2118994 # 16.000000000 -30.000000000 1630N ENRT GV 2115145 #... #99 sub load_xp_fixes() { open NIX, "< $xp_fix" or pgm_exit(1,"Error: Unable to open $xp_fix!\n"); @fix_lines = ; close NIX; if ((! -f $xp_csv) || $rewrite_csv) { write_csv(\@fix_lines,$xp_csv,1); } return \@fix_lines; } sub load_fix_file { return \@fix_lines if (@fix_lines); if ($use_xplane) { return load_xp_fixes() } prt("\n[v9] Loading $fixdata file ...\n") if (VERB9()); mydie("ERROR: Can NOT locate [$fixdata]!\n") if ( !( -f $fixdata) ); open NIF, "gzip -d -c $fixdata|" or mydie( "ERROR: CAN NOT OPEN $fixdata...$!...\n" ); @fix_lines = ; close NIF; prt("[v9] Got ".scalar @fix_lines." lines to scan...from $fixdata\n") if (VERB9()); if ((! -f $fg_csv) || $rewrite_csv) { write_csv(\@fix_lines,$fg_csv,0); } return \@fix_lines; } my %fixes_found = (); my %fix_dupes = (); sub find_fix($) { my $fix = shift; my $ra = load_fix_file(); my $max = scalar @{$ra}; prt("Searching for $fix, in $max lines of file $fixdata\n") if (VERB9()); my ($line,$i,$tline,@arr,$test,$lat,$lon,$len,$i2,$fnd,$rfla); $fnd = 0; my @lines = (); my $lncnt = 0; for ($i = 0; $i < $max; $i++) { $i2 = $i + 1; $line = ${$ra}[$i]; $line = trim_all($line); @arr = split(/\s+/,$line); $lat = $arr[0]; last if ($lat eq '99'); $len = scalar @arr; next if ($len < 3); $lncnt++; $lon = $arr[1]; $test = $arr[2]; # prt("$i2: Fix $test $lat $lon\n"); if ($test eq $fix) { prt("Found $fix $lat $lon\n") if (VERB5()); $fnd++; push(@lines,$line); $fixes_found{$fix} = [] if (!defined $fixes_found{$fix}); $rfla = $fixes_found{$fix}; push(@{$rfla},$line); } } ### $load_log = 1; if ($fnd) { prt("Fix $fix found $fnd times - "); prt(join(" ",@lines)); prt("\n"); } else { prt("Fix $fix NOT found in $max lines...\n"); } } sub find_fixes() { my ($fix,$cnt,$line,$rfla,@arr2,$lat,$lon); $cnt = scalar @find_fixes; prt("Searching for $cnt fixes...\n"); foreach $fix (@find_fixes) { find_fix($fix); } ############################################ # SORT the fixes alphabetically my @arr = sort keys(%fixes_found); my $cnt2 = scalar @arr; my $json = ''; if ($cnt2) { prt("Found $cnt2 of $cnt fixes...\n"); $json .= "{\"FIXES\":[\n"; $cnt2 = 0; foreach $fix (@arr) { $rfla = $fixes_found{$fix}; foreach $line (@{$rfla}) { @arr2 = split(/\s+/,$line); $lat = $arr2[0]; $lon = $arr2[1]; $json .= ",\n" if ($cnt2); $json .= "{\"N\":\"$fix\",\"lat\":$lat,\"lon\":$lon}"; $cnt2++; } } $json .= "\n]}\n"; if ($cnt2) { if (length($out_file)) { rename_2_old_bak($out_file); write2file($json,$out_file); prt("JSON for $cnt2 fixes written to $out_file\n"); } else { prt($json); prt("No output file -o command found.\n"); } } } my $msg1 = ''; my $msg2 = ''; foreach $fix (@find_fixes) { $cnt2 = 0; foreach $line (@arr) { if ($fix eq $line) { $cnt2 = 1; last; } } if ($cnt2) { # found $msg1 .= ' ' if (length($msg1)); $msg1 .= $fix; } else { # not found $msg2 .= ' ' if (length($msg2)); $msg2 .= $fix; } } if (length($msg2)) { prt("Of $cnt, found $msg1, but no find of $msg2\n"); } else { prt("Appears all $cnt fixes found.\n"); } } my $min_nm = 20; my $M2NM = 0.000539957; my $swing = 30; my %inds_used = (); sub get_route($$$$$); sub get_nearest($$$$) { my ($end,$ra,$rfix,$brng) = @_; my $lat = ${$end}[0]; my $lon = ${$end}[1]; my $max = scalar @{$ra}; my ($i,$rf,$dist,$cnt,$flat,$flon,$res,$az1,$az2,$ok); my ($nxfix,$nxind,$nxdist); my $b1 = $brng + $swing; $b1 -= 360 if ($b1 >= 360); my $b2 = $brng - $swing; $b2 += 360 if ($b2 < 0); $cnt = 0; for ($i = 0; $i < $max; $i++) { next if (defined $inds_used{$i}); $rf = ${$ra}[$i]; $flat = ${$rf}[0]; $flon = ${$rf}[1]; $res = fg_geo_inverse_wgs_84($lat,$lon,$flat,$flon, \$az1, \$az2, \$dist ); $ok = 0; if ($b1 > $b2) { if (($az1 <= $b1)&& ($az1 >= $b2)) { $ok = 1; } } else { if (($az1 >= $b1)&& ($az1 <= $b2)) { $ok = 1; } } if ($ok) { if ($cnt == 0) { $nxdist = $dist; $nxfix = $rf; $nxind = $i; } elsif ($dist < $nxdist) { $nxdist = $dist; $nxfix = $rf; $nxind = $i; } $cnt++; ###prt("az1 $az1 IS between $b1 and $b2\n"); } else { ##prt("az1 $az1 is NOT between $b1 and $b2\n"); } } if ($cnt > 0) { ${$rfix} = $nxfix; $inds_used{$nxind} = 1; return 1; } return 0; } sub get_route($$$$$) { my ($bgn,$end,$ra,$lev,$pos) = @_; my $blat = ${$bgn}[0]; my $blon = ${$bgn}[1]; my $bnam = ${$bgn}[2]; my $elat = ${$end}[0]; my $elon = ${$end}[1]; my $enam = ${$end}[2]; my ($az1,$az2,$dist,$nm,$clat,$clon,$fix,$flat,$flon,$fnam); my $res = fg_geo_inverse_wgs_84($blat,$blon,$elat,$elon, \$az1, \$az2, \$dist ); $nm = ($dist * $M2NM * 10) / 10; return if ($nm < $min_nm); $res = fg_geo_direct_wgs_84( $blat, $blon, $az1, ($dist / 2), \$clat, \$clon, \$az2 ); my $nend = [$clat,$clon,'cent']; if (get_nearest( $nend, $ra, \$fix, $az1 )) { $flat = ${$fix}[0]; $flon = ${$fix}[1]; $fnam = ${$fix}[2]; $nend = [$flat,$flon,$fnam]; get_route($bgn,$nend,$ra,($lev+1),'T'); ############################################################################## $res = fg_geo_inverse_wgs_84($blat,$blon,$flat,$flon, \$az1, \$az2, \$dist ); prt("$lev:$pos: From: $bnam $blat,$blon to "); prt("Fix: $flat,$flon $fnam "); $az1 = int($az1 * 10) / 10; $nm = int($dist * $M2NM * 10) / 10; prt("On: $az1, $nm nm.\n"); ############################################################################## get_route($nend,$end,$ra,($lev+1),'B'); } } sub add_fix_xg($$$) { my ($lat,$lon,$name) = @_; my $txt = "anno $lon $lat $name\n"; return $txt; } sub mycmp_decend_n4 { return 1 if (${$a}[4] < ${$b}[4]); return -1 if (${$a}[4] > ${$b}[4]); return 0; } sub mycmp_ascend_n4 { return 1 if (${$a}[4] > ${$b}[4]); return -1 if (${$a}[4] < ${$b}[4]); return 0; } sub search_fix_bbox() { my $ra = load_fix_file(); my $max = scalar @{$ra}; ###prt("Searching for $fix, in $max lines of file $fixdata\n") if (VERB9()); prt("Processing $max fix, get those in box $u_min_lon,$u_min_lat,$u_max_lon,$u_max_lat, fudge=$fudge.\n"); my ($i,$i2,$line,@arr,$len,$lncnt,$lat,$lon,$name,$dist2); $lncnt = 0; if ($fudge > 0) { $u_min_lon -= $fudge; $u_min_lat -= $fudge; $u_max_lon += $fudge; $u_max_lat += $fudge; } my @fix_fnd = (); my $tmpxg = "# Generated by $pgmname on ".lu_get_YYYYMMDD_hhmmss_UTC(time())."\n"; $tmpxg .= "color gray\n"; $tmpxg .= "# bounding box\n"; $tmpxg .= "$u_min_lon $u_min_lat\n"; $tmpxg .= "$u_min_lon $u_max_lat\n"; $tmpxg .= "$u_max_lon $u_max_lat\n"; $tmpxg .= "$u_max_lon $u_min_lat\n"; $tmpxg .= "$u_min_lon $u_min_lat\n"; $tmpxg .= "NEXT\n"; $tmpxg .= "color yellow\n"; for ($i = 0; $i < $max; $i++) { $lncnt++; $i2 = $i + 1; $line = ${$ra}[$i]; $line = trim_all($line); @arr = split(/\s+/,$line); $len = scalar @arr; next if ($len != 3); $lat = $arr[0]; $lon = $arr[1]; $name = $arr[2]; if (($lon >= $u_min_lon) && ($lon <= $u_max_lon) && ($lat >= $u_min_lat) && ($lat <= $u_max_lat)) { prt("$line\n") if (VERB5()); push(@fix_fnd, [$lat,$lon,$name]); $tmpxg .= add_fix_xg($lat,$lon,$name); } } if ($got_track) { $tmpxg .= "# the track\n"; $tmpxg .= "color red\n"; $tmpxg .= "$bgn_lon $bgn_lat\n"; $tmpxg .= "$end_lon $end_lat\n"; $tmpxg .= "NEXT\n"; } if (length($out_xg)) { write2file($tmpxg,$out_xg); prt("Written fix xg to $out_xg\n"); } $len = scalar @fix_fnd; prt("Found $len fix, in bbox $u_min_lon,$u_min_lat,$u_max_lon,$u_max_lat, fudge=$fudge.\n"); if ($got_track) { my ($az1,$az2,$dist,$nm,$paz1,$clat,$clon,$bgn,$end,$nm2); my $res = fg_geo_inverse_wgs_84($bgn_lat,$bgn_lon,$end_lat,$end_lon, \$az1, \$az2, \$dist ); $paz1 = int(($az1+0.5) * 10) / 10; $nm = int($dist * $M2NM * 10) / 10; prt("Track is $bgn_lat,$bgn_lon to $end_lat,$end_lon, bearing $paz1, dist $nm nm.\n"); $bgn = [ $bgn_lat, $bgn_lon, "Bgn" ]; $end = [ $end_lat, $end_lon, "End" ]; ### get_route($bgn,$end,\@fix_fnd,0,'S'); my $p1 = [$bgn_lon,$bgn_lat]; my $p2 = [$end_lon,$end_lat]; #my $p1 = [get_radians($bgn_lon),get_radians($bgn_lat)]; #my $p2 = [get_radians($end_lon),get_radians($end_lat)]; @arr = (); if (VERB5()) { prt("Longitude Latitude Name Dist "); prt("from start "); prt("to track "); } for ($i = 0; $i < $len; $i++) { $ra = $fix_fnd[$i]; #push(@fix_fnd, [$lat,$lon,$name]); $lat = ${$ra}[0]; $lon = ${$ra}[1]; $name = ${$ra}[2]; my $p3 = [$lon,$lat]; #my $p3 = [get_radians($lon),get_radians($lat)]; my $p123 = [$p1,$p2,$p3]; $dist2 = abs(DistanceToLine($p123)) * 1000; # WHAT UNITS ARE THESE?????????? $nm2 = int($dist2 * 10) / 10; $res = fg_geo_inverse_wgs_84($bgn_lat,$bgn_lon,$lat,$lon, \$az1, \$az2, \$dist ); $nm = int($dist * $M2NM * 10) / 10; $az1 = int($az1 * 10) / 10; if (VERB5()) { prt("$lat $lon $name "); prt(sprintf("%5.1f nm, ",$nm)); prt(sprintf("on %5.1f ",$az1)); prt(sprintf("%5.1f ",$nm2)); ###prt("$dist2 "); prt("\n"); } # 0 1 2 3 4 5 push(@arr, [$lon,$lat,$name,$dist2,$dist,$az1]); } my @narr = sort mycmp_ascend_n4 @arr; $len = scalar @narr; prt("\nSorted $len list...\n"); for ($i = 0; $i < $len; $i++) { $ra = $narr[$i]; $lon = ${$ra}[0]; $lat = ${$ra}[1]; $name = ${$ra}[2]; $dist2 = ${$ra}[3]; $dist = ${$ra}[4]; $az1 = ${$ra}[5]; prt("$lat $lon $name "); $nm = int($dist * $M2NM * 10) / 10; prt(sprintf("%5.1f nm, ",$nm)); $az1 = int($az1 * 10) / 10; prt(sprintf("on %5.1f ",$az1)); $nm2 = int($dist2 * 10) / 10; prt(sprintf("%5.1f ",$nm2)); prt("\n"); } } } ######################################### ### MAIN ### parse_args(@ARGV); #process_in_file($find_fix); if ($u_got_bbox) { search_fix_bbox(); } else { find_fixes(); } pgm_exit(0,""); ######################################## sub need_arg { my ($arg,@av) = @_; pgm_exit(1,"ERROR: [$arg] must have a following argument!\n") if (!@av); } sub load_input_file($) { my $file = shift; if (open INP, "<$file") { my @lines = ; close INP; my ($line,@arr,$fix); my @inputs = (); foreach $line (@lines) { chomp $line; $line = trim_all($line); next if (length($line) == 0); next if ($line =~ /^\#/); @arr = split(/\s+/,$line); foreach $fix (@arr) { push(@inputs,$fix); } } if (@inputs) { parse_args(@inputs); } } else { pgm_exit(1,"Error: Unable to load input file $file\n"); } } sub get_bbox($) { my $bbox = shift; my @arr = split(",",$bbox); my $cnt = scalar @arr; if ($cnt != 4) { prt("bbox $bbox failed to split into 4 on comma!\n"); return 0; } $u_min_lon = $arr[0]; $u_min_lat = $arr[1]; if (!in_world($u_min_lon,$u_min_lat)) { prt("min-lon $u_min_lon or min-lat $u_min_lat NOT in world range!\n"); return 0; } $u_max_lon = $arr[2]; $u_max_lat = $arr[3]; if (!in_world($u_max_lon,$u_max_lat)) { prt("max-lon $u_max_lon or max-lat $u_max_lat NOT in world range!\n"); return 0; } if ($u_min_lon >= $u_max_lon) { prt("min-lon $u_min_lon GTE max-lon $u_max_lon!\n"); return 0; } if ($u_min_lat >= $u_max_lat) { prt("min-lat $u_min_lat GTE max-lat $u_max_lat!\n"); return 0; } $u_got_bbox = 1; return 1; } sub get_track($) { my $bbox = shift; my @arr = split(",",$bbox); my $cnt = scalar @arr; if ($cnt != 4) { prt("track $bbox failed to split into 4 on comma!\n"); return 0; } $bgn_lat = $arr[0]; $bgn_lon = $arr[1]; if (!in_world_range($bgn_lat,$bgn_lon)) { prt("bgn-lat $bgn_lat or bgn-lon $bgn_lon NOT in world range!\n"); return 0; } $end_lat = $arr[2]; $end_lon = $arr[3]; if (!in_world_range($end_lat,$end_lon)) { prt("end-lat $end_lat or end-lon $end_lon NOT in world range!\n"); return 0; } my ($minlat,$minlon,$maxlat,$maxlon); $minlat = $bgn_lat < $end_lat ? $bgn_lat : $end_lat; $minlon = $bgn_lon < $end_lon ? $bgn_lon : $end_lon; $maxlat = $bgn_lat > $end_lat ? $bgn_lat : $end_lat; $maxlon = $bgn_lon > $end_lon ? $bgn_lon : $end_lon; $bbox = "$minlon,$minlat,$maxlon,$maxlat"; if (!get_bbox($bbox)) { prt("get_bbox($bbox) failed!\n"); return 0; } $got_track = 1; return 1; } sub parse_args { my (@av) = @_; my ($arg,$sarg); my $verb = VERB2(); my %dupes = (); while (@av) { $arg = $av[0]; if ($arg =~ /^-/) { $sarg = substr($arg,1); $sarg = substr($sarg,1) while ($sarg =~ /^-/); if (($sarg =~ /^h/i)||($sarg eq '?')) { give_help(); pgm_exit(0,"Help exit(0)"); } elsif ($sarg =~ /^b/) { need_arg(@av); shift @av; $sarg = $av[0]; if (!get_bbox($sarg)) { pgm_exit(1,"Error: Failed to get min-lon,min-lat,max-lon,max_lat from '$sarg'!\n"); } } elsif ($sarg =~ /^t/) { need_arg(@av); shift @av; $sarg = $av[0]; if (!get_track($sarg)) { pgm_exit(1,"Error: Failed to get bgn-lat,bgn-lon,end-lat,end-lon from '$sarg'!\n"); } } elsif ($sarg =~ /^v/) { if ($sarg =~ /^v.*(\d+)$/) { $verbosity = $1; } else { while ($sarg =~ /^v/) { $verbosity++; $sarg = substr($sarg,1); } } $verb = VERB2(); prt("Verbosity = $verbosity\n") if ($verb); } elsif ($sarg =~ /^l/) { if ($sarg =~ /^ll/) { $load_log = 2; } else { $load_log = 1; } prt("Set to load log at end. ($load_log)\n") if ($verb); } elsif ($sarg =~ /^i/) { need_arg(@av); shift @av; $sarg = $av[0]; $in_input++; load_input_file($sarg); $in_input--; } elsif ($sarg =~ /^o/) { need_arg(@av); shift @av; $sarg = $av[0]; $out_file = $sarg; prt("Set out file to [$out_file].\n") if ($verb); } elsif ($sarg =~ /^x/) { $use_xplane = 1; prt("Set to use x-plane data file [$xp_fix].\n") if ($verb); } elsif ($sarg =~ /^r/) { $rewrite_csv = 1; prt("Set to re-write CSV file,\n"); } else { pgm_exit(1,"ERROR: Invalid argument [$arg]! Try -?\n"); } } else { $find_fix = $arg; prt("Set input to [$find_fix]\n") if ($verb); if (!defined $dupes{$arg}) { $dupes{$arg} = 1; push(@find_fixes,$find_fix); } } shift @av; } if (! $in_input) { if ($debug_on) { prtw("WARNING: DEBUG is ON!\n"); if (length($find_fix) == 0) { $find_fix = $def_file; push(@find_fixes,$find_fix); prt("Set DEFAULT input to [$find_fix]\n"); } } if ((length($find_fix) == 0) && !$u_got_bbox ) { pgm_exit(1,"ERROR: No input 'fix', 'bbox' nor 'track' found in command!\n"); } } } sub give_help { prt("$pgmname: version $VERS\n"); prt("Usage: $pgmname [options] name name ...\n"); prt("Options:\n"); prt(" --help (-h or -?) = This help, and exit 0.\n"); prt(" --verb[n] (-v) = Bump [or set] verbosity. def=$verbosity\n"); prt(" --load (-l) = Load LOG at end. ($outfile)\n"); prt(" --out (-o) = Write output to this file.\n"); prt(" --xplane (-x) = Use x-plane earth_fix_dat.\n"); prt(" --in (-i) = Use file line separated list of inputs.\n"); prt(" --bbox (-b) = Find all navs within the bounding box.\n"); prt(" --track (-t) = Find all navs along a track, bgn-lat,bgn-lon,end-lat,end-lon.\n"); prt(" --fudge (-f) = Expand bbox by this fudge factor. (def=$fudge)\n"); prt(" --rewrite (-r) = Rewrite CSV file list.\n"); prt(" bbox = min-lon,min-lat,max-lon,max-lat\n"); prt(" Default fix file $fixdata "); if (-f $fixdata) { prt("ok"); } else { prt("NOT FOUND"); } prt("\n"); prt(" Default x-plane $xp_fix "); if (-f $xp_fix) { prt("ok"); } else { prt("NOT FOUND"); } prt("\n"); prt(" Try to find a fix name, or fixes named, in the given fix file.\n"); } # eof - findfix.pl