]> git.mxchange.org Git - flightgear.git/blob - src/Airports/simple.hxx
9a295b251d6c3fc5b8c3745f0bdbd2f7e3ebcd23
[flightgear.git] / src / Airports / simple.hxx
1 // simple.hxx -- a really simplistic class to manage airport ID,
2 //                 lat, lon of the center of one of it's runways, and
3 //                 elevation in feet.
4 //
5 // Written by Curtis Olson, started April 1998.
6 // Updated by Durk Talsma, started December 2004.
7 //
8 // Copyright (C) 1998  Curtis L. Olson  - http://www.flightgear.org/~curt
9 //
10 // This program is free software; you can redistribute it and/or
11 // modify it under the terms of the GNU General Public License as
12 // published by the Free Software Foundation; either version 2 of the
13 // License, or (at your option) any later version.
14 //
15 // This program is distributed in the hope that it will be useful, but
16 // WITHOUT ANY WARRANTY; without even the implied warranty of
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18 // General Public License for more details.
19 //
20 // You should have received a copy of the GNU General Public License
21 // along with this program; if not, write to the Free Software
22 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
23 //
24 // $Id$
25
26
27 #ifndef _FG_SIMPLE_HXX
28 #define _FG_SIMPLE_HXX
29
30 #include <simgear/compiler.h>
31
32 #include <string>
33 #include <map>
34 #include <set>
35 #include <vector>
36
37 #include <simgear/math/point3d.hxx>
38 #include "Navaids/positioned.hxx"
39
40 // forward decls
41 class FGAirportDynamics;
42 class FGRunway;
43
44 typedef SGSharedPtr<FGRunway> FGRunwayPtr;
45
46 /***************************************************************************************
47  *
48  **************************************************************************************/
49 class FGAirport : public FGPositioned
50 {
51 private:
52     SGGeod _tower_location;
53     std::string _name;
54     bool _has_metar;
55     FGAirportDynamics *_dynamics;
56
57 public:
58     FGAirport(const std::string& id, const SGGeod& location, const SGGeod& tower, 
59             const std::string& name, bool has_metar, Type aType);
60     ~FGAirport();
61
62     const std::string& getId() const { return ident(); }
63     const std::string& getName() const { return _name; }
64     double getLongitude() const { return longitude(); }
65     // Returns degrees
66     double getLatitude()  const { return latitude(); }
67     // Returns ft
68     double getElevation() const { return elevation(); }
69     bool   getMetar()     const { return _has_metar; }
70     bool   isAirport()    const;
71     bool   isSeaport()    const;
72     bool   isHeliport()   const;
73
74     virtual const std::string& name() const
75     { return _name; }
76
77     const SGGeod& getTowerLocation() const { return _tower_location; }
78
79     void setMetar(bool value) { _has_metar = value; }
80
81     FGRunway* getActiveRunwayForUsage() const;
82
83     FGAirportDynamics *getDynamics();
84     
85     unsigned int numRunways() const;
86     FGRunway* getRunwayByIndex(unsigned int aIndex) const;
87
88     bool hasRunwayWithIdent(const std::string& aIdent) const;
89     FGRunway* getRunwayByIdent(const std::string& aIdent) const;
90     FGRunway* findBestRunwayForHeading(double aHeading) const;
91     
92      /**
93      * Useful predicate for FMS/GPS/NAV displays and similar - check if this
94      * aiport has a hard-surfaced runway of at least the specified length.
95      */
96     bool hasHardRunwayOfLengthFt(double aLengthFt) const;
97     
98     unsigned int numTaxiways() const;
99     FGRunway* getTaxiwayByIndex(unsigned int aIndex) const;
100     
101     void addRunway(FGRunway* aRunway);
102     
103     class AirportFilter : public Filter
104      {
105      public:
106        virtual bool pass(FGPositioned* aPos) const { 
107          Type ty(aPos->type());
108          return (ty >= AIRPORT) && (ty <= SEAPORT);
109        }
110      };
111      
112      class HardSurfaceFilter : public Filter
113      {
114      public:
115        HardSurfaceFilter(double minLengthFt);
116        
117        virtual bool pass(FGPositioned* aPos) const;
118      private:
119        double mMinLengthFt;
120      };
121      
122      /**
123       * Syntactic wrapper around FGPositioned::findClosest - find the closest
124       * match for filter, and return it cast to FGAirport. The default filter
125       * passes all airports, including seaports and heliports.
126       */
127      static FGAirport* findClosest(const SGGeod& aPos, double aCuttofNm, Filter* filter = NULL);
128 private:
129     typedef std::vector<FGRunwayPtr>::const_iterator Runway_iterator;
130     /**
131      * Helper to locate a runway by ident
132      */
133     Runway_iterator getIteratorForRunwayIdent(const std::string& aIdent) const;
134
135     FGAirport operator=(FGAirport &other);
136     FGAirport(const FGAirport&);
137     
138     std::vector<FGRunwayPtr> mRunways;
139     std::vector<FGRunwayPtr> mTaxiways;
140 };
141
142
143 class FGAirportSearchFilter {
144 public:
145     virtual ~FGAirportSearchFilter() {}
146     // all airports pass the filter by default
147     virtual bool pass(FGAirport*) { return true; }
148 };
149
150 typedef std::map < std::string, FGAirport* > airport_map;
151 typedef airport_map::iterator airport_map_iterator;
152 typedef airport_map::const_iterator const_airport_map_iterator;
153
154 typedef std::vector < FGAirport * > airport_list;
155 typedef airport_list::iterator airport_list_iterator;
156 typedef airport_list::const_iterator const_airport_list_iterator;
157
158
159
160 class FGAirportList {
161 private:
162
163     airport_map airports_by_id;
164     airport_list airports_array;
165
166 public:
167     // Constructor (new)
168     FGAirportList();
169
170     // Destructor
171     ~FGAirportList();
172
173     // add an entry to the list
174     FGAirport* add( const std::string& id, const SGGeod& location, const SGGeod& tower,
175               const std::string& name, bool has_metar, FGPositioned::Type aType);
176
177     // search for the specified id.
178     // Returns NULL if unsucessfull.
179     FGAirport* search( const std::string& id );
180
181     // search for the airport closest to the specified position
182     // (currently a linear inefficient search so it's probably not
183     // best to use this at runtime.)  An FGAirportSearchFilter class
184     // can be used to restrict the possible choices to a subtype.
185     // max_range limits search - specified as an arc distance, in degrees
186     FGAirport* search( double lon_deg, double lat_deg, double max_range );
187     FGAirport* search( double lon_deg, double lat_deg, double max_range, FGAirportSearchFilter& );
188
189     /**
190      * Return the number of airports in the list.
191      */
192     int size() const;
193
194     /**
195      * Return a specific airport, by position.
196      */
197     const FGAirport *getAirport( unsigned int index ) const;
198
199     /**
200      * Mark the specified airport record as not having metar
201      */
202     void no_metar( const std::string &id );
203
204     /**
205      * Mark the specified airport record as (yes) having metar
206      */
207     void has_metar( const std::string &id );
208
209 };
210
211 // find basic airport location info from airport database
212 const FGAirport *fgFindAirportID( const std::string& id);
213
214 // get airport elevation
215 double fgGetAirportElev( const std::string& id );
216
217 // get airport position
218 Point3D fgGetAirportPos( const std::string& id );
219
220 #endif // _FG_SIMPLE_HXX
221
222