1
0
Fork 0
flightgear/src/Airports/simple.hxx

210 lines
6.4 KiB
C++
Raw Normal View History

// simple.hxx -- a really simplistic class to manage airport ID,
// lat, lon of the center of one of it's runways, and
1998-08-25 17:19:13 +00:00
// elevation in feet.
//
// Written by Curtis Olson, started April 1998.
// Updated by Durk Talsma, started December 2004.
1998-08-25 17:19:13 +00:00
//
// Copyright (C) 1998 Curtis L. Olson - http://www.flightgear.org/~curt
1998-08-25 17:19:13 +00:00
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License as
// published by the Free Software Foundation; either version 2 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
2006-02-21 01:16:04 +00:00
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
1998-08-25 17:19:13 +00:00
//
// $Id$
2003-08-28 20:53:08 +00:00
#ifndef _FG_SIMPLE_HXX
#define _FG_SIMPLE_HXX
1998-08-25 17:19:13 +00:00
2000-02-15 03:30:01 +00:00
#include <simgear/compiler.h>
#include <string>
2003-08-28 20:53:08 +00:00
#include <map>
#include <set>
2003-11-27 23:37:03 +00:00
#include <vector>
#include <simgear/math/point3d.hxx>
#include "Navaids/positioned.hxx"
// forward decls
class FGAirportDynamics;
class FGRunway;
typedef SGSharedPtr<FGRunway> FGRunwayPtr;
/***************************************************************************************
*
**************************************************************************************/
class FGAirport : public FGPositioned
{
private:
SGGeod _tower_location;
std::string _name;
bool _has_metar;
FGAirportDynamics *_dynamics;
public:
FGAirport(const std::string& id, const SGGeod& location, const SGGeod& tower,
const std::string& name, bool has_metar, Type aType);
~FGAirport();
const std::string& getId() const { return ident(); }
const std::string& getName() const { return _name; }
double getLongitude() const { return longitude(); }
// Returns degrees
double getLatitude() const { return latitude(); }
// Returns ft
double getElevation() const { return elevation(); }
bool getMetar() const { return _has_metar; }
bool isAirport() const;
bool isSeaport() const;
bool isHeliport() const;
const SGGeod& getTowerLocation() const { return _tower_location; }
void setMetar(bool value) { _has_metar = value; }
FGRunway* getActiveRunwayForUsage() const;
FGAirportDynamics *getDynamics();
unsigned int numRunways() const;
FGRunway* getRunwayByIndex(unsigned int aIndex) const;
bool hasRunwayWithIdent(const std::string& aIdent) const;
FGRunway* getRunwayByIdent(const std::string& aIdent) const;
FGRunway* findBestRunwayForHeading(double aHeading) const;
unsigned int numTaxiways() const;
FGRunway* getTaxiwayByIndex(unsigned int aIndex) const;
void addRunway(FGRunway* aRunway);
private:
typedef std::vector<FGRunwayPtr>::const_iterator Runway_iterator;
/**
* Helper to locate a runway by ident
*/
Runway_iterator getIteratorForRunwayIdent(const std::string& aIdent) const;
FGAirport operator=(FGAirport &other);
FGAirport(const FGAirport&);
std::vector<FGRunwayPtr> mRunways;
std::vector<FGRunwayPtr> mTaxiways;
Changes contributed by Bernie Bright <bbright@c031.aone.net.au> - The new classes in libmisc.tgz define a stream interface into zlib. I've put these in a new directory, Lib/Misc. Feel free to rename it to something more appropriate. However you'll have to change the include directives in all the other files. Additionally you'll have add the library to Lib/Makefile.am and Simulator/Main/Makefile.am. The StopWatch class in Lib/Misc requires a HAVE_GETRUSAGE autoconf test so I've included the required changes in config.tgz. There are a fair few changes to Simulator/Objects as I've moved things around. Loading tiles is quicker but thats not where the delay is. Tile loading takes a few tenths of a second per file on a P200 but it seems to be the post-processing that leads to a noticeable blip in framerate. I suppose its time to start profiling to see where the delays are. I've included a brief description of each archives contents. Lib/Misc/ zfstream.cxx zfstream.hxx C++ stream interface into zlib. Taken from zlib-1.1.3/contrib/iostream/. Minor mods for STL compatibility. There's no copyright associated with these so I assume they're covered by zlib's. fgstream.cxx fgstream.hxx FlightGear input stream using gz_ifstream. Tries to open the given filename. If that fails then filename is examined and a ".gz" suffix is removed or appended and that file is opened. stopwatch.hxx A simple timer for benchmarking. Not used in production code. Taken from the Blitz++ project. Covered by GPL. strutils.cxx strutils.hxx Some simple string manipulation routines. Simulator/Airports/ Load airports database using fgstream. Changed fgAIRPORTS to use set<> instead of map<>. Added bool fgAIRPORTS::search() as a neater way doing the lookup. Returns true if found. Simulator/Astro/ Modified fgStarsInit() to load stars database using fgstream. Simulator/Objects/ Modified fgObjLoad() to use fgstream. Modified fgMATERIAL_MGR::load_lib() to use fgstream. Many changes to fgMATERIAL. Some changes to fgFRAGMENT but I forget what!
1998-09-01 19:02:53 +00:00
};
1998-08-25 17:19:13 +00:00
class FGAirportSearchFilter {
public:
virtual ~FGAirportSearchFilter() {}
// all airports pass the filter by default
virtual bool pass(FGAirport*) { return true; }
};
class FGIdentOrdering {
public:
virtual ~FGIdentOrdering()
{ ; }
virtual bool compare(const std::string& aA, const std::string& aB) const
{ return aA < aB; }
};
typedef std::map < std::string, FGAirport* > airport_map;
2003-08-28 20:53:08 +00:00
typedef airport_map::iterator airport_map_iterator;
typedef airport_map::const_iterator const_airport_map_iterator;
typedef std::vector < FGAirport * > airport_list;
typedef airport_list::iterator airport_list_iterator;
typedef airport_list::const_iterator const_airport_list_iterator;
2003-11-27 23:37:03 +00:00
2003-08-28 20:53:08 +00:00
class FGAirportList {
private:
airport_map airports_by_id;
airport_list airports_array;
public:
// Constructor (new)
FGAirportList();
// Destructor
2003-08-28 20:53:08 +00:00
~FGAirportList();
// add an entry to the list
FGAirport* add( const std::string& id, const SGGeod& location, const SGGeod& tower,
const std::string& name, bool has_metar, FGPositioned::Type aType);
// search for the specified id.
// Returns NULL if unsucessfull.
FGAirport* search( const std::string& id );
// Search for the next airport in ASCII sequence to the supplied id.
// eg. id = "KDC" or "KDCA" would both return "KDCA".
// NOTE: Numbers come prior to A-Z in ASCII sequence so id = "LD" would return "LD57", not "LDDP"
// optional ordering can make letters come before numbers
// Implementation assumes airport codes are unique.
// Returns NULL if unsucessfull.
const FGAirport* findFirstById(const std::string& aIdent, FGIdentOrdering* aOrder = NULL);
2003-11-27 23:37:03 +00:00
// search for the airport closest to the specified position
// (currently a linear inefficient search so it's probably not
// best to use this at runtime.) An FGAirportSearchFilter class
// can be used to restrict the possible choices to a subtype.
// max_range limits search - specified as an arc distance, in degrees
FGAirport* search( double lon_deg, double lat_deg, double max_range );
FGAirport* search( double lon_deg, double lat_deg, double max_range, FGAirportSearchFilter& );
2003-11-27 23:37:03 +00:00
/**
* Return the number of airports in the list.
*/
int size() const;
2003-11-27 23:37:03 +00:00
/**
* Return a specific airport, by position.
*/
David Luff: Attached is a patch to the airport data storage that I would like committed after review if acceptable. Currently the storage of airports mapped by ID is by locally created objects - about 12 Meg or so created on the stack if I am not mistaken. I've changed this to creating the airports on the heap, and storing pointers to them - see FGAirportList.add(...) in src/Airports/simple.cxx. I believe that this is probably better practice, and it's certainly cured some strange problems I was seeing when accessing the airport data with some gps unit code. Changes resulting from this have cascaded through a few files which access the data - 11 files are modified in all. Melchior and Durk - you might want to test this and shout if there are problems since the metar and traffic code are probably the biggest users of the airport data. I've also added a fuzzy search function that returns the next matching airport code in ASCII sequence in order to support gps units that have autocompletion of partially entered codes. More generally, the simple airport class seems to have grown a lot with the fairly recent addition of the parking, runway preference and schedule time code. It is no longer just an encapsulation of the global airport data file, and has grown to 552 bytes in size when unpopulated (about 1/2 a K!). My personal opinion is that we should look to just store the basic data in apt.dat for all global airports in a simple airport class, plus globally needed data (metar available?), and then have the traffic, AI and ATC subsystems create more advanced airports for themselves as needed in the area of interest. Once a significant number of airports worldwide have ground networks and parking defined, it will be impractical and unnecessary to store them all in memory. That's just a thought for the future though.
2005-09-20 20:26:57 +00:00
const FGAirport *getAirport( unsigned int index ) const;
/**
* Return a pointer to the raw airport list
*/
inline const airport_list* getAirportList() { return (&airports_array); }
/**
* Mark the specified airport record as not having metar
*/
void no_metar( const std::string &id );
2003-11-27 23:37:03 +00:00
/**
* Mark the specified airport record as (yes) having metar
*/
void has_metar( const std::string &id );
1998-08-25 17:19:13 +00:00
};
// find basic airport location info from airport database
const FGAirport *fgFindAirportID( const std::string& id);
// get airport elevation
double fgGetAirportElev( const std::string& id );
// get airport position
Point3D fgGetAirportPos( const std::string& id );
1998-08-25 17:19:13 +00:00
2003-08-28 20:53:08 +00:00
#endif // _FG_SIMPLE_HXX
1998-08-25 17:19:13 +00:00