llh@midacs.UUCP (Linn Hower) (09/14/85)
What follows is a shell archive of a program for aviation navigation planning. There is no documentation. This code runs on (at least) bsd4.2 and 4.1 . I suspect problems should be very few for other systems. For more information, refer to the recent discussions in net.aviation. --------------nav.sh---------------------------------- : This is a shar archive. Extract with sh, not csh. : The rest of this file will extract: : Makefile file.c main.c main.corg nav.c nav.corg output.c output.corg scan.c nav.h nav.horg airports vors echo extracting - Makefile sed 's/^X//' > Makefile << '!E_O_F!' X# X# Makefile for "nav" pre-flight great circle program X# X Xall: nav X XCFLGS=-O X X# X# "-lnm" refers to a "new math" library. You might not have it, but "-lm". X# Xnav: main.o nav.o file.o scan.o output.o nav.h X cc ${CFLGS} main.o nav.o file.o scan.o output.o -o nav -lm X Xmain.o: main.c nav.h X Xnav.o: nav.c nav.h X Xfile.o: file.c nav.h X Xscan.o: scan.c nav.h X Xoutput.o: output.c X Xinstall: nav X install -c -s nav /whatever/bin/nav X Xclean: X -rm -f *.o core X Xcleanall: X -rm -f *.o core nav !E_O_F! echo extracting - file.c sed 's/^X//' > file.c << '!E_O_F!' X/* X * Routines for reading and parsing nav data files X * X * All degrees stored as decimal degrees. X */ X#include <stdio.h> X#include "nav.h" X Xdouble Radians(); Xdouble Degrees(); Xchar *index(); Xchar *malloc(); Xdouble atof(); X Xstruct vor *LineToVor(s) Xchar *s; X{ X static struct vor buf; X register char *p, *q; X register double min; X X p = s; X q = index(p,':'); X if (q == NULL) X return NULL; X *q = 0; X strcpy(buf.id,p); /* copy in the id */ X p = q+1; X q = index(p,':'); X if (q == NULL) X return NULL; X *q = 0; X strcpy(buf.name,p); /* copy in the name */ X p = q+1; X q = index(p,':'); X if (q == NULL) X return NULL; X *q = 0; X buf.freq = (float)atof(p); /* frequency */ X p = q+1; X q = index(p,':'); X if (q == NULL) X return NULL; X *q = 0; X buf.var = atof(p); /* variation in degrees */ X p = q+1; X q = index(p,':'); X if (q == NULL) X return NULL; X *q = 0; X min = atof(p) / 60; /* add variation minutes */ X buf.var += buf.var<0 ? (0. - min) : min; X p = q+1; X q = index(p,':'); X if (q == NULL) X return NULL; X *q = 0; X buf.loc.lat.deg = atof(p); /* north degrees */ X p = q+1; X q = index(p,':'); X if (q == NULL) X return NULL; X *q = 0; X min = atof(p) / 60; /* add north minutes */ X buf.loc.lat.deg += buf.loc.lat.deg<0 ? (0. - min) : min; X buf.loc.lat.rad = Radians(buf.loc.lat.deg); X p = q+1; X q = index(p,':'); X if (q == NULL) X return NULL; X *q = 0; X buf.loc.lon.deg = atof(p); /* west degrees */ X p = q+1; X q = index(p,':'); X if (q == NULL) X return NULL; X *q = 0; X min = atof(p) / 60; /* add west minutes */ X buf.loc.lon.deg += buf.loc.lon.deg<0 ? (0. - min) : min; X buf.loc.lon.rad = Radians(buf.loc.lon.deg); X p = q+1; X if (! *p) X return NULL; X strncpy(buf.comments,p,sizeof buf.comments); X q = index(buf.comments,'\n'); X q = 0; X return &buf; X} X Xstruct apt *LineToApt(s) Xchar *s; X{ X static struct apt buf; X register char *p, *q; X register double min; X X p = s; X q = index(p,':'); X if (q == NULL) X return NULL; X *q = 0; X strcpy(buf.id,p); /* copy in the id */ X p = q+1; X q = index(p,':'); X if (q == NULL) X return NULL; X *q = 0; X strcpy(buf.city,p); /* city closest to airport */ X p = q+1; X q = index(p,':'); X if (q == NULL) X return NULL; X *q = 0; X strcpy(buf.name,p); /* name of airport */ X p = q+1; X q = index(p,':'); X if (q == NULL) X return NULL; X *q = 0; X buf.alt = atoi(p); /* airport altitude in feet */ X p = q+1; X q = index(p,':'); X if (q == NULL) X return NULL; X *q = 0; X buf.var = atof(p); /* variation in decimal degrees */ X p = q+1; X q = index(p,':'); X if (q == NULL) X return NULL; X *q = 0; X min = atof(p) / 60; /* add variation minutes */ X buf.var += buf.var<0 ? (0. - min) : min; X p = q+1; X q = index(p,':'); X if (q == NULL) X return NULL; X *q = 0; X buf.loc.lat.deg = atof(p); /* north degrees */ X p = q+1; X q = index(p,':'); X if (q == NULL) X return NULL; X *q = 0; X min = atof(p) / 60; /* add north minutes */ X buf.loc.lat.deg += buf.loc.lat.deg<0 ? (0. - min) : min; X buf.loc.lat.rad = Radians(buf.loc.lat.deg); X p = q+1; X q = index(p,':'); X if (q == NULL) X return NULL; X *q = 0; X buf.loc.lon.deg = atof(p); /* west degrees */ X p = q+1; X q = index(p,':'); X if (q == NULL) X return NULL; X *q = 0; X min = atof(p) / 60; /* add west minutes */ X buf.loc.lon.deg += buf.loc.lon.deg<0 ? (0. - min) : min; X buf.loc.lon.rad = Radians(buf.loc.lon.deg); X p = q+1; X if (! *p) X return NULL; X strncpy(buf.comments,p,sizeof buf.comments); X q = index(buf.comments,'\n'); X q = 0; X return &buf; X} X X/* X * Fill array of struct apt with data from file. X * Return number of elements in array, 0 on error. X */ XParseApt(array,fp) Xstruct apt array[]; XFILE fp; X{ X char line[BUFSIZ]; X register char *s; X register struct apt *ptr; X register int cnt; X X cnt = 0; X while ((cnt <= MAXAPTS) && (fgets(line, sizeof line, fp) != NULL)){ X if ( line[0] == '#' ){ /* comment line */ X continue; X } X ptr = LineToApt(line); X if (ptr == NULL){ X fprintf(stderr, X "LineToApt from ParseApt returned NULL on line\n%s\n", X line); X return NULL; X } X array[cnt] = *ptr; X cnt++; X } X return cnt; X} X X/* X * Fill array of struct vor with data from file. X * Return number of elements in array, 0 on error. X */ XParseVor(array,fp) Xstruct vor array[]; XFILE fp; X{ X char line[BUFSIZ]; X register char *s; X register struct vor *ptr; X register int cnt; X X cnt = 0; X while ((cnt <= MAXVORS) && (fgets(line, sizeof line, fp) != NULL)){ X if ( line[0] == '#' ){ /* comment line */ X continue; X } X ptr = LineToVor(line); X if (ptr == NULL){ X fprintf(stderr, X "LineToVor from ParseVor returned NULL on line\n%s\n", X line); X return NULL; X } X array[cnt] = *ptr; X cnt++; X } X return cnt; X} !E_O_F! echo extracting - main.c sed 's/^X//' > main.c << '!E_O_F!' X#include <stdio.h> X#include <math.h> X#include "nav.h" X Xdouble Distance(); Xdouble Bearing(); Xdouble Magnetic(); Xdouble Degrees(); Xdouble Radians(); Xdouble LatIntercept(); X Xint comflg; Xint rviaflg; X Xmain(ac,av) Xint ac; Xchar **av; X{ X struct apt AptArray[MAXAPTS]; X struct vor VorArray[MAXVORS]; X struct vor ViaArray[MAXVIA]; X int AptC, VorC, ViaC; X FILE *fpa, *fpv; X struct apt From, To; X double Dist, TotalDist, Course, WpLat, WpDist, WpRad; X char sysbuf[BUFSIZ]; X X struct fix LastFix; X double LastVar; X char LastId[NAMLEN]; X X register int v; X register int i; X int fromflg, toflg, viaflg; X X comflg = 0; X fromflg = 0; X toflg = 0; X viaflg = 0; X rviaflg = 0; X X fpa = fopen(AIRPORTS,"r"); X if (fpa == NULL){ X perror(AIRPORTS); X exit(1); X } X fpv = fopen(VORS,"r"); X if (fpv == NULL){ X perror(VORS); X exit(1); X } X AptC = ParseApt(AptArray,fpa); X if (! AptC){ X oops("Trouble parsing airports"); X } X fclose(fpa); X VorC = ParseVor(VorArray,fpv); X if (! VorC){ X oops("Trouble parsing VORs"); X } X fclose(fpv); X X ac--;av++; X while(ac){ X if (strcmp(*av,"-from") == 0){ X ac--;av++; X if(!ac || **av == '-') X usage("from: Missing departure ID"); X if (fromflg) X usage("from: Two departure points?"); X if (FindApt(&From,*av,AptArray,AptC) != 0) X oops("Couldn't find your departure airport"); X fromflg++; X ac--;av++; X }else if (strcmp(*av,"-to") == 0){ X ac--;av++; X if(!ac || **av == '-') X usage("to: Missing destination ID"); X if (toflg) X usage("to: Two destinations?"); X if (FindApt(&To,*av,AptArray,AptC) != 0) X oops("Couldn't find your destination airport"); X toflg++; X ac--;av++; X }else if (strcmp(*av,"-via") == 0){ X ac--;av++; X if(!ac || **av == '-') X usage("via: Missing VOR ID(s)"); X if (viaflg) X usage("via: One set of 'via' VORs please"); X for(ViaC=0; X ac && (**av != '-') && (ViaC < MAXVIA); X ViaC++){ X if (FindVor(&ViaArray[ViaC],*av,VorArray,VorC) X != 0){ X fprintf(stderr, X "via: %s: VOR not found\n",*av); X exit(1); X } X ac--;av++; X } X viaflg++; X }else if (strcmp(*av,"-rvia") == 0){ X ac--;av++; X if(!ac || **av == '-') X usage("rvia: Missing VOR ID(s)"); X if (rviaflg) X usage("rvia: One set of 'rvia' VORs please"); X for(ViaC=0; X ac && (**av != '-') && (ViaC < MAXVIA); X ViaC++){ X if (FindVor(&ViaArray[ViaC],*av,VorArray,VorC) X != 0){ X fprintf(stderr, X "rvia: %s: VOR not found\n",*av); X exit(1); X } X ac--;av++; X } X rviaflg++; X }else if (strcmp(*av,"-com") == 0){ X comflg++; X ac--;av++; X }else if (strcmp(*av,"-airports") == 0){ X sprintf(sysbuf,"/usr/ucb/more %s",AIRPORTS); X system(sysbuf); X exit(0); X }else if (strcmp(*av,"-vors") == 0){ X sprintf(sysbuf,"/usr/ucb/more %s",VORS); X system(sysbuf); X exit(0); X }else if (strcmp(*av,"-k") == 0){ X ac--;av++; X if (!ac) usage("-k: missing keyword or pattern"); X sprintf(sysbuf,"/bin/grep -i %s %s", X *av,AIRPORTS); X system(sysbuf); X sprintf(sysbuf,"/bin/grep -i %s %s", X *av,VORS); X system(sysbuf); X exit(0); X } X else X/* X * Default action here X */ X usage("Plan a flight..."); X } X X if ( (fromflg && !(toflg || viaflg)) || X ( toflg && !(fromflg || viaflg)) || X (viaflg && rviaflg) || X (rviaflg && !(fromflg && toflg)) || X ((!fromflg && !toflg) && !viaflg) ) X usage("Plan a flight..."); X/* X * Now that we are done loading the data into the structs X * and parsing the command line, we can have some fun. X */ X X TotalDist = Dist = 0.; X if(fromflg){ X PrintApt(&From); X LastFix = From.loc; X LastVar = From.var; X strcpy(LastId,From.id); X } X if (rviaflg) { X viaflg = rviaflg; X for (v=0; v < ViaC; v++) { X WpLat = X LatIntercept(LastFix.lat.rad, LastFix.lon.rad, X To.loc.lat.rad, To.loc.lon.rad, X ViaArray[v].loc.lon.rad); X WpDist = fabs(60. * X Degrees(WpLat - ViaArray[v].loc.lat.rad)); X /* WpDist = sqrt(pow(WpDist,2.) + pow(AVALT,2.)); */ X if (WpLat < ViaArray[v].loc.lat.rad) X WpRad = 180.0 + ViaArray[v].var; X else X WpRad = 360.0 + ViaArray[v].var; X ViaArray[v].loc.lat.rad = WpLat; X ViaArray[v].loc.lat.deg = Degrees(WpLat); X sprintf(ViaArray[v].waypoint, X "%s R-%05.1f / %.1f", X ViaArray[v].id, WpRad, WpDist); X sprintf(ViaArray[v].id, X "WP%d", X v+1); X } X } X if (viaflg){ X v=0; X if (!fromflg){ X PrintVor(&ViaArray[v]); X LastFix = ViaArray[v].loc; X LastVar = ViaArray[v].var; X strcpy(LastId,ViaArray[v].id); X v++; X }else{ X Dist = Distance(LastFix.lat.rad,LastFix.lon.rad, X ViaArray[v].loc.lat.rad,ViaArray[v].loc.lon.rad); X Course= Bearing(LastFix.lat.rad,LastFix.lon.rad, X ViaArray[v].loc.lat.rad,ViaArray[v].loc.lon.rad); X TotalDist += Dist; X PrintVor(&ViaArray[v]); X if (rviaflg) X PrintWp(&ViaArray[v]); X PrintNav(LastId,ViaArray[v].id,Course, X Magnetic(Course,LastVar), X Dist,TotalDist); X LastFix = ViaArray[v].loc; X LastVar = ViaArray[v].var; X strcpy(LastId,ViaArray[v].id); X v++; X } X while(v < ViaC){ X Dist = Distance(LastFix.lat.rad,LastFix.lon.rad, X ViaArray[v].loc.lat.rad,ViaArray[v].loc.lon.rad); X Course= Bearing(LastFix.lat.rad,LastFix.lon.rad, X ViaArray[v].loc.lat.rad,ViaArray[v].loc.lon.rad); X TotalDist += Dist; X PrintVor(&ViaArray[v]); X if (rviaflg) X PrintWp(&ViaArray[v]); X PrintNav(LastId,ViaArray[v].id,Course, X Magnetic(Course,LastVar), X Dist,TotalDist); X LastFix = ViaArray[v].loc; X LastVar = ViaArray[v].var; X strcpy(LastId,ViaArray[v].id); X v++; X } X printf("\n"); X } X if (toflg){ X Dist = Distance(LastFix.lat.rad,LastFix.lon.rad, X To.loc.lat.rad,To.loc.lon.rad); X Course= Bearing(LastFix.lat.rad,LastFix.lon.rad, X To.loc.lat.rad,To.loc.lon.rad); X TotalDist += Dist; X printf("\n"); X PrintNav(LastId,To.id,Course, X Magnetic(Course,LastVar), X Dist,TotalDist); X PrintApt(&To); X } X} X Xusage(s) Xchar *s; X{ X fprintf(stderr,"nav: %s\n\n",s); X fprintf(stderr, X "Usage: nav [-from airport_id -to airport_id] [-[r]via vor [vor...]] [-com]\n"); X fprintf(stderr, X "(The order of the 'from', 'to' and '[r]via' parts may be arbitrary)\n"); X fprintf(stderr, X "Or:\nnav -k string: grep a string from the databases ignoring case\n"); X fprintf(stderr, X "nav -airports : print out the airport database\n"); X fprintf(stderr, X "nav -vors : print out the vor database\n"); X fprintf(stderr,"\nUse the abbreviated IDs found in the databases.\n"); X exit(1); X} X Xoops(s) Xchar *s; X{ X fprintf(stderr,"nav: %s\n",s); X exit(1); X} !E_O_F! echo extracting - main.corg sed 's/^X//' > main.corg << '!E_O_F!' X#include <stdio.h> X#include <math.h> X#include "nav.h" X X#define AIRPORTS "/whatever/airports" X#define VORS "/whatever/vors" X Xdouble Distance(); Xdouble Bearing(); Xdouble Magnetic(); Xdouble Radians(); X Xint comflg; X Xmain(ac,av) Xint ac; Xchar **av; X{ X struct apt AptArray[MAXAPTS]; X struct vor VorArray[MAXVORS]; X struct vor ViaArray[MAXVIA]; X int AptC, VorC, ViaC; X FILE *fpa, *fpv; X struct apt From, To; X double Dist, TotalDist, Course; X char sysbuf[BUFSIZ]; X X struct fix LastFix; X double LastVar; X char LastId[NAMLEN]; X X register int v; X register int i; X int fromflg, toflg, viaflg; X X comflg = 0; X fromflg = 0; X toflg = 0; X viaflg = 0; X X fpa = fopen(AIRPORTS,"r"); X if (fpa == NULL){ X perror(AIRPORTS); X exit(1); X } X fpv = fopen(VORS,"r"); X if (fpv == NULL){ X perror(VORS); X exit(1); X } X AptC = ParseApt(AptArray,fpa); X if (! AptC){ X oops("Trouble parsing airports"); X } X fclose(fpa); X VorC = ParseVor(VorArray,fpv); X if (! VorC){ X oops("Trouble parsing VORs"); X } X fclose(fpv); X X ac--;av++; X while(ac){ X if (strcmp(*av,"-from") == 0){ X ac--;av++; X if(!ac || **av == '-') X usage("from: Missing departure ID"); X if (fromflg) X usage("from: Two departure points?"); X if (FindApt(&From,*av,AptArray,AptC) != 0) X oops("Couldn't find your departure airport"); X fromflg++; X ac--;av++; X }else if (strcmp(*av,"-to") == 0){ X ac--;av++; X if(!ac || **av == '-') X usage("to: Missing destination ID"); X if (toflg) X usage("to: Two destinations?"); X if (FindApt(&To,*av,AptArray,AptC) != 0) X oops("Couldn't find your destination airport"); X toflg++; X ac--;av++; X }else if (strcmp(*av,"-via") == 0){ X ac--;av++; X if(!ac) X usage("via: Missing VOR ID(s)"); X if (viaflg) X usage("via: One set of 'via' VORs please"); X for(ViaC=0; X ac && (**av != '-') && (ViaC <= MAXVIA); X ViaC++){ X if (FindVor(&ViaArray[ViaC],*av,VorArray,VorC) X != 0){ X fprintf(stderr, X "via: %s: VOR not found\n",*av); X exit(1); X } X ac--;av++; X } X viaflg++; X }else if (strcmp(*av,"-com") == 0){ X comflg++; X ac--;av++; X }else if (strcmp(*av,"-airports") == 0){ X sprintf(sysbuf,"/usr/ucb/more %s",AIRPORTS); X system(sysbuf); X exit(0); X }else if (strcmp(*av,"-vors") == 0){ X sprintf(sysbuf,"/usr/ucb/more %s",VORS); X system(sysbuf); X exit(0); X }else if (strcmp(*av,"-k") == 0){ X ac--;av++; X if (!ac) usage("-k: missing keyword or pattern"); X sprintf(sysbuf,"/bin/grep -i %s %s", X *av,AIRPORTS); X system(sysbuf); X sprintf(sysbuf,"/bin/grep -i %s %s", X *av,VORS); X system(sysbuf); X exit(0); X } X else X/* X * Default action here X */ X usage("Plan a flight"); X } X X if ((fromflg && !(toflg || viaflg)) || X ( toflg && !(fromflg || viaflg)) || X ((!fromflg && !toflg) && !viaflg)) X usage("If I were a real Unix program I'd say 'arg count'!"); X/* X * Now that we are done loading the data into the structs X * and parsing the command line, we can have some fun. X */ X X TotalDist = Dist = 0.; X if(fromflg){ X PrintApt(&From); X LastFix = From.loc; X LastVar = From.var; X strcpy(LastId,From.id); X } X if (viaflg){ X v=0; X if (!fromflg){ X PrintVor(&ViaArray[v]); X LastFix = ViaArray[v].loc; X LastVar = ViaArray[v].var; X strcpy(LastId,ViaArray[v].id); X v++; X }else{ X Dist = Distance(LastFix.lat.rad,LastFix.lon.rad, X ViaArray[v].loc.lat.rad,ViaArray[v].loc.lon.rad); X Course= Bearing(LastFix.lat.rad,LastFix.lon.rad, X ViaArray[v].loc.lat.rad,ViaArray[v].loc.lon.rad); X TotalDist += Dist; X PrintVor(&ViaArray[v]); X PrintNav(LastId,ViaArray[v].id,Course, X Magnetic(Course,LastVar), X Dist,TotalDist); X LastFix = ViaArray[v].loc; X LastVar = ViaArray[v].var; X strcpy(LastId,ViaArray[v].id); X v++; X } X while(v < ViaC){ X Dist = Distance(LastFix.lat.rad,LastFix.lon.rad, X ViaArray[v].loc.lat.rad,ViaArray[v].loc.lon.rad); X Course= Bearing(LastFix.lat.rad,LastFix.lon.rad, X ViaArray[v].loc.lat.rad,ViaArray[v].loc.lon.rad); X TotalDist += Dist; X PrintVor(&ViaArray[v]); X PrintNav(LastId,ViaArray[v].id,Course, X Magnetic(Course,LastVar), X Dist,TotalDist); X LastFix = ViaArray[v].loc; X LastVar = ViaArray[v].var; X strcpy(LastId,ViaArray[v].id); X v++; X } X } X if (toflg){ X Dist = Distance(LastFix.lat.rad,LastFix.lon.rad, X To.loc.lat.rad,To.loc.lon.rad); X Course= Bearing(LastFix.lat.rad,LastFix.lon.rad, X To.loc.lat.rad,To.loc.lon.rad); X TotalDist += Dist; X PrintNav(LastId,To.id,Course, X Magnetic(Course,LastVar), X Dist,TotalDist); X PrintApt(&To); X } X} X Xusage(s) Xchar *s; X{ X fprintf(stderr,"nav: %s\n\n",s); X fprintf(stderr, X "Usage: nav [-from airport_id -to airport_id] [-via vor[vor...]]\n"); X fprintf(stderr, X "(The order of the 'from', 'to' and 'via' parts may be arbitrary)\n"); X fprintf(stderr, X "Or:\nnav -k string: grep a string from the databases ignoring case\n"); X fprintf(stderr, X "nav -airports : print out the airport database\n"); X fprintf(stderr, X "nav -vors : print out the vor database\n"); X fprintf(stderr,"\nUse the abbreviated IDs found in the databases.\n"); X exit(1); X} X Xoops(s) Xchar *s; X{ X fprintf(stderr,"nav: %s\n",s); X exit(1); X} !E_O_F! echo extracting - nav.c sed 's/^X//' > nav.c << '!E_O_F!' X#include <math.h> X#include "nav.h" X X/* X * Returns radians given decimal degrees X */ Xdouble Radians(degrees) Xdouble degrees; X{ X return degrees * (pi/180.); X} X X/* X * Returns decimal degrees given radians X */ Xdouble Degrees(radians) Xdouble radians; X{ X return radians / (pi/180.); X} X X/* X * Returns distance in Nautical Miles given two sets of latitude X * and longitude in radians. X * Latitudes are positive for North, negative for South (N1, N2) X * Longitudes are positive for West, negative for East (W1, W2) X * X * Algorithm from HP-25 Applications Programs, Rhumbline Navigation, X * page 65. X */ Xdouble Distance(N1,W1,N2,W2) Xdouble N1,W1,N2,W2; X{ X register double C; X X C = atan2 ( X ( 2. * asin(sin(.5 * (W1 - W2))) ) X , X ( log(tan(pi*.25 + .5*N2)) - log(tan(pi*.25 + .5*N1)) ) X ); X X if (N1 == N2) X return (60. * fabs(Degrees(2. * asin(sin(.5 * (W1 - W2))))) X * cos(N1)); X else X return (60. * Degrees(N2 - N1) / cos(fabs(C))); X} X X/* X * Returns true bearing from North in decimal degrees given two sets of X * latitude and longitude in radians. X * Latitudes are positive for North, negative for South (N1, N2) X * Longitudes are positive for West, negative for East (W1, W2) X * X * Algorithm from HP-25 Applications Programs, Rhumbline Navigation, X * page 65. X */ Xdouble Bearing(N1,W1,N2,W2) Xdouble N1,W1,N2,W2; X{ X register double C; X X C = atan2 ( X ( 2. * asin(sin(.5 * (W1 - W2))) ) X , X ( log(tan(pi*.25 + .5*N2)) - log(tan(pi*.25 + .5*N1)) ) X ); X return ( (asin(sin(W1-W2)) >= 0.) X ? Degrees(fabs(C)) X : 360. - Degrees(fabs(C)) ); X} X X/* X * Returns magnetic bearing in decimal degrees given true bearing and the X * magnetic variation in decimal degrees. East variation is expressed X * by a negative value. Pretty fancy, eh? X */ Xdouble Magnetic(true,variation) Xdouble true,variation; X{ X register double course; X X course = true + variation; X if ( course < 0. ) course = 360. - course; X if ( course >= 360. ) course = course - 360.; X return course; X} X X/* X * Returns latitude in radians (Ni) of the intercept at longitude X * Wi for the great circle course from (N1, W1) to (N2, W2). X * Latitude and longitude in radians. X * Latitudes are positive for North, negative for South (N1, N2) X * Longitudes are positive for West, negative for East (W1, W2) X * X * Algorithm from HP-25 Applications Programs, Great Circle Ploting, X * page 62. X */ Xdouble LatIntercept(N1,W1,N2,W2,Wi) Xdouble N1,W1,N2,W2,Wi; X{ X if (W1 == W2) X oops("Sorry, True N/S from/to's break nav"); X X return ( X atan( X (tan(N2)*sin(Wi-W1) - tan(N1)*sin(Wi-W2)) X / X (sin(W2-W1)) X ) X ); X} !E_O_F! echo extracting - nav.corg sed 's/^X//' > nav.corg << '!E_O_F!' X#include <math.h> X#include "nav.h" X X/* X * Returns radians given decimal degrees X */ Xdouble Radians(degrees) Xdouble degrees; X{ X return degrees * (pi/180.); X} X X/* X * Returns decimal degrees given radians X */ Xdouble Degrees(radians) Xdouble radians; X{ X return radians / (pi/180); X} X X/* X * Returns distance in Nautical Miles given two sets of latitude X * and longitude in radians. X * Latitudes are positive for North, negative for South (N1, N2) X * Longitudes are positive for West, negative for East (W1, W2) X */ Xdouble Distance(N1,W1,N2,W2) Xdouble N1,W1,N2,W2; X{ X return 60. * Degrees(acos((sin(N1) * sin(N2)) + X (cos(N1) * cos(N2) * (cos(W1 - W2))))); X} X X/* X * Returns true bearing from North in decimal degrees given two sets of X * latitude and longitude in radians. X * Latitudes are positive for North, negative for South (N1, N2) X * Longitudes are positive for West, negative for East (W1, W2) X */ Xdouble Bearing(N1,W1,N2,W2) Xdouble N1,W1,N2,W2; X{ X register double D; X register double C; X X D = acos(sin(N1) * sin(N2) + cos(N1) * cos(N2) * cos(W1 - W2)); X C = acos((sin(N2) - sin(N1) * cos(D)) / (cos(N1) * sin(D))); X return (sin(W1-W2) >= 0.) ? Degrees(C) : 360. - Degrees(C); X} X X/* X * Returns magnetic bearing in decimal degrees given true bearing and the X * magnetic variation in decimal degrees. East variation is expressed X * by a negative value. Pretty fancy, eh? X */ Xdouble Magnetic(true,variation) Xdouble true,variation; X{ X register double course; X X course = true + variation; X if ( course < 0. ) course = 360. - course; X if ( course >= 360. ) course = course - 360.; X return course; X} !E_O_F! echo extracting - output.c sed 's/^X//' > output.c << '!E_O_F!' X/* X * Output formatting and stuff X */ X#include "nav.h" X Xextern int comflg; Xextern int rviaflg; X Xcomment(s) Xchar *s; X{ X register char *p; X X for (p=s; *p != 0; p++) X if (*p == '\n') X *p = 0; X if (comflg && strlen(s)) X printf("\t\t*** %s ***\n",s); X} X XPrintWp(vortac) Xstruct vor *vortac; X{ X printf("wp\t%s\n\n", vortac->waypoint); X} X X XPrintVor(vortac) Xstruct vor *vortac; X{ X if (rviaflg) X printf("\nrvor\t%s\t\t\t\t\tfreq: %.1f\n", vortac->id,vortac->freq); X else X printf("\nvor\t%s\t\t\t\t\tfreq: %.1f\n", vortac->id,vortac->freq); X comment(vortac->comments); X putchar('\n'); X} X XPrintApt(airport) Xstruct apt *airport; X{ X printf("\%s\t(%s)\n", airport->name, airport->city); X printf("%s\taltitude:\t\t\t\t%d feet\n", X airport->id,airport->alt); X comment(airport->comments); X putchar('\n'); X} X XPrintNav(FromId,ToId,Course,Mag,Dist,TotalDist) Xchar *FromId, *ToId; Xdouble Course,Mag,Dist,TotalDist; X{ X if (Dist > 0.01){ /* there is some fudge factor here */ X printf("\t\t%s to %s\nMagnetic:\t\t\t\t\t%03.0f\n", X FromId, ToId, Mag); X printf("Distance:\t\t\t\t\t%.1f NM\n", X Dist); X printf("(true course %03.0f, Total distance %.1f)\n", X Course,TotalDist); X }else{ /* special cased since flying 90 deg for 0 NM is silly */ X printf("\n%s is at %s\n", X FromId, ToId); X printf("(Total distance %.1f)\n", X TotalDist); X } X} !E_O_F! echo extracting - output.corg sed 's/^X//' > output.corg << '!E_O_F!' X/* X * Output formatting and stuff X */ X#include "nav.h" X Xextern int comflg; Xcomment(s) Xchar *s; X{ X register char *p; X X for (p=s; *p != 0; p++) X if (*p == '\n') X *p = 0; X if (comflg && strlen(s)) X printf("\t\t*** %s ***\n",s); X} X XPrintVor(vortac) Xstruct vor *vortac; X{ X printf("\nvor\t%s\t\t\t\t\tfreq: %.1f\n", vortac->id,vortac->freq); X comment(vortac->comments); X putchar('\n'); X} X XPrintApt(airport) Xstruct apt *airport; X{ X printf("\%s\t(%s)\n", airport->name, airport->city); X printf("%s\taltitude:\t\t\t\t%d feet\n", X airport->id,airport->alt); X comment(airport->comments); X putchar('\n'); X} X XPrintNav(FromId,ToId,Course,Mag,Dist,TotalDist) Xchar *FromId, *ToId; Xdouble Course,Mag,Dist,TotalDist; X{ X if (Dist > 0.01){ /* there is some fudge factor here */ X printf("\t\t%s to %s\nMagnetic:\t\t\t\t\t%03.0f\n", X FromId, ToId, Mag); X printf("Distance:\t\t\t\t\t%.1f NM\n", X Dist); X printf("(true course %03.0f, Total distance %.1f)\n", X Course,TotalDist); X }else{ /* special cased since flying 90 deg for 0 NM is silly */ X printf("\n%s is at %s\n", X FromId, ToId); X printf("(Total distance %.1f)\n", X TotalDist); X } X} !E_O_F! echo extracting - scan.c sed 's/^X//' > scan.c << '!E_O_F!' X#include "nav.h" X#include <ctype.h> X X/* X * Attempt to find airport in array by matching IDs, put result in airport. X * Return 1 on error, 0 on success. X * Ignore case by upping case in buf. X */ XFindApt(airport,s,array,count) Xstruct apt *airport; Xchar *s; Xstruct apt array[]; Xint count; X{ X char buf[IDLEN]; X register int i; X X strcpy(buf,s); X uppit(buf); X for (i=0; i < count; i++){ X if (strcmp(array[i].id,buf) == 0){ X *airport = array[i]; X return 0; /* we find only one at a time here */ X } X } X return 1; X} X X/* X * Attempt to find VOR in array by matching IDs, put result in vortac. X * Return 1 on error, 0 on success. X * Ignore case by upping case in buf. X */ XFindVor(vortac,s,array,count) Xstruct vor *vortac; Xchar *s; Xstruct vor array[]; Xint count; X{ X char buf[IDLEN]; X register int i; X X strcpy(buf,s); X uppit(buf); X for (i=0; i < count; i++){ X if (strcmp(array[i].id,buf) == 0){ X *vortac = array[i]; X return 0; /* we find only one at a time here */ X } X } X return 1; X} X X/* X * pretty self-explanatory X */ Xuppit(s) Xchar *s; X{ X while ((*s != '\0') && (*s != '\n')){ X if ((isalpha(*s) && islower(*s))){ X *s=toupper(*s); X } X if (isspace(*s)){ X *s=' '; /* Guarantee that it's a blank char */ X } X s++; X } X} !E_O_F! echo extracting - nav.h sed 's/^X//' > nav.h << '!E_O_F!' X/* X * Defines and structs for nav navigation program X */ X X#define AIRPORTS "airports" X#define VORS "vors" X X#define AVALT 3.0 /* average nm agl for rnav slant range calc */ X X#define pi (3.1415926535897932384626433) X X#define MAXAPTS 512 /* Maximum number of airports in APTarray */ X#define MAXVORS 512 /* Maximum number of VORs in VORarray */ X#define MAXVIA 64 /* Maximum number of VORs in ViaArray */ X#define NAMLEN 33 /* Size of name field + EOS */ X#define COMLEN 65 /* Size of comment field + EOS */ X#define IDLEN 6 /* Size of ID field + EOS */ X#define WPLEN 65 /* Size of WP field + EOS */ X Xstruct lat_lon{ X double rad; /* radians */ X double deg; /* decimal degrees */ X}; Xstruct fix{ X struct lat_lon lat; X struct lat_lon lon; X}; Xstruct vor{ X char id[IDLEN]; /* Three letter ID */ X char name[NAMLEN]; /* Full name of VOR */ X struct fix loc; /* Location of the VOR */ X double var; /* Magnetic variation in decimal degrees */ X float freq; /* Radio frequency */ X char comments[COMLEN]; /* Comments (optional) */ X char waypoint[WPLEN]; /* Waypoint (not in VORS entry) */ X}; Xstruct apt{ X char id[IDLEN]; /* Three letter ID */ X char city[NAMLEN]; /* Name of nearest city */ X char name[NAMLEN]; /* Name of airport */ X int alt; /* Altitude of airport in feet */ X struct fix loc; /* Location of the airport */ X double var; /* Magnetic variation in decimal degrees */ X char comments[COMLEN]; /* Comments (optional) */ X}; !E_O_F! echo extracting - nav.horg sed 's/^X//' > nav.horg << '!E_O_F!' X/* X * Defines and structs for nav navigation program X */ X X#define EARTH_RADIUS (6873.748728) /* radius of earth in NM */ X#define EARTH_RADIUS_STAT (7915.6) /* radius of earth in miles */ X X#define pi (3.1415926535897932384626433) X#define MAXAPTS 512 /* Maximum number of airports in APTarray */ X#define MAXVORS 512 /* Maximum number of VORs in VORarray */ X#define MAXVIA 64 /* Maximum number of VORs in ViaArray */ X#define NAMLEN 32 /* Size of name fields */ X#define COMLEN 64 /* Size of comment fields */ X#define IDLEN 4 /* Size of ID fields */ X Xstruct lat_lon{ X double rad; /* radians */ X double deg; /* decimal degrees */ X}; Xstruct fix{ X struct lat_lon lat; X struct lat_lon lon; X}; Xstruct vor{ X char id[IDLEN]; /* Three letter ID */ X char name[NAMLEN]; /* Full name of VOR */ X struct fix loc; /* Location of the VOR */ X double var; /* Magnetic variation in decimal degrees */ X float freq; /* Radio frequency */ X char comments[COMLEN]; /* Comments (optional) */ X}; Xstruct apt{ X char id[IDLEN]; /* Three letter ID */ X char city[NAMLEN]; /* Name of nearest city */ X char name[NAMLEN]; /* Name of airport */ X int alt; /* Altitude of airport in feet */ X struct fix loc; /* Location of the airport */ X double var; /* Magnetic variation in decimal degrees */ X char comments[COMLEN]; /* Comments (optional) */ X}; !E_O_F! echo extracting - airports sed 's/^X//' > airports << '!E_O_F!' X# X# The fields in this file are in this order: X# ID up to three letters, in caps X# City name of nearest city, up to 32 chars X# Name airport name, up to 32 chars X# Alt airport altitude in feet X# Variation west magnetic variation in degrees and minutes X# Latitude north latitude, degrees and minutes X# Longitude west longitude, degrees and minutes X# Comments optional X# X# X# Each line in this and the vors file must either have a data entry or X# a comment line. X# X# test stuff X# XP1:San Francisco:Harbor:0:0:0:37:49:122:25: XP2:Tokyo:Harbor:0:0:0:35:40:-139:45: X# X# Colorado X# XDRAKO:V-85:Intersection:0:-12:0:40:15.4:105:18.3: XKDEN:Denver, CO:Stapleton Int'l:5333:-12:0:39:46.5:104:52.6:atis 125.6 X# X# Idaho X# XIDA:Idaho Falls, ID:Fanning:4741:-17:0:43:31.0:112:04.0: X# X# Nebraska X# XIDA:Idaho Falls, ID:Fanning:4741:-17:0:43:31.0:112:04.0: XOMA:Ohaha, NE:Eppley Field:983:-7:12:41:18.1:95:53.6: X# X# Texas X# XHOU:Houston, TX:William P. Hobby:47:-6:30:29:38.7:95:16.7: X# X# Utah X# XKSLC:Salt Lake City, UT:Salt Lake City Int'l:4227:-15:0:40:47.2:111:58.1:atis 124.75 X# X################### original airports file ################################ X# X# California X# XACV:Arcata-Eureka:Arcata:218:-18:0:40:59:124:6: XAPC:Napa:Napa County:33:-16:0:38:13:122:17:rght tffc ry 18 XAUN:Auburn:Auburn Municipal:1520:-16:45:38:57:121:5: XBIH:Bishop:Bishop:4118:-15:25:37:22:118:22: XBFL:Bakersfield:Meadows:490:-14:50:35:26:119:3:rght tffc ry 12R, 30R XBUR:Burbank:Burbank:775:-14:15:34:12:118:21:rght tffc ry 15 XCCR:Concord:Buchannan:23:-16:23:37:59:122:3: XCMA:Camarillo:Camarillo:79:-14:28:34:13:119:6:no strght in ry 26 XCOL:Columbia:Columbia:2112:-16:0:38:2:120:25:rght tffc ry 17, 11 11/29:turf XEKA:Eureka:Murray:7:-18:0:40:48:124:7:rght tffc ry 29, 25 XGN:Novato:Gnoss:1:-16:30:38:9:122:33:Just plain suicidal. Ctn: Bonanzas. XNC:Grass Valley:Nevada County Airpark:3150:-16:45:39:13:121:0:No tkffs ry 7 XHAF:Half Moon Bay:Half Moon Bay:67:-16:15:37:31:122:30:No strght in appch, rght tffc ry 30 XHR:Coalinga:Harris Ranch:465:-15:0:36:15:120:14:rght tffc ry 14 XLAX:Los Angeles:Los Angeles International:126:-15:30:33:57:118:24:lgt acft not recc XLR:Little River:Mendocino:572:-16:0:39:16:123:45:Fog summers XLVK:Livermore:Livermore Municipal:397:-16:15:37:42:121:49: XMHV:Mojave:Mojave:2787:-14:30:35:4:118:9:rght tffc ry 25, 30 XMRY:Monterey:Monterey:244:-15:45:36:35:121:51:Rstrctd areas adj N & NE XMYF:San Diego:Montgomery:423:-13:42:32:48.9:117:8.3:Noise Abate XNT:Vacaville:Nut Tree:113:-16:0:38:23:121:58:rght tffc ry 19 XOAK:Oakland:Oakland Metro:6:-16:0:37:43:122:13: XPRB:Paso Robles:Paso Robles Municipal:836:-15:15:35:40:120:38: XPSR:Petaluma:Petaluma Sky Ranch:79:-16:35:38:16:122:37:P-lns ry 11 XRBL:Red Bluff:Red Bluff Municipal:349:-17:23:40:9:122:15:lgts & REIL on req aft 2200 thru FSS XSAC:Sacramento:Sacramento Executive:21:-16:30:38:31:121:30:rght tffc ry 2,34,30 XSAN:San Diego:Lindbergh:15:-13:40:32:44:117:11.2:Noise Abate XSCK:Stockton:Stockton Metro:30:-16:10:37:54:121:14: XSDM:San Diego:Brown Municipal:524:-13:35:32:34.3:116:58.7:Ctn don't overfly Mex XSEE:San Diego-El Cajon:Gillespie:385:-13:40:32:49.5:116:58.3:Noise Abate XSFO:San Francisco:San Francisco International:11:-16:15:37:37:122:22:Fee XSJC:San Jose:San Jose International:56:-16:5:37:22:121:56: XSR:San Rafael:Smith Ranch:5:-16:25:38:1:122:31:night and IFR suicidal XSRN:The Sea Ranch:Sea Ranch:360:-16:45:38:42:123:26:clsd to pub, hump in ctr of ry XSTS:Santa Rosa:Sonoma County:125:-16:0:38:31:122:49: XTRM:Thermal:Thermal:117:-13:45:33:38:116:10: XTVL:South Lake Tahoe:Lake Tahoe:6264:-16:20:38:54:120:0:rght tffc ry 36 X# X# Nevada X# XLAS:Las Vegas:McCarran International:2174:-14:16:36:4.9:115:9.2: XRNO:Reno:Cannon International:4412:-16:35:39:29.8:119:46: X# Oregon X# X# XAS:Aurora State (Wilsonville):Aurora State:195:-19:50:45:15:122:46: XHIO:Portland-Hillsboro:Hillsboro:204:-19:0:45:32:122:57:rght tffc ry 2, 30 XLMT:Klamath Falls:Kingsley:4092:-18:20:42:09:121:44:Birds, jets. Two-way com req'd. Ry 18/36 days only XPDX:Portland:Portland International:26:-19:55:45:35:122:36:Ctn: balloon 600 AGL 4mi W. XSP:Ashland:Sumner Parker:1894:-18:55:42:12:122:40:Pole ry 12. P-lns E. X# X# Utah X# XSLC:Salt Lake City:Salt Lake City Int:4227:-14:0:40:47.2:111:58: !E_O_F! echo extracting - vors sed 's/^X//' > vors << '!E_O_F!' X# X# The fields in this file are in this order: X# ID up to three letters, in caps X# Name VOR name, up to 32 chars X# Freq VOR frequency X# Variation west magnetic variation in degrees and minutes X# Latitude north latitude, degrees and minutes X# Longitude west longitude, degrees and minutes X# Comments optional X# X# test stuff X# XW1:waypoint 1:0:0:0:47:46.1:155:0: XW2:waypoint 2:0:0:0:47:36.17:-175:0: X# X# Colorado VORs X# XCHE:Hayden:115.4:-14:0:40:31.2:107:18.2:D H 2.35 2.6 XDEN:Denver:117.0:-12:0:39:48.0:104:53.2:2.35 2.6 XPUB:Pueblo:116.7:-13:0:38:17.7:104:25.7:D H 2.35 2.6 XTBE:Tobe:115.8:-12:0:37:15.5:103:36.0:D L 2.2 2.65 X# X# Idaho VORs X# XIDA:Idaho Falls:109.0:-17:0:43:31.2:112:03.8:D L 2.2 2.55 X# X# Nebraska VORs X# XCDR:Chadron:113.4:-13:0:42:33.5:103:18.7:D L 2.2 3.6 XOBH:Wolbach:114.8:-10:0:41:22.6:98:21.2:D H 2.2 2.45 X# X# Texas VORs X# XACT:Waco:115.3:-9:0:31:39.7:97:16.1:D H 2.2 2.6 XAQN:Acton:110.6:-9:0:32:26.1:97:39.8:D L 2.2 2.6 XAMA:Amarillo:117.2:-11:0:35:17.3:101:38.3:D H 2.2 2.65 XCDS:Childress:117.6:-10:0:34:22.1:100:17.3:D L 2.2 2.45 XDHT:Dalhart:112.0:-12:0:36:05.5:102:32.7:D L 2.2 3.6 XIAH:Humble:116.6:-8:0:29:57.4:95:20.7:D H 2.35 2.4 XMQP:Millsap:117.7:-9:0:32:43.6:97:59.8:D H 2.2 2.6 XRLG:Kremmling:113.8:-14:0:40:00.2:106:26.5:D L 2.2 3.6 X# X# Utah VORs X# XSLC:Salt Lake City:116.8:-15:0:40:51.0:111:58.9: X# X# Wyoming X# XBPI:Big Piney:116.5:-16:0:42:34.8:110:06.5:D L 2.2 2.6 XCKW:Cherokee:112.2:-15:0:41:45.4:107:34.9:D L 2.2 3.6 XCPR:Casper:116.2:-15:0:43:05.5:106:16.6:D L XRIW:Riverton:108.8:-16:0:43:04.0:108:27.3:T 2.2 2.4 XRKS:Rock Springs:114.7:-16:0:41:35.4:109:00.9:D H 2.2 2.6 X# X################## original vors file ################################ X# X# VORs from the Klamath Falls sectional chart X# XEUG:Eugene:112.9:-19:17:44:7:123:13:tweb XFJS:Fort Jones:109.6:-18:0:41:27:122:48:tweb XLMT:Klamath Falls:115.9:-18:10:42:9:121:44:tweb XOED:Medford:113.6:-18:30:42:28:122:55:tweb XRBG:Roseburg:108.2:-18:52:43:11:123:21:tweb XRDD:Redding:108.4:-17:30:40:31:122:18:tweb X# X# VORs from the San Francisco sectional chart X# XBIH:Bishop:109.6:-15:25:37:22:118:22: XBSR:Big Sur:114.0:-15:35:36:10.5:121:38: XCIC:Chico:109.8:-17:7:39:47:121:51: XCCR:Concord:117.0:-16:23:38:2:122:3: XENI:Mendocino:112.3:-16:55:39:3:123:16: XFAT:Fresno:112.9:-15:31:36:53:119:48: XFRA:Friant:115.6:-15:35:37:5:119:36: XHNW:Hangtown:115.5:-16:25:38:43:120:16: XHZN:Hazen:114.1:-16:25:39:31:119:0: XILA:Williams:114.4:-16:45:39:4:122:2: XLIN:Linden:114.8:-16:10:38:4:121:0.5: XLOL:Lovelock:116.5:-16:35:40:4:118:33.5: XLTA:Lake Tahoe:113.2:-16:35:39:10.5:120:16: XMCE:Merced:114.2:-15:45:37:13:120:24: XMXW:Maxwell:110.0:-16:55:39:19:122:23: XMYV:Marysville:110.8:-16:45:39:6:121:34: XOAK:Oakland:116.8:-16:16:37:43:122:13: XOSI:Woodside:113.9:-16:9:37:23.5:122:17: XPYE:Point Reyes:113.7:-16:30:38:5:122:52: XPXN:Panoche:112.6:-15:40:36:43:120:47: XRBL:Red Bluff:115.7:-17:22:40:5.5:122:14: XRNO:Reno:117.9:-16:35:39:31.5:119:39.5: XROM:Priest:110.0:-15:25:36:8:120:40: XSAC:Sacramento:115.2:-16:30:38:26:121:33: XSAU:Sausalito:116.2:-16:22:37:51:122:31: XSCK:Stockton:116.0:-16:10:37:50:121:10: XSFO:San Francisco:115.8:-16:15:37:37:122:22: XSGD:Skaggs Island:112.1:-16:30:38:11:122:22: XSJC:San Jose:114.1:-16:5:37:22:121:56: XSNS:Salinas:117.3:-15:45:36:40:121:36: XSTS:Santa Rosa:113.0:-16:40:38:31:122:49: X# X# VORs from Los Angeles sectional chart X# XAVE:Avenal:117.1:-15:4:35:36:119:58.7: XBFL:Bakersfield:115.4:-14:50:35:29:119:5.8: XBLH:Blythe:117.4:-13:30:33:6:114:45: XCMA:Camarillo:115.8:-14:27:34:12:119:2.5: XDAG:Daggett:113.2:-14:15:34:57.5:116:35: XFIM:Fillmore:112.5:-14:27:34:21:118:52.5: XFLW:Fellows:117.5:-14:50:35:5.5:119:52: XGFS:Goffs:114.4:-14:2:35:8:115:10.5: XGMN:Gorman:116.1:-14:35:34:48:118:51.5: XGVO:Gaviota:116.5:-14:40:34:32:120:5.5:IN PROHIBITED AREA P-66 XHEC:Hector:112.7:-14:10:34:48:116:27.5: XIPL:Imperial:115.9:-13:22:32:45:115:30.5: XJLI:Julian:114.0:-13:37:33:8:116:35: XLAX:Los Angeles:113.6:-14:15:33:56:118:26: XLHS:Lake Hughes:108.4:-14:29:34:41:118:34: XMRX:March:113.4:-13:55:33:46.5:117:11: XMZB:Mission Bay:117.8:-13:37:32:47:117:13.5: XMXL:Mexicali:115.0:-13:20:32:38:115:13.5:VOR is in Mexico XNZJ:Marine El Toro:117.2:-14:0:33:40.5:117:43.5: XOCN:Oceanside:115.3:-13:45:33:14:117:25: XPDZ:Paradise:112.2:-14:5:33:55:117:32: XPGY:Poggi:109.8:-13:33:32:36:116:59: XPKE:Parker:117.9:-13:40:34:6:114:41: XPMD:Palmdale:114.5:-14:26:34:38:118:4:on Palmdale AFB XPOM:Pomona:110.4:-14:10:34:4:117:47: XPRB:Paso Robles:114.3:-15:15:35:40:120:38: XPSP:Palm Springs:115.5:-13:50:33:52:116:26: XPTV:Porterville:109.2:-15:0:35:55:119:1: XSBA:Santa Barbara:114.9:-14:35:34:30.5:119:46: XSBP:San Luis Obispo:112.4:-15:6:35:15:120:45.5: XSLI:Seal Beach:115.7:-14:7:33:47:118:3: XSXC:Santa Catalina:111.4:-14:57:33:22.5:118:25: XTIJ:Tijuana:116.5:-13:32:32:32.5:116:58:Ctn IN MEXICO XTNP:Twentynine Palms:114.2:-13:52:34:6.5:115:46: XTRM:Thermal:116.2:-13:45:33:38:116:10: X# X# VORs from Las Vegas sectional chart X# XBLD:Boulder City:116.7:-14:15:36:0:114:52: XLAS:Las Vegas:116.9:-14:16:36:4.9:115:9.2: !E_O_F! ----------end nav.sh---------------------------------- -- Linn Hower Phone: 208-526-9353 ...!ucbvax!ucdavis!midacs!isew02!linn