if (towers.empty()) {
mHasTower = false;
mTowerPosition = geod(); // use airport position
+
+ // offset the tower position away from the runway centerline, if
+ // airport has a single runway. Offset by eight times the runway width,
+ // an entirely guessed figure.
+ if (numRunways() <= 2) {
+ FGRunway* runway = getRunwayByIndex(0);
+ double hdg = runway->headingDeg() + 90;
+ mTowerPosition = SGGeodesy::direct(geod(), hdg, runway->widthM() * 8);
+ }
+
// increase tower elevation by 20 metres above the field elevation
mTowerPosition.setElevationM(geod().getElevationM() + 20.0);
} else {
double lat = atof( token[1].c_str() );
double lon = atof( token[2].c_str() );
double elev = atof( token[3].c_str() );
- tower = SGGeod::fromDegFt(lon, lat, elev + last_apt_elev);
- got_tower = true;
-
+ tower = SGGeod::fromDegFt(lon, lat, elev + last_apt_elev);
cache->insertTower(currentAirportID, tower);
} else if ( line_id == 19 ) {
// windsock entry (ignore)
double rwy_lon_accum;
double last_rwy_heading;
int rwy_count;
- bool got_tower;
string last_apt_id;
double last_apt_elev;
SGGeod tower;
double lat = rwy_lat_accum / (double)rwy_count;
double lon = rwy_lon_accum / (double)rwy_count;
- if (!got_tower) {
- // tower height hard coded for now...
- const float tower_height = 50.0f;
- // make a little off the heading for 1 runway airports...
- float fudge_lon = fabs(sin(last_rwy_heading * SGD_DEGREES_TO_RADIANS)) * .003f;
- float fudge_lat = .003f - fudge_lon;
- tower = SGGeod::fromDegFt(lon + fudge_lon, lat + fudge_lat, last_apt_elev + tower_height);
-
- cache->insertTower(currentAirportID, tower);
- }
-
SGGeod pos(SGGeod::fromDegFt(lon, lat, last_apt_elev));
cache->updatePosition(currentAirportID, pos);
finishAirport();
last_apt_elev = elev;
- got_tower = false;
string name;
// build the name