From 31e563c2a4a55bfba4ecdcd9471a99429d6708f4 Mon Sep 17 00:00:00 2001 From: curt Date: Mon, 23 Feb 2004 18:25:29 +0000 Subject: [PATCH] A first stab at limiting the noaa.gov query to only valid stations. There are many recognized limitations and inefficiencies with this entire approach, however, it's a quick and dirty way to get something working, where before we didn't. --- src/Airports/simple.cxx | 54 ++++++++++++++++++++++++++++++++--------- src/Airports/simple.hxx | 2 +- src/Main/fg_init.cxx | 4 ++- 3 files changed, 46 insertions(+), 14 deletions(-) diff --git a/src/Airports/simple.cxx b/src/Airports/simple.cxx index e27946169..a0fd2aecf 100644 --- a/src/Airports/simple.cxx +++ b/src/Airports/simple.cxx @@ -54,35 +54,65 @@ operator >> ( istream& in, FGAirport& a ) in.getline( name, 256 ); a.name = name; - // a.has_metar = true; // assume true - // only airports with four-letter codes can have metar stations + a.has_metar = false; + +#if 0 + // As a quick seed for the has_metar value, only airports with + // four-letter codes can have metar stations a.has_metar = (isalpha(a.id[0]) && isalpha(a.id[1]) && isalpha(a.id[2]) && isalpha(a.id[3]) && !a.id[4]); +#endif return in; } -FGAirportList::FGAirportList( const string& file ) { - SG_LOG( SG_GENERAL, SG_DEBUG, "Reading simple airport list: " << file ); +FGAirportList::FGAirportList( const string &airport_file, + const string &metar_file ) { + SG_LOG( SG_GENERAL, SG_INFO, "Reading simple airport list: " + << airport_file ); // open the specified file for reading - sg_gzifstream in( file ); - if ( !in.is_open() ) { - SG_LOG( SG_GENERAL, SG_ALERT, "Cannot open file: " << file ); + sg_gzifstream apt_in( airport_file ); + if ( !apt_in.is_open() ) { + SG_LOG( SG_GENERAL, SG_ALERT, "Cannot open file: " << airport_file ); exit(-1); } // skip header line - in >> skipeol; + apt_in >> skipeol; FGAirport a; - int size = 0; - while ( in ) { - in >> a; + while ( apt_in ) { + apt_in >> a; airports_by_id[a.id] = a; airports_array.push_back( &airports_by_id[a.id] ); - size++; + } + + + SG_LOG( SG_GENERAL, SG_INFO, "Reading simple metar station list: " + << metar_file ); + + // open the specified file for reading + sg_gzifstream metar_in( metar_file ); + if ( !metar_in.is_open() ) { + SG_LOG( SG_GENERAL, SG_ALERT, "Cannot open file: " << metar_file ); + } + + string ident; + while ( metar_in ) { + metar_in >> ident; + if ( ident == "#" || ident == "//" ) { + metar_in >> skipeol; + } else { + airport_map_iterator apt = airports_by_id.find( ident ); + if ( apt == airports_by_id.end() ) { + SG_LOG( SG_GENERAL, SG_DEBUG, "no apt = " << ident ); + } else { + SG_LOG( SG_GENERAL, SG_DEBUG, "metar = " << ident ); + airports_by_id[ident].has_metar = true; + } + } } } diff --git a/src/Airports/simple.hxx b/src/Airports/simple.hxx index 7d3372ecb..9b98f97a4 100644 --- a/src/Airports/simple.hxx +++ b/src/Airports/simple.hxx @@ -75,7 +75,7 @@ private: public: // Constructor - FGAirportList( const string& file ); + FGAirportList( const string &airport_file, const string &metar_file ); // Destructor ~FGAirportList(); diff --git a/src/Main/fg_init.cxx b/src/Main/fg_init.cxx index 869134735..d2ff2eea2 100644 --- a/src/Main/fg_init.cxx +++ b/src/Main/fg_init.cxx @@ -1009,7 +1009,9 @@ fgInitNav () SG_LOG(SG_GENERAL, SG_INFO, "Loading Simple Airport List"); SGPath p_simple( globals->get_fg_root() ); p_simple.append( "Airports/basic.dat" ); - FGAirportList *airports = new FGAirportList( p_simple.str() ); + SGPath p_metar( globals->get_fg_root() ); + p_metar.append( "Airports/metar.dat" ); + FGAirportList *airports = new FGAirportList(p_simple.str(), p_metar.str()); globals->set_airports( airports ); SG_LOG(SG_GENERAL, SG_INFO, "Loading Runway List"); -- 2.39.5