From: curt Date: Tue, 15 Apr 2003 01:44:57 +0000 (+0000) Subject: Initial revision of script to build the default.ils.gz file from DAFIFT X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=8ce9c2c5295dc106f9e978a11d27dc2ac7a947e5;p=flightgear.git Initial revision of script to build the default.ils.gz file from DAFIFT data. The script is growing though to incorportate other data sources so the name will probably have to change. DAFIFT is missing many approaches (for instance it only has 6 approaches from the entirety of Canada.) This is not yet ready for prime time, I'm simply committing it to the repository so I can check it out and work on it from multiple locations. --- diff --git a/scripts/perl/dafif/dafift2ils.pl b/scripts/perl/dafif/dafift2ils.pl new file mode 100755 index 000000000..70c5612eb --- /dev/null +++ b/scripts/perl/dafif/dafift2ils.pl @@ -0,0 +1,384 @@ +#!/usr/bin/perl + +######################################################################## +# Convert DAFIFT ARPT/ILS.TXT to FlightGear format. +######################################################################## + +use strict; + +my($faa_ils_file) = shift(@ARGV); +my($arpt_file) = shift(@ARGV); +my($dafift_ils_file) = shift(@ARGV); +my($fgfs_ils_file) = shift(@ARGV); + +die "Usage: $0 " . + " \n" + if !defined($faa_ils_file) || !defined($arpt_file) + || !defined($dafift_ils_file) || !defined($fgfs_ils_file); + +my( %Airports ); +my( %ILS ); +my( $record ); + +my( $id, $rwy, $type ); +my( $has_dme, $has_gs, $has_loc, $has_im, $has_mm, $has_om ); +my( $dme_lon, $dme_lat, $dme_elev, $dme_bias ); +my( $gs_lon, $gs_lat, $gs_elev, $gs_angle ); +my( $loc_type, $loc_lon, $loc_lat, $loc_elev, $loc_freq, $loc_hdg, $loc_width, + $loc_id ); +my( $im_lon, $im_lat, $mm_lon, $mm_lat, $om_lon, $om_lat ); + + +######################################################################## +# Process FAA data +######################################################################## + +# Load the DAFIFT ils file + +my( $rec_type, $faa_id, $faa_date, $faa_apt_name, $faa_city, $faa_st, + $faa_state, $faa_region, $id, $faa_len, $faa_wid, $faa_cat, $faa_owner, + $faa_operator, $faa_bearing, $faa_magvar, + $faa_loc_latd, $faa_loc_lats, $faa_loc_lond, $faa_loc_lons, + $faa_stop_dist, $faa_app_dist, + $faa_gs_type, $faa_gs_freq, $faa_gs_latd, $faa_gs_lats, $faa_gs_lond, + $faa_gs_lons, $faa_gs_dist, + $faa_im_type, $faa_im_latd, $faa_im_lats, $faa_im_lond, $faa_im_lons, + $faa_im_dist, + $faa_mm_type, $faa_mm_id, $faa_mm_name, $faa_mm_freq, + $faa_mm_latd, $faa_mm_lats, $faa_mm_lond, $faa_mm_lons, $faa_mm_dist, + $faa_om_type, $faa_om_id, $faa_om_name, $faa_om_freq, + $faa_om_latd, $faa_om_lats, $faa_om_lond, $faa_om_lons, $faa_om_dist, + $faa_om_backcourse); +open( FAA_ILS, "<$faa_ils_file" ) || die "Cannot open $faa_ils_file\n"; + +; # skip header line + +while ( ) { + chomp; + ( $rec_type, $faa_id, $rwy, $type, $faa_date, $faa_apt_name, $faa_city, + $faa_st, $faa_state, $faa_region, $id, $faa_len, $faa_wid, + $faa_cat, $faa_owner, $faa_operator, $faa_bearing, $faa_magvar, + $loc_type, $loc_id, $loc_freq, $faa_loc_latd, $faa_loc_lats, + $faa_loc_lond, $faa_loc_lons, $loc_width, $faa_stop_dist, $faa_app_dist, + $faa_gs_type, $gs_angle, $faa_gs_freq, $faa_gs_latd, $faa_gs_lats, + $faa_gs_lond, $faa_gs_lons, $faa_gs_dist, $gs_elev, + $faa_im_type, $faa_im_latd, $faa_im_lats, $faa_im_lond, $faa_im_lons, + $faa_im_dist, + $faa_mm_type, $faa_mm_id, $faa_mm_name, $faa_mm_freq, + $faa_mm_latd, $faa_mm_lats, $faa_mm_lond, $faa_mm_lons, $faa_mm_dist, + $faa_om_type, $faa_om_id, $faa_om_name, $faa_om_freq, + $faa_om_latd, $faa_om_lats, $faa_om_lond, $faa_om_lons, + $faa_om_dist, $faa_om_backcourse + ) + = $_ =~ m/^(.{4})(.{11})(.{3})(.{10})(.{10})(.{42})(.{26})(.{2})(.{20})(.{3})(.{4})(.{5})(.{4})(.{9})(.{50})(.{50})(.{3})(.{3})(.{15})(.{5})(.{6})(.{14})(.{11})(.{14})(.{11})(.{5})(.{5})(.{6})(.{15})(.{4})(.{6})(.{14})(.{11})(.{14})(.{11})(.{6})(.{7})(.{15})(.{14})(.{11})(.{14})(.{11})(.{6})(.{15})(.{2})(.{5})(.{3})(.{14})(.{11})(.{14})(.{11})(.{6})(.{15})(.{2})(.{5})(.{3})(.{14})(.{11})(.{14})(.{11})(.{6})(.{9})/; + + $loc_hdg = $faa_bearing + make_dmagvar($faa_magvar); + $loc_lat = make_dcoord($faa_loc_lats) / 3600.0; + $loc_lon = make_dcoord($faa_loc_lons) / 3600.0; + $gs_lat = make_dcoord($faa_gs_lats) / 3600.0; + $gs_lon = make_dcoord($faa_gs_lons) / 3600.0; + $im_lat = make_dcoord($faa_im_lats) / 3600.0; + $im_lon = make_dcoord($faa_im_lons) / 3600.0; + $mm_lat = make_dcoord($faa_mm_lats) / 3600.0; + $mm_lon = make_dcoord($faa_mm_lons) / 3600.0; + $om_lat = make_dcoord($faa_om_lats) / 3600.0; + $om_lon = make_dcoord($faa_om_lons) / 3600.0; + + # just hist the start of the next record, dump the current data + $record = sprintf( "I ILS %-4s %-3s %06.2f %-4s %06.2f %10.6f %11.6f ", + $id, $rwy, + $loc_freq, $loc_id, $loc_hdg, $loc_lat, $loc_lon ); + $record .= sprintf( "%5d %5.2f %10.6f %11.6f ", + $gs_elev, $gs_angle, $gs_lat, $gs_lon ); + $record .= sprintf( "%10.6f %11.6f ", $dme_lat, $dme_lon ); + $record .= sprintf( "%10.6f %11.6f ", $om_lat, $om_lon ); + $record .= sprintf( "%10.6f %11.6f ", $mm_lat, $mm_lon ); + $record .= sprintf( "%10.6f %11.6f ", $im_lat, $im_lon ); + if ( $rec_type eq "ILS1" && $ILS{$id . $rwy} eq "" ) { + print "FAA Adding: $id - $rwy $faa_bearing, $faa_magvar - $loc_hdg \n"; + $ILS{$id . $rwy} = $record; + } +} + + +######################################################################## +# Process DAFIFT data +######################################################################## + +# Load the DAFIFT airport file + +open( ARPT, "<$arpt_file" ) || die "Cannot open $arpt_file\n"; + +; # skip header line + +while ( ) { + chomp; + my(@F) = split(/\t/); + my($icao) = $F[3]; + if ( length($icao) < 3 ) { + if ( length( $F[4] ) >= 3 ) { + $icao = $F[4]; + } else { + $icao = "[none]"; + } + } + $Airports{$F[0]} = $icao; + # print "$F[0] - $icao\n"; +} + + +# Load the DAFIFT ils file + +my( $last_id, $last_rwy ) = ("", ""); + +open( DAFIFT_ILS, "<$dafift_ils_file" ) || die "Cannot open $dafift_ils_file\n"; + +; # skip header line + +while ( ) { + chomp; + my @F = split(/\t/); + $id = $F[0]; + $rwy = $F[1]; + if ( $last_id ne "" && ($last_id ne $id || $last_rwy ne $rwy) ) { + # just hist the start of the next record, dump the current data + $record + = sprintf( "I ILS %-4s %-3s %06.2f %-4s %06.2f %10.6f %11.6f ", + $Airports{$last_id}, $last_rwy, + $loc_freq, $loc_id, $loc_hdg, $loc_lat, $loc_lon ); + if ( $has_gs ) { + $record .= sprintf( "%5d %5.2f %10.6f %11.6f ", + $gs_elev, $gs_angle, $gs_lat, $gs_lon ); + } else { + $record .= sprintf( "%5d %5.2f %10.6f %11.6f ", 0, 0, 0, 0 ); + } + if ( $has_dme ) { + $record .= sprintf( "%10.6f %11.6f ", $dme_lat, $dme_lon ); + } else { + $record .= sprintf( "%10.6f %11.6f ", 0, 0 ); + } + if ( $has_om ) { + $record .= sprintf( "%10.6f %11.6f ", $om_lat, $om_lon ); + } else { + $record .= sprintf( "%10.6f %11.6f ", 0, 0 ); + } + if ( $has_mm ) { + $record .= sprintf( "%10.6f %11.6f ", $mm_lat, $mm_lon ); + } else { + $record .= sprintf( "%10.6f %11.6f ", 0, 0 ); + } + if ( $has_im ) { + $record .= sprintf( "%10.6f %11.6f ", $im_lat, $im_lon ); + } else { + $record .= sprintf( "%10.6f %11.6f ", 0, 0 ); + } + if ( $ILS{$Airports{$last_id} . $last_rwy} eq "" ) { + print "DAFIFT Adding: $Airports{$last_id} - $last_rwy\n"; + $ILS{$Airports{$last_id} . $last_rwy} = $record; + } + $has_dme = 0; + $has_gs = 0; + $has_loc = 0; + $has_im = 0; + $has_mm = 0; + $has_om = 0; + } + $type = $F[2]; + if ( $type eq "D" ) { + # DME entry + $has_dme = 1; + $dme_lon = make_dcoord( $F[16] ); + $dme_lat = make_dcoord( $F[14] ); + $dme_elev = $F[10]; + if ( $dme_elev !~ m/\d/ ) { + $dme_elev = ""; + } else { + $dme_elev += 0; + } + $dme_bias = $F[27]; + # print "$id DME $dme_lon $dme_lat $dme_elev $dme_bias\n"; + } elsif ( $type eq "G" ) { + # GlideSlope entry + $has_gs = 1; + $gs_lon = make_dcoord( $F[16] ); + $gs_lat = make_dcoord( $F[14] ); + $gs_elev = $F[10]; + if ( $gs_elev !~ m/\d/ ) { + $gs_elev = ""; + } else { + $gs_elev += 0; + } + $gs_angle = $F[7]; + # print "$id GS $gs_lon $gs_lat $gs_elev $gs_angle\n"; + } elsif ( $type eq "Z" ) { + # Localizer entry + $has_loc = 1; + $loc_lon = make_dcoord( $F[16] ); + $loc_lat = make_dcoord( $F[14] ); + $loc_elev = $F[10]; + if ( $loc_elev !~ m/\d/ ) { + $loc_elev = ""; + } else { + $loc_elev += 0; + } + ($loc_freq) = $F[5] =~ m/(\d\d\d\d\d\d)/; + $loc_freq /= 1000.0; + my( $magvar ) = make_dmagvar( $F[22] ); + # print "mag var = $F[22] (" . $magvar . ")\n"; + $loc_hdg = $F[24] + make_dmagvar( $F[22] ); + $loc_width = $F[25]; + $loc_id = $F[18]; + # print "$id LOC $loc_lon $loc_lat $loc_elev $loc_freq $loc_hdg $loc_width\n"; + } elsif ( $type eq "I" ) { + # Inner marker entry + $has_im = 1; + $im_lon = make_dcoord( $F[16] ); + $im_lat = make_dcoord( $F[14] ); + # print "$id IM $im_lon $im_lat\n"; + } elsif ( $type eq "M" ) { + # Middle marker entry + $has_mm = 1; + $mm_lon = make_dcoord( $F[16] ); + $mm_lat = make_dcoord( $F[14] ); + # print "$id MM $mm_lon $mm_lat\n"; + } elsif ( $type eq "O" ) { + # Outer marker entry + $has_om = 1; + $om_lon = make_dcoord( $F[16] ); + $om_lat = make_dcoord( $F[14] ); + # print "$id OM $om_lon $om_lat\n"; + } + + $last_id = $id; + $last_rwy = $rwy; + # printf("%-5s %10.6f %11.6f\n", $F[0], $F[14], $F[16]); +} + +$record = sprintf( "I ILS %-4s %-3s %06.2f %-4s %06.2f %10.6f %11.6f ", + $Airports{$last_id}, $last_rwy, + $loc_freq, $loc_id, $loc_hdg, $loc_lat, $loc_lon ); +if ( $has_gs ) { + $record .= sprintf( "%5d %5.2f %10.6f %11.6f ", + $gs_elev, $gs_angle, $gs_lat, $gs_lon ); +} else { + $record .= sprintf( "%5d %5.2f %10.6f %11.6f ", 0, 0, 0, 0 ); +} +if ( $has_dme ) { + $record .= sprintf( "%10.6f %11.6f ", $dme_lat, $dme_lon ); +} else { + $record .= sprintf( "%10.6f %11.6f ", 0, 0 ); +} +if ( $has_om ) { + $record .= sprintf( "%10.6f %11.6f ", $om_lat, $om_lon ); +} else { + $record .= sprintf( "%10.6f %11.6f ", 0, 0 ); +} +if ( $has_mm ) { + $record .= sprintf( "%10.6f %11.6f ", $mm_lat, $mm_lon ); +} else { + $record .= sprintf( "%10.6f %11.6f ", 0, 0 ); +} +if ( $has_im ) { + $record .= sprintf( "%10.6f %11.6f ", $im_lat, $im_lon ); +} else { + $record .= sprintf( "%10.6f %11.6f ", 0, 0 ); +} + +if ( $ILS{$Airports{$last_id} . $last_rwy} eq "" ) { + print "DAFIFT Adding: $Airports{$last_id} - $last_rwy\n"; + $ILS{$Airports{$last_id} . $last_rwy} = $record; +} + + +######################################################################## +# Process FlightGear ILS data +######################################################################## + +# Load the FlightGear ils file and fill in any missing ILS approachs + +open( FGILS, "zcat $fgfs_ils_file|" ) || die "Cannot open $fgfs_ils_file\n"; + +; # skip header line + +while ( ) { + chomp; + if ( ! m/\[End\]/ && length($_) > 1 ) { + # print "$_\n"; + my( $type_code, $type_name, $icao, $rwy, $loc_freq, $loc_id, $loc_hdg, + $loc_lat, $loc_lon, $gs_elev, $gs_angle, $gs_lat, $gs_lon, + $dme_lat, $dme_lon, $om_lat, $om_lon, $mm_lat, $mm_lon, + $im_lat, $im_lon ) = split(/\s+/); + if ( $ILS{$icao . $rwy} eq "" ) { + print "X-Plane Adding: $icao $rwy\n"; + $ILS{$icao . $rwy} = $_; + } + } +} + + +# dump out the final results +print "// FlightGear ILS data, generated from DAFIFT ARPT/ILS.TXT\n"; +my($key); +foreach $key ( sort (keys %ILS) ) { + print "$ILS{$key}\n"; +} +print "[End]\n"; + + +sub make_dcoord() { + my($coord) = shift; + my( $dir, $deg, $min, $sec ); + my( $value ); + if ( $coord =~ m/^[WE]/ ) { + ( $dir, $deg, $min, $sec ) + = $coord =~ m/^([EW])(\d\d\d)(\d\d)(\d\d\d\d)/; + $value = $deg + $min/60.0 + ($sec/100)/3600.0; + if ( $dir eq "W" ) { + $value = -$value; + } + } elsif ( $coord =~ m/^[NS]/ ) { + ( $dir, $deg, $min, $sec ) + = $coord =~ m/^([NS])(\d\d)(\d\d)(\d\d\d\d)/; + $value = $deg + $min/60.0 + ($sec/100)/3600.0; + if ( $dir eq "S" ) { + $value = -$value; + } + } elsif ( $coord =~ m/[EW]$/ ) { + ($value, $dir) = m/(\d{6}\.\d{3})(.)/; + if ( $value eq "W" ) { + $value = -$value; + } + } elsif ( $coord =~ m/[NS]$/ ) { + ($value, $dir) = m/(\d{6}\.\d{3})(.)/; + if ( $value eq "S" ) { + $value = -$value; + } + } + # print "$dir $deg:$min:$sec = $value\n"; + return $value; +} + +sub make_dmagvar() { + my( $coord ) = shift; + my( $value ); + if ( $coord =~ m/^[EW]/ ) { + my( $dir, $deg, $min, $date ) + = $coord =~ m/^([EW])(\d\d\d)(\d\d\d) (\d\d\d\d)/; + $value = $deg + ($min/10)/60.0; + if ( $dir eq "W" ) { + $value = -$value; + } + } elsif ( $coord =~ m/[EW]$/ ) { + my( $deg, $dir ) + = $coord =~ m/^(\d\d)([EW])/; + $value = $deg; + if ( $dir eq "W" ) { + $value = -$value; + } + } + # print "$dir $deg:$min = $value\n"; + + return $value; +} + +# end of dafif2fix.pl