X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FNavaids%2Ffixlist.cxx;h=2dc8806eab1dfaacb45ea7c1790c7a441b031bf6;hb=6bf47cd248ed388e6a4dd3ffa2d00977b00b62fb;hp=b189613e247359faddac886eb978be4e8b15f778;hpb=3b486e1aeecce210ea3f4772617fe6eeed8f6c9e;p=flightgear.git diff --git a/src/Navaids/fixlist.cxx b/src/Navaids/fixlist.cxx index b189613e2..2dc8806ea 100644 --- a/src/Navaids/fixlist.cxx +++ b/src/Navaids/fixlist.cxx @@ -29,148 +29,47 @@ #include #include +#include #include #include "fixlist.hxx" -#include "Navaids/fix.hxx" -#include "Airports/simple.hxx" +#include +#include -FGFix::FGFix(const std::string& aIdent, const SGGeod& aPos) : - FGPositioned(FIX, aIdent, aPos) +FGFix::FGFix(PositionedID aGuid, const std::string& aIdent, const SGGeod& aPos) : + FGPositioned(aGuid, FIX, aIdent, aPos) { } -// Constructor -FGFixList::FGFixList( void ) { -} - - -// Destructor -FGFixList::~FGFixList( void ) { -} - - -// load the navaids and build the map -bool FGFixList::init( SGPath path ) { - fixlist.erase( fixlist.begin(), fixlist.end() ); - - sg_gzifstream in( path.str() ); - if ( !in.is_open() ) { - SG_LOG( SG_GENERAL, SG_ALERT, "Cannot open file: " << path.str() ); - exit(-1); - } - - // toss the first two lines of the file - in >> skipeol; - in >> skipeol; - - // read in each remaining line of the file - while ( ! in.eof() ) { - double lat, lon; - string ident; - in >> lat >> lon >> ident; - if (lat > 95) break; - - FGFix* fix = new FGFix(ident, SGGeod::fromDeg(lon, lat)); - fixlist.insert(std::make_pair(fix->ident(), fix)); - in >> skipcomment; - } - return true; -} - - -// query the database for the specified fix, lon and lat are in -// degrees, elev is in meters -bool FGFixList::query( const string& ident, FGFix* &fix ) { - fix_map_const_iterator it = fixlist.find(ident); - if ( it != fixlist.end() ) { - fix = it->second; - return true; - } else { - return false; - } -} - - -// query the database for the specified fix, lon and lat are in -// degrees, elev is in meters -bool FGFixList::query_and_offset( const string& ident, double lon, double lat, - double elev, FGFix* &fix, double *heading, - double *dist ) -{ - std::pair range = fixlist.equal_range(ident); - - if (range.first == range.second) { - return false; - } - double min_s = -1.0; - for (fix_map_const_iterator current = range.first; current != range.second; ++current) { - double az1, az2, s; - geo_inverse_wgs_84( elev, lat, lon, - current->second->get_lat(), current->second->get_lon(), - &az1, &az2, &s ); - // cout << " dist = " << s << endl; - if (min_s < 0 || s < min_s) { - *heading = az2; - *dist = s; - min_s = s; - fix = current->second; - } - } - - return true; -} - -const FGFix* FGFixList::search(const string& ident) +namespace flightgear { - fix_map_iterator itr = fixlist.find(ident); - if (itr == fixlist.end()) { - return NULL; - } - return itr->second; -} - -class orderingFunctor +void loadFixes(const SGPath& path) { -public: - orderingFunctor(FGIdentOrdering* aOrder) : - mOrdering(aOrder) - { assert(aOrder); } - - bool operator()(const fix_map_type::value_type& aA, const std::string& aB) const - { - return mOrdering->compare(aA.first,aB); - } - - bool operator()(const std::string& aA, const fix_map_type::value_type& aB) const - { - return mOrdering->compare(aA, aB.first); - } - - bool operator()(const fix_map_type::value_type& aA, const fix_map_type::value_type& aB) const - { - return mOrdering->compare(aA.first, aB.first); + sg_gzifstream in( path.str() ); + if ( !in.is_open() ) { + SG_LOG( SG_NAVAID, SG_ALERT, "Cannot open file: " << path.str() ); + exit(-1); } -private: - FGIdentOrdering* mOrdering; -}; - -const FGFix* FGFixList::findFirstByIdent( const string& ident, FGIdentOrdering* aOrder) -{ - fix_map_iterator itr; - if (aOrder) { - orderingFunctor func(aOrder); - itr = std::lower_bound(fixlist.begin(),fixlist.end(), ident, func); - } else { - itr = fixlist.lower_bound(ident); - } + // toss the first two lines of the file + in >> skipeol; + in >> skipeol; - if (itr == fixlist.end()) { - return NULL; - } + NavDataCache* cache = NavDataCache::instance(); - return itr->second; + // read in each remaining line of the file + while ( ! in.eof() ) { + double lat, lon; + std::string ident; + in >> lat >> lon >> ident; + if (lat > 95) break; + + cache->insertFix(ident, SGGeod::fromDeg(lon, lat)); + in >> skipcomment; + } + } + +} // of namespace flightgear;