3 ########################################################################
4 # Convert DAFIFT ARPT/ILS.TXT to FlightGear format.
5 ########################################################################
9 my($faa_ils_file) = shift(@ARGV);
10 my($arpt_file) = shift(@ARGV);
11 my($dafift_ils_file) = shift(@ARGV);
12 my($fgfs_ils_file) = shift(@ARGV);
15 "<faa_ils_file> <dafift_arpt_file> <dafift_ils_file> <fgfs_ils_file>\n"
16 if !defined($faa_ils_file) || !defined($arpt_file)
17 || !defined($dafift_ils_file) || !defined($fgfs_ils_file);
23 my( $id, $rwy, $type );
24 my( $has_dme, $has_gs, $has_loc, $has_im, $has_mm, $has_om );
25 my( $dme_lon, $dme_lat, $dme_elev, $dme_bias );
26 my( $gs_lon, $gs_lat, $gs_elev, $gs_angle );
27 my( $loc_type, $loc_lon, $loc_lat, $loc_elev, $loc_freq, $loc_hdg, $loc_width,
29 my( $im_lon, $im_lat, $mm_lon, $mm_lat, $om_lon, $om_lat );
32 ########################################################################
34 ########################################################################
36 # Load the DAFIFT ils file
38 my( $rec_type, $faa_id, $faa_date, $faa_apt_name, $faa_city, $faa_st,
39 $faa_state, $faa_region, $id, $faa_len, $faa_wid, $faa_cat, $faa_owner,
40 $faa_operator, $faa_bearing, $faa_magvar,
41 $faa_loc_latd, $faa_loc_lats, $faa_loc_lond, $faa_loc_lons,
42 $faa_stop_dist, $faa_app_dist,
43 $faa_gs_type, $faa_gs_freq, $faa_gs_latd, $faa_gs_lats, $faa_gs_lond,
44 $faa_gs_lons, $faa_gs_dist,
45 $faa_im_type, $faa_im_latd, $faa_im_lats, $faa_im_lond, $faa_im_lons,
47 $faa_mm_type, $faa_mm_id, $faa_mm_name, $faa_mm_freq,
48 $faa_mm_latd, $faa_mm_lats, $faa_mm_lond, $faa_mm_lons, $faa_mm_dist,
49 $faa_om_type, $faa_om_id, $faa_om_name, $faa_om_freq,
50 $faa_om_latd, $faa_om_lats, $faa_om_lond, $faa_om_lons, $faa_om_dist,
52 open( FAA_ILS, "<$faa_ils_file" ) || die "Cannot open $faa_ils_file\n";
54 <FAA_ILS>; # skip header line
58 ( $rec_type, $faa_id, $rwy, $type, $faa_date, $faa_apt_name, $faa_city,
59 $faa_st, $faa_state, $faa_region, $id, $faa_len, $faa_wid,
60 $faa_cat, $faa_owner, $faa_operator, $faa_bearing, $faa_magvar,
61 $loc_type, $loc_id, $loc_freq, $faa_loc_latd, $faa_loc_lats,
62 $faa_loc_lond, $faa_loc_lons, $loc_width, $faa_stop_dist, $faa_app_dist,
63 $faa_gs_type, $gs_angle, $faa_gs_freq, $faa_gs_latd, $faa_gs_lats,
64 $faa_gs_lond, $faa_gs_lons, $faa_gs_dist, $gs_elev,
65 $faa_im_type, $faa_im_latd, $faa_im_lats, $faa_im_lond, $faa_im_lons,
67 $faa_mm_type, $faa_mm_id, $faa_mm_name, $faa_mm_freq,
68 $faa_mm_latd, $faa_mm_lats, $faa_mm_lond, $faa_mm_lons, $faa_mm_dist,
69 $faa_om_type, $faa_om_id, $faa_om_name, $faa_om_freq,
70 $faa_om_latd, $faa_om_lats, $faa_om_lond, $faa_om_lons,
71 $faa_om_dist, $faa_om_backcourse
73 = $_ =~ 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})/;
75 $loc_hdg = $faa_bearing + make_dmagvar($faa_magvar);
76 $loc_lat = make_dcoord($faa_loc_lats) / 3600.0;
77 $loc_lon = make_dcoord($faa_loc_lons) / 3600.0;
78 $gs_lat = make_dcoord($faa_gs_lats) / 3600.0;
79 $gs_lon = make_dcoord($faa_gs_lons) / 3600.0;
80 $im_lat = make_dcoord($faa_im_lats) / 3600.0;
81 $im_lon = make_dcoord($faa_im_lons) / 3600.0;
82 $mm_lat = make_dcoord($faa_mm_lats) / 3600.0;
83 $mm_lon = make_dcoord($faa_mm_lons) / 3600.0;
84 $om_lat = make_dcoord($faa_om_lats) / 3600.0;
85 $om_lon = make_dcoord($faa_om_lons) / 3600.0;
87 # just hist the start of the next record, dump the current data
88 $record = sprintf( "I ILS %-4s %-3s %06.2f %-4s %06.2f %10.6f %11.6f ",
90 $loc_freq, $loc_id, $loc_hdg, $loc_lat, $loc_lon );
91 $record .= sprintf( "%5d %5.2f %10.6f %11.6f ",
92 $gs_elev, $gs_angle, $gs_lat, $gs_lon );
93 $record .= sprintf( "%10.6f %11.6f ", $dme_lat, $dme_lon );
94 $record .= sprintf( "%10.6f %11.6f ", $om_lat, $om_lon );
95 $record .= sprintf( "%10.6f %11.6f ", $mm_lat, $mm_lon );
96 $record .= sprintf( "%10.6f %11.6f ", $im_lat, $im_lon );
97 if ( $rec_type eq "ILS1" && $ILS{$id . $rwy} eq "" ) {
98 print "FAA Adding: $id - $rwy $faa_bearing, $faa_magvar - $loc_hdg \n";
99 $ILS{$id . $rwy} = $record;
104 ########################################################################
105 # Process DAFIFT data
106 ########################################################################
108 # Load the DAFIFT airport file
110 open( ARPT, "<$arpt_file" ) || die "Cannot open $arpt_file\n";
112 <ARPT>; # skip header line
116 my(@F) = split(/\t/);
118 if ( length($icao) < 3 ) {
119 if ( length( $F[4] ) >= 3 ) {
125 $Airports{$F[0]} = $icao;
126 # print "$F[0] - $icao\n";
130 # Load the DAFIFT ils file
132 my( $last_id, $last_rwy ) = ("", "");
134 open( DAFIFT_ILS, "<$dafift_ils_file" ) || die "Cannot open $dafift_ils_file\n";
136 <DAFIFT_ILS>; # skip header line
138 while ( <DAFIFT_ILS> ) {
143 if ( $last_id ne "" && ($last_id ne $id || $last_rwy ne $rwy) ) {
144 # just hist the start of the next record, dump the current data
146 = sprintf( "I ILS %-4s %-3s %06.2f %-4s %06.2f %10.6f %11.6f ",
147 $Airports{$last_id}, $last_rwy,
148 $loc_freq, $loc_id, $loc_hdg, $loc_lat, $loc_lon );
150 $record .= sprintf( "%5d %5.2f %10.6f %11.6f ",
151 $gs_elev, $gs_angle, $gs_lat, $gs_lon );
153 $record .= sprintf( "%5d %5.2f %10.6f %11.6f ", 0, 0, 0, 0 );
156 $record .= sprintf( "%10.6f %11.6f ", $dme_lat, $dme_lon );
158 $record .= sprintf( "%10.6f %11.6f ", 0, 0 );
161 $record .= sprintf( "%10.6f %11.6f ", $om_lat, $om_lon );
163 $record .= sprintf( "%10.6f %11.6f ", 0, 0 );
166 $record .= sprintf( "%10.6f %11.6f ", $mm_lat, $mm_lon );
168 $record .= sprintf( "%10.6f %11.6f ", 0, 0 );
171 $record .= sprintf( "%10.6f %11.6f ", $im_lat, $im_lon );
173 $record .= sprintf( "%10.6f %11.6f ", 0, 0 );
175 if ( $ILS{$Airports{$last_id} . $last_rwy} eq "" ) {
176 print "DAFIFT Adding: $Airports{$last_id} - $last_rwy\n";
177 $ILS{$Airports{$last_id} . $last_rwy} = $record;
187 if ( $type eq "D" ) {
190 $dme_lon = make_dcoord( $F[16] );
191 $dme_lat = make_dcoord( $F[14] );
193 if ( $dme_elev !~ m/\d/ ) {
199 # print "$id DME $dme_lon $dme_lat $dme_elev $dme_bias\n";
200 } elsif ( $type eq "G" ) {
203 $gs_lon = make_dcoord( $F[16] );
204 $gs_lat = make_dcoord( $F[14] );
206 if ( $gs_elev !~ m/\d/ ) {
212 # print "$id GS $gs_lon $gs_lat $gs_elev $gs_angle\n";
213 } elsif ( $type eq "Z" ) {
216 $loc_lon = make_dcoord( $F[16] );
217 $loc_lat = make_dcoord( $F[14] );
219 if ( $loc_elev !~ m/\d/ ) {
224 ($loc_freq) = $F[5] =~ m/(\d\d\d\d\d\d)/;
226 my( $magvar ) = make_dmagvar( $F[22] );
227 # print "mag var = $F[22] (" . $magvar . ")\n";
228 $loc_hdg = $F[24] + make_dmagvar( $F[22] );
231 # print "$id LOC $loc_lon $loc_lat $loc_elev $loc_freq $loc_hdg $loc_width\n";
232 } elsif ( $type eq "I" ) {
235 $im_lon = make_dcoord( $F[16] );
236 $im_lat = make_dcoord( $F[14] );
237 # print "$id IM $im_lon $im_lat\n";
238 } elsif ( $type eq "M" ) {
239 # Middle marker entry
241 $mm_lon = make_dcoord( $F[16] );
242 $mm_lat = make_dcoord( $F[14] );
243 # print "$id MM $mm_lon $mm_lat\n";
244 } elsif ( $type eq "O" ) {
247 $om_lon = make_dcoord( $F[16] );
248 $om_lat = make_dcoord( $F[14] );
249 # print "$id OM $om_lon $om_lat\n";
254 # printf("%-5s %10.6f %11.6f\n", $F[0], $F[14], $F[16]);
257 $record = sprintf( "I ILS %-4s %-3s %06.2f %-4s %06.2f %10.6f %11.6f ",
258 $Airports{$last_id}, $last_rwy,
259 $loc_freq, $loc_id, $loc_hdg, $loc_lat, $loc_lon );
261 $record .= sprintf( "%5d %5.2f %10.6f %11.6f ",
262 $gs_elev, $gs_angle, $gs_lat, $gs_lon );
264 $record .= sprintf( "%5d %5.2f %10.6f %11.6f ", 0, 0, 0, 0 );
267 $record .= sprintf( "%10.6f %11.6f ", $dme_lat, $dme_lon );
269 $record .= sprintf( "%10.6f %11.6f ", 0, 0 );
272 $record .= sprintf( "%10.6f %11.6f ", $om_lat, $om_lon );
274 $record .= sprintf( "%10.6f %11.6f ", 0, 0 );
277 $record .= sprintf( "%10.6f %11.6f ", $mm_lat, $mm_lon );
279 $record .= sprintf( "%10.6f %11.6f ", 0, 0 );
282 $record .= sprintf( "%10.6f %11.6f ", $im_lat, $im_lon );
284 $record .= sprintf( "%10.6f %11.6f ", 0, 0 );
287 if ( $ILS{$Airports{$last_id} . $last_rwy} eq "" ) {
288 print "DAFIFT Adding: $Airports{$last_id} - $last_rwy\n";
289 $ILS{$Airports{$last_id} . $last_rwy} = $record;
293 ########################################################################
294 # Process FlightGear ILS data
295 ########################################################################
297 # Load the FlightGear ils file and fill in any missing ILS approachs
299 open( FGILS, "zcat $fgfs_ils_file|" ) || die "Cannot open $fgfs_ils_file\n";
301 <FGILS>; # skip header line
305 if ( ! m/\[End\]/ && length($_) > 1 ) {
307 my( $type_code, $type_name, $icao, $rwy, $loc_freq, $loc_id, $loc_hdg,
308 $loc_lat, $loc_lon, $gs_elev, $gs_angle, $gs_lat, $gs_lon,
309 $dme_lat, $dme_lon, $om_lat, $om_lon, $mm_lat, $mm_lon,
310 $im_lat, $im_lon ) = split(/\s+/);
311 if ( $ILS{$icao . $rwy} eq "" ) {
312 print "X-Plane Adding: $icao $rwy\n";
313 $ILS{$icao . $rwy} = $_;
319 # dump out the final results
320 print "// FlightGear ILS data, generated from DAFIFT ARPT/ILS.TXT\n";
322 foreach $key ( sort (keys %ILS) ) {
323 print "$ILS{$key}\n";
330 my( $dir, $deg, $min, $sec );
332 if ( $coord =~ m/^[WE]/ ) {
333 ( $dir, $deg, $min, $sec )
334 = $coord =~ m/^([EW])(\d\d\d)(\d\d)(\d\d\d\d)/;
335 $value = $deg + $min/60.0 + ($sec/100)/3600.0;
339 } elsif ( $coord =~ m/^[NS]/ ) {
340 ( $dir, $deg, $min, $sec )
341 = $coord =~ m/^([NS])(\d\d)(\d\d)(\d\d\d\d)/;
342 $value = $deg + $min/60.0 + ($sec/100)/3600.0;
346 } elsif ( $coord =~ m/[EW]$/ ) {
347 ($value, $dir) = m/(\d{6}\.\d{3})(.)/;
348 if ( $value eq "W" ) {
351 } elsif ( $coord =~ m/[NS]$/ ) {
352 ($value, $dir) = m/(\d{6}\.\d{3})(.)/;
353 if ( $value eq "S" ) {
357 # print "$dir $deg:$min:$sec = $value\n";
362 my( $coord ) = shift;
364 if ( $coord =~ m/^[EW]/ ) {
365 my( $dir, $deg, $min, $date )
366 = $coord =~ m/^([EW])(\d\d\d)(\d\d\d) (\d\d\d\d)/;
367 $value = $deg + ($min/10)/60.0;
371 } elsif ( $coord =~ m/[EW]$/ ) {
373 = $coord =~ m/^(\d\d)([EW])/;
379 # print "$dir $deg:$min = $value\n";
384 # end of dafif2fix.pl