+bool FGAirport::hasHardRunwayOfLengthFt(double aLengthFt) const
+{
+ unsigned int numRunways(mRunways.size());
+ for (unsigned int r=0; r<numRunways; ++r) {
+ FGRunway* rwy = mRunways[r];
+ if (rwy->isReciprocal()) {
+ continue; // we only care about lengths, so don't do work twice
+ }
+
+ if (rwy->isHardSurface() && (rwy->lengthFt() >= aLengthFt)) {
+ return true; // we're done!
+ }
+ } // of runways iteration
+
+ return false;
+}
+
+unsigned int FGAirport::numTaxiways() const
+{
+ return mTaxiways.size();
+}
+
+FGRunway* FGAirport::getTaxiwayByIndex(unsigned int aIndex) const
+{
+ assert(aIndex >= 0 && aIndex < mTaxiways.size());
+ return mTaxiways[aIndex];
+}
+
+void FGAirport::addRunway(FGRunway* aRunway)
+{
+ aRunway->setAirport(this);
+
+ if (aRunway->isTaxiway()) {
+ mTaxiways.push_back(aRunway);
+ } else {
+ mRunways.push_back(aRunway);
+ }
+}
+
+FGRunway* FGAirport::getActiveRunwayForUsage() const
+{
+ static FGEnvironmentMgr* envMgr = NULL;
+ if (!envMgr) {
+ envMgr = (FGEnvironmentMgr *) globals->get_subsystem("environment");
+ }
+
+ FGEnvironment stationWeather(envMgr->getEnvironment(mPosition));
+
+ double windSpeed = stationWeather.get_wind_speed_kt();
+ double hdg = stationWeather.get_wind_from_heading_deg();
+ if (windSpeed <= 0.0) {
+ hdg = 270; // This forces West-facing rwys to be used in no-wind situations
+ // which is consistent with Flightgear's initial setup.
+ }
+
+ return findBestRunwayForHeading(hdg);
+}
+
+FGAirport* FGAirport::findClosest(const SGGeod& aPos, double aCuttofNm, Filter* filter)
+{
+ AirportFilter aptFilter;
+ if (filter == NULL) {
+ filter = &aptFilter;
+ }
+
+ FGPositionedRef r = FGPositioned::findClosest(aPos, aCuttofNm, filter);
+ if (!r) {
+ return NULL;
+ }
+
+ return static_cast<FGAirport*>(r.ptr());
+}
+
+FGAirport::HardSurfaceFilter::HardSurfaceFilter(double minLengthFt) :
+ mMinLengthFt(minLengthFt)
+{
+}
+
+bool FGAirport::HardSurfaceFilter::pass(FGPositioned* aPos) const
+{
+ if (aPos->type() != AIRPORT) {
+ return false; // exclude seaports and heliports as well, we need a runways
+ }
+
+ return static_cast<FGAirport*>(aPos)->hasHardRunwayOfLengthFt(mMinLengthFt);
+}