X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FNavaids%2Ffixlist.cxx;h=50c06ac563c804bb99eda19862fc2921386b20ac;hb=37591d0ac9c316f107a3c38043edd3a7f89b4892;hp=2749cf22c6fad62362b590a03a85712212f466b3;hpb=d8f5529d217c3710bcece9244f1f41cfb8550669;p=flightgear.git diff --git a/src/Navaids/fixlist.cxx b/src/Navaids/fixlist.cxx index 2749cf22c..50c06ac56 100644 --- a/src/Navaids/fixlist.cxx +++ b/src/Navaids/fixlist.cxx @@ -29,13 +29,18 @@ #include #include +#include #include #include "fixlist.hxx" -#include "Airports/simple.hxx" - -using std::pair; +#include +#include +FGFix::FGFix(const std::string& aIdent, const SGGeod& aPos) : + FGPositioned(FIX, aIdent, aPos) +{ + init(true); // init FGPositioned +} // Constructor FGFixList::FGFixList( void ) { @@ -48,9 +53,7 @@ FGFixList::~FGFixList( void ) { // load the navaids and build the map -bool FGFixList::init( SGPath path ) { - fixlist.erase( fixlist.begin(), fixlist.end() ); - +bool FGFixList::init(const SGPath& path ) { sg_gzifstream in( path.str() ); if ( !in.is_open() ) { SG_LOG( SG_GENERAL, SG_ALERT, "Cannot open file: " << path.str() ); @@ -63,106 +66,15 @@ bool FGFixList::init( SGPath path ) { // read in each remaining line of the file while ( ! in.eof() ) { - - FGFix fix; - in >> fix; - if ( fix.get_lat() > 95.0 ) { - break; - } - - /* cout << "ident=" << fix.get_ident() - << ", lat=" << fix.get_lat() - << ", lon=" << fix.get_lon() << endl; */ - - fixlist.insert(pair(fix.get_ident(), fix)); - in >> skipcomment; + double lat, lon; + std::string ident; + in >> lat >> lon >> ident; + if (lat > 95) break; + + // fix gets added to the FGPositioned spatial indices, so we don't need + // to hold onto it here. + new FGFix(ident, SGGeod::fromDeg(lon, lat)); + 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 ) -{ - 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) -{ - fix_map_iterator itr = fixlist.find(ident); - if (itr == fixlist.end()) { - return NULL; - } - - return &itr->second; -} - -class orderingFunctor -{ -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); - } - -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); - } - - if (itr == fixlist.end()) { - return NULL; - } - - return &itr->second; -}