+ double last_altitude_ft = 0.0;
+ double sort_required = false;
+ size_t i;
+
+ for (i = 0; i < (size_t)_rootNode->nChildren(); i++) {
+ const SGPropertyNode * child = _rootNode->getChild(i);
+ if ( child->getNameString() == "entry"
+ && child->getStringValue("elevation-ft", "")[0] != '\0'
+ && ( child->getDoubleValue("elevation-ft") > 0.1 || i == 0 ) )
+ {
+ LayerTableBucket * b;
+ if( i < size() ) {
+ // recycle existing bucket
+ b = at(i);
+ } else {
+ // more nodes than buckets in table, add a new one
+ b = new LayerTableBucket;
+ push_back(b);
+ }
+ if (i == 0 && parent != NULL )
+ b->environment = *parent;
+ if (i > 0)
+ b->environment = at(i-1)->environment;
+
+ b->environment.read(child);
+ b->altitude_ft = b->environment.get_elevation_ft();
+
+ // check, if altitudes are in ascending order
+ if( b->altitude_ft < last_altitude_ft )
+ sort_required = true;
+ last_altitude_ft = b->altitude_ft;
+ }
+ }
+ // remove leftover buckets
+ while( size() > i ) {
+ LayerTableBucket * b = *(end() - 1);
+ delete b;
+ pop_back();
+ }
+
+ if( sort_required )
+ sort(begin(), end(), LayerTableBucket::lessThan);
+
+ // cleanup entries with (almost)same altitude
+ for( size_type n = 1; n < size(); n++ ) {
+ if( fabs(at(n)->altitude_ft - at(n-1)->altitude_ft ) < 1 ) {
+ SG_LOG( SG_GENERAL, SG_ALERT, "Removing duplicate altitude entry in environment config for altitude " << at(n)->altitude_ft );
+ erase( begin() + n );
+ }
+ }