Remove one dependence on MetaKit.
This commit is contained in:
parent
b23183f018
commit
6665d7d609
8 changed files with 81 additions and 278 deletions
|
@ -266,23 +266,23 @@ double GetAngleDiff_deg( const double &a1, const double &a2) {
|
|||
// in fg_init.cxx, and are just here temporarily until some rationalisation occurs.
|
||||
// find basic airport location info from airport database
|
||||
bool dclFindAirportID( const string& id, FGAirport *a ) {
|
||||
if ( id.length() ) {
|
||||
SGPath path( globals->get_fg_root() );
|
||||
path.append( "Airports" );
|
||||
path.append( "simple.mk4" );
|
||||
FGAirports airports( path.c_str() );
|
||||
FGAirport result;
|
||||
|
||||
if ( id.length() ) {
|
||||
SG_LOG( SG_GENERAL, SG_INFO, "Searching for airport code = " << id );
|
||||
|
||||
if ( ! airports.search( id, a ) ) {
|
||||
result = globals->get_airports()->search( id );
|
||||
if ( result.id.empty() ) {
|
||||
SG_LOG( SG_GENERAL, SG_ALERT,
|
||||
"Failed to find " << id << " in " << path.str() );
|
||||
"Failed to find " << id << " in simple.apt.gz" );
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
|
||||
*a = result;
|
||||
|
||||
SG_LOG( SG_GENERAL, SG_INFO,
|
||||
"Position for " << id << " is ("
|
||||
<< a->longitude << ", "
|
||||
|
|
|
@ -1,14 +1,11 @@
|
|||
noinst_LIBRARIES = libAirports.a
|
||||
|
||||
noinst_PROGRAMS = gensimple genrunways calc_loc
|
||||
noinst_PROGRAMS = genrunways calc_loc
|
||||
|
||||
libAirports_a_SOURCES = \
|
||||
runways.cxx runways.hxx \
|
||||
simple.cxx simple.hxx
|
||||
|
||||
gensimple_SOURCES = gensimple.cxx
|
||||
gensimple_LDADD = libAirports.a -lsgdebug -lsgmisc -lsgxml -lmk4 -lz
|
||||
|
||||
genrunways_SOURCES = genrunways.cxx
|
||||
genrunways_LDADD = libAirports.a -lsgdebug -lsgmisc -lsgxml -lmk4 -lz
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
//
|
||||
// simple.cxx -- a really simplistic class to manage airport ID,
|
||||
// lat, lon of the center of one of it's runways, and
|
||||
// elevation in feet.
|
||||
// lat, lon of the center of one of it's runways, and
|
||||
// elevation in feet.
|
||||
//
|
||||
// Written by Curtis Olson, started April 1998.
|
||||
//
|
||||
|
@ -35,230 +35,56 @@
|
|||
#include STL_STRING
|
||||
#include STL_FUNCTIONAL
|
||||
#include STL_ALGORITHM
|
||||
#include STL_IOSTREAM
|
||||
|
||||
#include "simple.hxx"
|
||||
|
||||
SG_USING_NAMESPACE(std);
|
||||
|
||||
#ifndef _MSC_VER
|
||||
# define NDEBUG // she don't work without it.
|
||||
#endif
|
||||
#include <mk4.h>
|
||||
#include <mk4str.h>
|
||||
#ifndef _MSC_VER
|
||||
# undef NDEBUG
|
||||
#endif
|
||||
|
||||
#ifdef SG_HAVE_STD_INCLUDES
|
||||
# include <istream>
|
||||
#elif defined( __BORLANDC__ ) || defined (__APPLE__)
|
||||
# include <iostream>
|
||||
#else
|
||||
# include <istream.h>
|
||||
#endif
|
||||
SG_USING_STD(istream);
|
||||
|
||||
|
||||
inline istream&
|
||||
operator >> ( istream& in, FGAirport& a )
|
||||
{
|
||||
return in >> a.id >> a.latitude >> a.longitude >> a.elevation;
|
||||
string junk;
|
||||
in >> junk >> a.id >> a.latitude >> a.longitude >> a.elevation
|
||||
>> a.code;
|
||||
|
||||
char name[256]; // should never be longer than this, right? :-)
|
||||
in.getline( name, 256 );
|
||||
a.name = name;
|
||||
|
||||
return in;
|
||||
}
|
||||
|
||||
|
||||
FGAirports::FGAirports( const string& file ) {
|
||||
// open the specified database readonly
|
||||
storage = new c4_Storage( file.c_str(), false );
|
||||
|
||||
if ( !storage->Strategy().IsValid() ) {
|
||||
SG_LOG( SG_GENERAL, SG_ALERT, "Cannot open file: " << file );
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
vAirport = new c4_View;
|
||||
*vAirport =
|
||||
storage->GetAs("airport[ID:S,Longitude:F,Latitude:F,Elevation:F]");
|
||||
}
|
||||
|
||||
|
||||
// search for the specified id
|
||||
bool
|
||||
FGAirports::search( const string& id, FGAirport* a ) const
|
||||
{
|
||||
c4_StringProp pID ("ID");
|
||||
c4_FloatProp pLon ("Longitude");
|
||||
c4_FloatProp pLat ("Latitude");
|
||||
c4_FloatProp pElev ("Elevation");
|
||||
|
||||
int idx = vAirport->Find(pID[id.c_str()]);
|
||||
SG_LOG( SG_TERRAIN, SG_INFO, "idx = " << idx );
|
||||
|
||||
if ( idx == -1 ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
c4_RowRef r = vAirport->GetAt(idx);
|
||||
a->id = (const char *) pID(r); /// NHV fix wrong case crash
|
||||
a->longitude = (double) pLon(r);
|
||||
a->latitude = (double) pLat(r);
|
||||
a->elevation = (double) pElev(r);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
FGAirport
|
||||
FGAirports::search( const string& id ) const
|
||||
{
|
||||
FGAirport a;
|
||||
search( id, &a );
|
||||
return a;
|
||||
}
|
||||
|
||||
|
||||
// Destructor
|
||||
FGAirports::~FGAirports( void ) {
|
||||
delete storage;
|
||||
}
|
||||
|
||||
|
||||
// Constructor
|
||||
FGAirportsUtil::FGAirportsUtil() {
|
||||
}
|
||||
|
||||
|
||||
// load the data
|
||||
int FGAirportsUtil::load( const string& file ) {
|
||||
FGAirport a;
|
||||
|
||||
airports.erase( airports.begin(), airports.end() );
|
||||
FGAirportList::FGAirportList( const string& file ) {
|
||||
SG_LOG( SG_GENERAL, SG_DEBUG, "Reading simple airport list: " << 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_LOG( SG_GENERAL, SG_ALERT, "Cannot open file: " << file );
|
||||
exit(-1);
|
||||
} else {
|
||||
SG_LOG( SG_GENERAL, SG_ALERT, "opened: " << file );
|
||||
}
|
||||
|
||||
// skip first line of file
|
||||
char tmp[2048];
|
||||
in.getline( tmp, 2048 );
|
||||
// skip header line
|
||||
in >> skipeol;
|
||||
|
||||
// read in each line of the file
|
||||
|
||||
#ifdef __MWERKS__
|
||||
|
||||
in >> ::skipws;
|
||||
char c = 0;
|
||||
while ( in.get(c) && c != '\0' ) {
|
||||
if ( c == 'A' ) {
|
||||
in >> a;
|
||||
SG_LOG( SG_GENERAL, SG_INFO, a.id );
|
||||
in >> skipeol;
|
||||
airports.insert(a);
|
||||
} else if ( c == 'R' ) {
|
||||
in >> skipeol;
|
||||
} else {
|
||||
in >> skipeol;
|
||||
}
|
||||
in >> ::skipws;
|
||||
while ( in ) {
|
||||
FGAirport a;
|
||||
in >> a;
|
||||
airports[a.id] = a;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
in >> ::skipws;
|
||||
string token;
|
||||
while ( ! in.eof() ) {
|
||||
in >> token;
|
||||
if ( token == "A" ) {
|
||||
in >> a;
|
||||
SG_LOG( SG_GENERAL, SG_INFO, "in <- " << a.id );
|
||||
in >> skipeol;
|
||||
airports.insert(a);
|
||||
} else if ( token == "R" ) {
|
||||
in >> skipeol;
|
||||
} else {
|
||||
in >> skipeol;
|
||||
}
|
||||
in >> ::skipws;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
// save the data in gdbm format
|
||||
bool FGAirportsUtil::dump_mk4( const string& file ) {
|
||||
|
||||
// open database for writing
|
||||
c4_Storage storage( file.c_str(), true );
|
||||
|
||||
// need to do something about error handling here!
|
||||
|
||||
// define the properties
|
||||
c4_StringProp pID ("ID");
|
||||
c4_FloatProp pLon ("Longitude");
|
||||
c4_FloatProp pLat ("Latitude");
|
||||
c4_FloatProp pElev ("Elevation");
|
||||
|
||||
// Start with an empty view of the proper structure.
|
||||
c4_View vAirport =
|
||||
storage.GetAs("airport[ID:S,Longitude:F,Latitude:F,Elevation:F]");
|
||||
|
||||
c4_Row row;
|
||||
|
||||
const_iterator current = airports.begin();
|
||||
const_iterator end = airports.end();
|
||||
while ( current != end ) {
|
||||
// add each airport record
|
||||
SG_LOG( SG_TERRAIN, SG_BULK, "out -> " << current->id );
|
||||
pID (row) = current->id.c_str();
|
||||
pLon (row) = current->longitude;
|
||||
pLat (row) = current->latitude;
|
||||
pElev (row) = current->elevation;
|
||||
vAirport.Add(row);
|
||||
|
||||
++current;
|
||||
}
|
||||
|
||||
// commit our changes
|
||||
storage.Commit();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
// search for the specified id
|
||||
bool
|
||||
FGAirportsUtil::search( const string& id, FGAirport* a ) const
|
||||
{
|
||||
const_iterator it = airports.find( FGAirport(id) );
|
||||
if ( it != airports.end() )
|
||||
{
|
||||
*a = *it;
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
FGAirport
|
||||
FGAirportsUtil::search( const string& id ) const
|
||||
{
|
||||
FGAirport a;
|
||||
this->search( id, &a );
|
||||
return a;
|
||||
FGAirport FGAirportList::search( const string& id) {
|
||||
return airports[id];
|
||||
}
|
||||
|
||||
|
||||
// Destructor
|
||||
FGAirportsUtil::~FGAirportsUtil( void ) {
|
||||
FGAirportList::~FGAirportList( void ) {
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -23,8 +23,8 @@
|
|||
// $Id$
|
||||
|
||||
|
||||
#ifndef _SIMPLE_HXX
|
||||
#define _SIMPLE_HXX
|
||||
#ifndef _FG_SIMPLE_HXX
|
||||
#define _FG_SIMPLE_HXX
|
||||
|
||||
|
||||
#ifndef __cplusplus
|
||||
|
@ -39,17 +39,23 @@
|
|||
#include <simgear/compiler.h>
|
||||
|
||||
#include STL_STRING
|
||||
#include <set>
|
||||
|
||||
// Forward declarations.
|
||||
class c4_Storage;
|
||||
class c4_View;
|
||||
#include <map>
|
||||
|
||||
SG_USING_STD(string);
|
||||
SG_USING_STD(set);
|
||||
SG_USING_STD(map);
|
||||
|
||||
|
||||
class FGAirport {
|
||||
|
||||
public:
|
||||
|
||||
string id;
|
||||
double longitude;
|
||||
double latitude;
|
||||
double elevation;
|
||||
string code;
|
||||
string name;
|
||||
|
||||
public:
|
||||
|
||||
FGAirport( const string& name = "",
|
||||
|
@ -62,76 +68,35 @@ public:
|
|||
return id < a.id;
|
||||
}
|
||||
|
||||
public:
|
||||
|
||||
string id;
|
||||
double longitude;
|
||||
double latitude;
|
||||
double elevation;
|
||||
|
||||
};
|
||||
|
||||
typedef map < string, FGAirport > airport_map;
|
||||
typedef airport_map::iterator airport_map_iterator;
|
||||
typedef airport_map::const_iterator const_airport_map_iterator;
|
||||
|
||||
class FGAirports {
|
||||
|
||||
class FGAirportList {
|
||||
|
||||
private:
|
||||
|
||||
c4_Storage *storage;
|
||||
c4_View *vAirport;
|
||||
airport_map airports;
|
||||
|
||||
public:
|
||||
|
||||
// Constructor
|
||||
FGAirports( const string& file );
|
||||
FGAirportList( const string& file );
|
||||
|
||||
// Destructor
|
||||
~FGAirports();
|
||||
~FGAirportList();
|
||||
|
||||
// search for the specified id.
|
||||
// Returns true if successful, otherwise returns false.
|
||||
// On success, airport data is returned thru "airport" pointer.
|
||||
// "airport" is not changed if "apt" is not found.
|
||||
bool search( const string& id, FGAirport* airport ) const;
|
||||
FGAirport search( const string& id ) const;
|
||||
FGAirport search( const string& id );
|
||||
};
|
||||
|
||||
|
||||
class FGAirportsUtil {
|
||||
public:
|
||||
#ifdef SG_NO_DEFAULT_TEMPLATE_ARGS
|
||||
typedef set< FGAirport, less< FGAirport > > container;
|
||||
#else
|
||||
typedef set< FGAirport > container;
|
||||
#endif
|
||||
typedef container::iterator iterator;
|
||||
typedef container::const_iterator const_iterator;
|
||||
|
||||
private:
|
||||
container airports;
|
||||
|
||||
public:
|
||||
|
||||
// Constructor
|
||||
FGAirportsUtil();
|
||||
|
||||
// Destructor
|
||||
~FGAirportsUtil();
|
||||
|
||||
// load the data
|
||||
int load( const string& file );
|
||||
|
||||
// save the data in metakit format
|
||||
bool dump_mk4( const string& file );
|
||||
|
||||
// search for the specified id.
|
||||
// Returns true if successful, otherwise returns false.
|
||||
// On success, airport data is returned thru "airport" pointer.
|
||||
// "airport" is not changed if "id" is not found.
|
||||
bool search( const string& id, FGAirport* airport ) const;
|
||||
FGAirport search( const string& id ) const;
|
||||
};
|
||||
|
||||
|
||||
#endif // _SIMPLE_HXX
|
||||
#endif // _FG_SIMPLE_HXX
|
||||
|
||||
|
||||
|
|
|
@ -99,7 +99,7 @@ fgfs_LDADD = \
|
|||
$(top_builddir)/src/Systems/libSystems.a \
|
||||
$(top_builddir)/src/Time/libTime.a \
|
||||
$(WEATHER_LIBS) \
|
||||
-lsgroute -lsgsky -lsgsound -lsgephem -lsgmaterial -lsgtgdb -lsgmodel \
|
||||
-lsgroute -lsgclouds3d -lsgsky -lsgsound -lsgephem -lsgmaterial -lsgtgdb -lsgmodel \
|
||||
-lsgtiming -lsgio -lsgscreen -lsgmath -lsgbucket -lsgprops -lsgdebug \
|
||||
-lsgmagvar -lsgmisc -lsgxml -lsgsound -lsgserial $(CLOUD3D_LIBS) \
|
||||
$(THREAD_LIBS) \
|
||||
|
|
|
@ -556,23 +556,23 @@ bool fgInitConfig ( int argc, char **argv ) {
|
|||
|
||||
// find basic airport location info from airport database
|
||||
bool fgFindAirportID( const string& id, FGAirport *a ) {
|
||||
FGAirport result;
|
||||
if ( id.length() ) {
|
||||
SGPath path( globals->get_fg_root() );
|
||||
path.append( "Airports" );
|
||||
path.append( "simple.mk4" );
|
||||
FGAirports airports( path.c_str() );
|
||||
|
||||
SG_LOG( SG_GENERAL, SG_INFO, "Searching for airport code = " << id );
|
||||
|
||||
if ( ! airports.search( id, a ) ) {
|
||||
result = globals->get_airports()->search( id );
|
||||
|
||||
if ( result.id.empty() ) {
|
||||
SG_LOG( SG_GENERAL, SG_ALERT,
|
||||
"Failed to find " << id << " in " << path.str() );
|
||||
"Failed to find " << id << " in simple.apt.gz" );
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
|
||||
*a = result;
|
||||
|
||||
SG_LOG( SG_GENERAL, SG_INFO,
|
||||
"Position for " << id << " is ("
|
||||
<< a->longitude << ", "
|
||||
|
@ -943,11 +943,18 @@ static bool fgSetPosFromFix( const string& id ) {
|
|||
|
||||
|
||||
/**
|
||||
* Initialize vor/ndb/ils/fix list management and query systems
|
||||
* Initialize vor/ndb/ils/fix list management and query systems (as
|
||||
* well as simple airport db list)
|
||||
*/
|
||||
bool
|
||||
fgInitNav ()
|
||||
{
|
||||
SG_LOG(SG_GENERAL, SG_INFO, "Loading Simple Airport List");
|
||||
SGPath p_simple( globals->get_fg_root() );
|
||||
p_simple.append( "Airports/simple.apt" );
|
||||
FGAirportList *airports = new FGAirportList( p_simple.str() );
|
||||
globals->set_airports( airports );
|
||||
|
||||
SG_LOG(SG_GENERAL, SG_INFO, "Loading Navaids");
|
||||
|
||||
SG_LOG(SG_GENERAL, SG_INFO, " VOR/NDB");
|
||||
|
|
|
@ -57,6 +57,7 @@ FGGlobals::FGGlobals() :
|
|||
route( NULL ),
|
||||
current_panel( NULL ),
|
||||
soundmgr( NULL ),
|
||||
airports( NULL ),
|
||||
ATC_mgr( NULL ),
|
||||
ATC_display( NULL ),
|
||||
AI_mgr( NULL ),
|
||||
|
|
|
@ -59,6 +59,7 @@ class SGRoute;
|
|||
class SGTime;
|
||||
class SGSoundMgr;
|
||||
|
||||
class FGAirportList;
|
||||
class FGAIMgr;
|
||||
class FGATCMgr;
|
||||
class FGATCDisplay;
|
||||
|
@ -134,6 +135,9 @@ private:
|
|||
// sound manager
|
||||
SGSoundMgr *soundmgr;
|
||||
|
||||
// Simple Airport List
|
||||
FGAirportList *airports;
|
||||
|
||||
// ATC manager
|
||||
FGATCMgr *ATC_mgr;
|
||||
|
||||
|
@ -240,6 +244,9 @@ public:
|
|||
inline SGRoute *get_route() const { return route; }
|
||||
inline void set_route( SGRoute *r ) { route = r; }
|
||||
|
||||
inline FGAirportList *get_airports() const { return airports; }
|
||||
inline void set_airports( FGAirportList *a ) {airports = a; }
|
||||
|
||||
inline FGATCMgr *get_ATC_mgr() const { return ATC_mgr; }
|
||||
inline void set_ATC_mgr( FGATCMgr *a ) {ATC_mgr = a; }
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue