]> git.mxchange.org Git - flightgear.git/blobdiff - src/Airports/airport.hxx
Document that property write-protection is not a security measure
[flightgear.git] / src / Airports / airport.hxx
index b58b2f345ecfd169d888350cd9d591559b59102e..6713e77d1a25248cdaed202b239998b70d1b9fb2 100644 (file)
 #include <map>
 
 #include <Navaids/positioned.hxx>
+#include <Navaids/procedure.hxx>
 
-// forward decls
-class FGAirportDynamics;
-class FGRunway;
-class FGHelipad;
-class FGTaxiway;
-class FGPavement;
-class SGPropertyNode;
-class FGAirport;
-
-namespace flightgear {
-  class SID;
-  class STAR;
-  class Approach;
-  class Waypt;
-  class CommStation;
-
-  typedef SGSharedPtr<Waypt> WayptRef;
-  typedef std::vector<WayptRef> WayptVec;
-  
-  typedef std::vector<CommStation*> CommStationList;
-  typedef std::map<std::string, FGAirport*> AirportCache;
-}
-
-
+#include "airports_fwd.hxx"
+#include "runways.hxx"
 
 /***************************************************************************************
  *
  **************************************************************************************/
 class FGAirport : public FGPositioned
 {
-public:
+  public:
     FGAirport(PositionedID aGuid, const std::string& id, const SGGeod& location,
             const std::string& name, bool has_metar, Type aType);
     ~FGAirport();
 
     const std::string& getId() const { return ident(); }
     const std::string& getName() const { return _name; }
+    std::string toString() const { return "an airport " + ident(); }
+
     double getLongitude() const { return longitude(); }
     // Returns degrees
     double getLatitude()  const { return latitude(); }
@@ -89,27 +70,44 @@ public:
 
     /**
      * reload the ILS data from XML if required.
-     * @result true if the data was refreshed, false if no data was loaded
-     * or previously cached data is still correct.
      */
-    bool validateILSData();
+    void validateILSData();
 
     SGGeod getTowerLocation() const;
 
     void setMetar(bool value) { _has_metar = value; }
 
-    FGRunway* getActiveRunwayForUsage() const;
+    FGRunwayRef getActiveRunwayForUsage() const;
 
     FGAirportDynamics *getDynamics();
     
     unsigned int numRunways() const;
     unsigned int numHelipads() const;
-    FGRunway* getRunwayByIndex(unsigned int aIndex) const;
-    FGHelipad* getHelipadByIndex(unsigned int aIndex) const;
+    FGRunwayRef getRunwayByIndex(unsigned int aIndex) const;
+    FGHelipadRef getHelipadByIndex(unsigned int aIndex) const;
+    FGRunwayMap getRunwayMap() const;
+    FGHelipadMap getHelipadMap() const;
 
     bool hasRunwayWithIdent(const std::string& aIdent) const;
-    FGRunway* getRunwayByIdent(const std::string& aIdent) const;
-    FGRunway* findBestRunwayForHeading(double aHeading) const;
+    bool hasHelipadWithIdent(const std::string& aIdent) const;
+    FGRunwayRef getRunwayByIdent(const std::string& aIdent) const;
+    FGHelipadRef getHelipadByIdent(const std::string& aIdent) const;
+
+    struct FindBestRunwayForHeadingParams {
+      FindBestRunwayForHeadingParams() {
+        lengthWeight =  0.01;
+        widthWeight =  0.01;
+        surfaceWeight =  10;
+        deviationWeight =  1;
+        ilsWeight = 0;
+      }
+      double lengthWeight;
+      double widthWeight;
+      double surfaceWeight;
+      double deviationWeight;
+      double ilsWeight;
+    };
+    FGRunwayRef findBestRunwayForHeading(double aHeading, struct FindBestRunwayForHeadingParams * parms = NULL ) const;
     
     /**
      * return the most likely target runway based on a position.
@@ -118,7 +116,20 @@ public:
      * This is a good approximation of which runway the position is on or
      * aiming towards.
      */
-    FGRunway* findBestRunwayForPos(const SGGeod& aPos) const;
+    FGRunwayRef findBestRunwayForPos(const SGGeod& aPos) const;
+    
+    /**
+     * Retrieve all runways at the airport, but excluding the reciprocal
+     * runways. For example at KSFO this might return 1L, 1R, 28L and 28R,
+     * but would not then include 19L/R or 10L/R.
+     *
+     * Exactly which runways you get, is undefined (i.e, dont assumes it's
+     * runways with heading < 180 degrees) - it depends on order in apt.dat.
+     *
+     * This is useful for code that wants to process each piece of tarmac at
+     * an airport *once*, not *twice* - eg mapping and nav-display code.
+     */
+    FGRunwayList getRunwaysWithoutReciprocals() const;
     
      /**
      * Useful predicate for FMS/GPS/NAV displays and similar - check if this
@@ -127,29 +138,31 @@ public:
     bool hasHardRunwayOfLengthFt(double aLengthFt) const;
 
     unsigned int numTaxiways() const;
-    FGTaxiway* getTaxiwayByIndex(unsigned int aIndex) const;
+    FGTaxiwayRef getTaxiwayByIndex(unsigned int aIndex) const;
+    FGTaxiwayList getTaxiways() const;
 
     unsigned int numPavements() const;
-    FGPavement* getPavementByIndex(unsigned int aIndex) const;
+    FGPavementRef getPavementByIndex(unsigned int aIndex) const;
+    FGPavementList getPavements() const;
     
     class AirportFilter : public Filter
-     {
-     public:
-       virtual bool pass(FGPositioned* aPos) const { 
-         return passAirport(static_cast<FGAirport*>(aPos));
-       }
-       
-       virtual Type minType() const {
-         return AIRPORT;
-       }
-       
-       virtual Type maxType() const {
-         return AIRPORT;
-       }
-       
-       virtual bool passAirport(FGAirport* aApt) const {
-         return true;
-       }
+    {
+      public:
+        virtual bool pass(FGPositioned* aPos) const {
+          return passAirport(static_cast<FGAirport*>(aPos));
+        }
+
+        virtual Type minType() const {
+          return AIRPORT;
+        }
+
+        virtual Type maxType() const {
+          return AIRPORT;
+        }
+
+        virtual bool passAirport(FGAirport* aApt) const {
+          return true;
+        }
      };
      
      /**
@@ -174,6 +187,30 @@ public:
        double mMinLengthFt;
      };
      
+     /**
+      * Filter which passes specified port type and in case of airport checks
+      * if a runway larger the /sim/navdb/min-runway-lenght-ft exists.
+      */
+     class TypeRunwayFilter:
+       public AirportFilter
+     {
+       public:
+         TypeRunwayFilter();
+
+         /**
+          * Construct from string containing type (airport, seaport or heliport)
+          */
+         bool fromTypeString(const std::string& type);
+
+         virtual FGPositioned::Type minType() const { return _type; }
+         virtual FGPositioned::Type maxType() const { return _type; }
+         virtual bool pass(FGPositioned* pos) const;
+
+       protected:
+         FGPositioned::Type _type;
+         double _min_runway_length_ft;
+     };
+
      
      void setProcedures(const std::vector<flightgear::SID*>& aSids,
       const std::vector<flightgear::STAR*>& aStars,
@@ -186,34 +223,40 @@ public:
       unsigned int numSIDs() const;
       flightgear::SID* getSIDByIndex(unsigned int aIndex) const;
       flightgear::SID* findSIDWithIdent(const std::string& aIdent) const;
+      flightgear::SIDList getSIDs() const;
       
       unsigned int numSTARs() const;
       flightgear::STAR* getSTARByIndex(unsigned int aIndex) const;
       flightgear::STAR* findSTARWithIdent(const std::string& aIdent) const;
+      flightgear::STARList getSTARs() const;
       
       unsigned int numApproaches() const;
       flightgear::Approach* getApproachByIndex(unsigned int aIndex) const;
       flightgear::Approach* findApproachWithIdent(const std::string& aIdent) const;
+      flightgear::ApproachList getApproaches
+      (
+        flightgear::ProcedureType type = flightgear::PROCEDURE_INVALID
+      ) const;
   
      /**
       * Syntactic wrapper around FGPositioned::findClosest - find the closest
       * match for filter, and return it cast to FGAirport. The default filter
       * passes airports, but not seaports or heliports
       */
-     static FGAirport* findClosest(const SGGeod& aPos, double aCuttofNm, Filter* filter = NULL);
+     static FGAirportRef findClosest(const SGGeod& aPos, double aCuttofNm, Filter* filter = NULL);
      
      /**
       * Helper to look up an FGAirport instance by unique ident. Throws an 
       * exception if the airport could not be found - so callers can assume
       * the result is non-NULL.
       */
-     static FGAirport* getByIdent(const std::string& aIdent);
+     static FGAirportRef getByIdent(const std::string& aIdent);
      
      /**
       * Helper to look up an FGAirport instance by unique ident. Returns NULL
       * if the airport could not be found.
       */
-     static FGAirport* findByIdent(const std::string& aIdent);
+     static FGAirportRef findByIdent(const std::string& aIdent);
      
      /**
       * Specialised helper to implement the AirportList dialog. Performs a
@@ -221,7 +264,14 @@ public:
       * matches in a format suitable for use by a puaList. 
       */
      static char** searchNamesAndIdents(const std::string& aFilter);
-         
+    
+    
+    /**
+     * Sort an FGPositionedList of airports by size (number of runways + length)
+     * this is meant to prioritise more important airports.
+     */
+    static void sortBySize(FGPositionedList&);
+    
     flightgear::CommStationList commStationsOfType(FGPositioned::Type aTy) const;
     
     flightgear::CommStationList commStations() const;
@@ -251,7 +301,9 @@ private:
      * Helper to parse property data loaded from an ICAO.twr.xml file
      */
     void readTowerData(SGPropertyNode* aRoot);
-    
+  
+    PositionedIDVec itemsOfType(FGPositioned::Type ty) const;
+  
     std::string _name;
     bool _has_metar;
     FGAirportDynamics *_dynamics;
@@ -262,13 +314,18 @@ private:
     void loadProcedures() const;
     
     mutable bool mTowerDataLoaded;
+    mutable SGGeod mTowerPosition;
+  
     mutable bool mRunwaysLoaded;
     mutable bool mHelipadsLoaded;
     mutable bool mTaxiwaysLoaded;
     mutable bool mProceduresLoaded;
+  
+    mutable bool mThresholdDataLoaded;
     bool mILSDataLoaded;
+
+    mutable std::vector<FGRunwayRef> mRunways;
   
-    mutable PositionedIDVec mRunways;
     mutable PositionedIDVec mHelipads;
     mutable PositionedIDVec mTaxiways;
     PositionedIDVec mPavements;