-// search for the specified id
-FGAirport FGAirportList::search( const string& id) {
-
- return airports_by_id[id];
-}
-
-
-// search for the airport nearest the specified position
-FGAirport FGAirportList::search( double lon_deg, double lat_deg,
- bool with_metar ) {
- int closest = 0;
- double min_dist = 360.0;
- unsigned int i;
- for ( i = 0; i < airports_array.size(); ++i ) {
- // crude manhatten distance based on lat/lon difference
- double d = fabs(lon_deg - airports_array[i]->longitude)
- + fabs(lat_deg - airports_array[i]->latitude);
- if ( d < min_dist ) {
- if ( !with_metar || (with_metar && airports_array[i]->has_metar) ) {
- closest = i;
- min_dist = d;
- }
- }
+FGTaxiway* FGAirport::getTaxiwayByIndex(unsigned int aIndex) const
+{
+ loadTaxiways();
+ assert(aIndex >= 0 && aIndex < mTaxiways.size());
+ return mTaxiways[aIndex];
+}
+
+unsigned int FGAirport::numPavements() const
+{
+ loadTaxiways();
+ return mPavements.size();
+}
+
+FGPavement* FGAirport::getPavementByIndex(unsigned int aIndex) const
+{
+ loadTaxiways();
+ assert(aIndex >= 0 && aIndex < mPavements.size());
+ return mPavements[aIndex];
+}
+
+void FGAirport::setRunwaysAndTaxiways(vector<FGRunwayPtr>& rwys,
+ vector<FGTaxiwayPtr>& txwys,
+ vector<FGPavementPtr>& pvts)
+{
+ mRunways.swap(rwys);
+ Runway_iterator it = mRunways.begin();
+ for (; it != mRunways.end(); ++it) {
+ (*it)->setAirport(this);
+ }
+
+ mTaxiways.swap(txwys);
+ mPavements.swap(pvts);
+}
+
+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::passAirport(FGAirport* aApt) const
+{
+ return aApt->hasHardRunwayOfLengthFt(mMinLengthFt);
+}
+
+FGAirport* FGAirport::findByIdent(const std::string& aIdent)
+{
+ FGPositionedRef r;
+ PortsFilter filter;
+ r = FGPositioned::findNextWithPartialId(r, aIdent, &filter);
+ if (!r) {
+ return NULL; // we don't warn here, let the caller do that
+ }
+ return static_cast<FGAirport*>(r.ptr());
+}
+
+FGAirport* FGAirport::getByIdent(const std::string& aIdent)
+{
+ FGPositionedRef r;
+ PortsFilter filter;
+ r = FGPositioned::findNextWithPartialId(r, aIdent, &filter);
+ if (!r) {
+ throw sg_range_exception("No such airport with ident: " + aIdent);
+ }
+ return static_cast<FGAirport*>(r.ptr());
+}
+
+char** FGAirport::searchNamesAndIdents(const std::string& aFilter)
+{
+ // we delegate all the work to a horrible helper in FGPositioned, which can
+ // access the (private) index data.
+ return searchAirportNamesAndIdents(aFilter);
+}
+
+// find basic airport location info from airport database
+const FGAirport *fgFindAirportID( const string& id)
+{
+ if ( id.empty() ) {
+ return NULL;