osg::HeightField* ElevationLayer::createHeightFieldFromTileSource(const TileKey& key, ProgressCallback* progress) { osg::ref_ptr<osg::HeightField> result; if (progress && progress->isCanceled()) { return 0L; } TileSource* source = getTileSource(); if ( !source ) { if (progress) progress->message() = "no tile source"; return 0L; } // If the key is blacklisted, fail. if ( source->getBlacklist()->contains( key )) { OE_DEBUG << LC << "Tile " << key.str() << " is blacklisted " << std::endl; if (progress) progress->message() = "blacklisted"; return 0L; } // If the profiles are horizontally equivalent (different vdatums is OK), take the // quick route: if ( key.getProfile()->isHorizEquivalentTo( getProfile() ) ) { // Only try to get data if the source actually has data if (!mayHaveData(key)) { OE_DEBUG << LC << "Source for layer has no data at " << key.str() << std::endl; //if (progress) progress->message() = "mayHaveData=false"; return 0L; } // Make it from the source: result = source->createHeightField( key, getOrCreatePreCacheOp(), progress ); // If the result is good, we how have a heightfield but it's vertical values // are still relative to the tile source's vertical datum. Convert them. if (result.valid()) { if ( ! key.getExtent().getSRS()->isVertEquivalentTo( getProfile()->getSRS() ) ) { VerticalDatum::transform( getProfile()->getSRS()->getVerticalDatum(), // from key.getExtent().getSRS()->getVerticalDatum(), // to key.getExtent(), result.get() ); } } // Blacklist the tile if it is the same projection as the source and // we can't get it and it wasn't cancelled if (!result.valid()) { if ( progress == 0L || !progress->isCanceled() ) { source->getBlacklist()->add( key ); } } } // Otherwise, profiles don't match so we need to composite: else { // note: this method takes care of the vertical datum shift internally. osg::ref_ptr<NormalMap> dummyNormalMap; assembleHeightField( key, result, dummyNormalMap, progress ); } if (progress && progress->isCanceled()) { return 0L; } return result.release(); }
osg::HeightField* ElevationLayer::createHeightFieldFromTileSource(const TileKey& key, ProgressCallback* progress) { osg::HeightField* result = 0L; TileSource* source = getTileSource(); if ( !source ) return 0L; // If the key is blacklisted, fail. if ( source->getBlacklist()->contains( key.getTileId() ) ) { OE_DEBUG << LC << "Tile " << key.str() << " is blacklisted " << std::endl; return 0L; } // If the profiles are horizontally equivalent (different vdatums is OK), take the // quick route: if ( key.getProfile()->isHorizEquivalentTo( getProfile() ) ) { // Only try to get data if the source actually has data if ( !source->hasData(key) ) { OE_DEBUG << LC << "Source for layer has no data at " << key.str() << std::endl; return 0L; } // Make it from the source: result = source->createHeightField( key, _preCacheOp.get(), progress ); // If the result is good, we how have a heightfield but it's vertical values // are still relative to the tile source's vertical datum. Convert them. if ( result ) { if ( ! key.getExtent().getSRS()->isVertEquivalentTo( getProfile()->getSRS() ) ) { VerticalDatum::transform( getProfile()->getSRS()->getVerticalDatum(), // from key.getExtent().getSRS()->getVerticalDatum(), // to key.getExtent(), result ); } } // Blacklist the tile if it is the same projection as the source and we can't get it and it wasn't cancelled if ( !result && (!progress || !progress->isCanceled())) { source->getBlacklist()->add( key.getTileId() ); } } // Otherwise, profiles don't match so we need to composite: else { // note: this method takes care of the vertical datum shift internally. result = assembleHeightFieldFromTileSource( key, progress ); } #if 0 // If the profiles don't match, use a more complicated technique to assemble the tile: if ( !key.getProfile()->isEquivalentTo( getProfile() ) ) { result = assembleHeightFieldFromTileSource( key, progress ); } else { // Only try to get data if the source actually has data if ( !source->hasData( key ) ) { OE_DEBUG << LC << "Source for layer has no data at " << key.str() << std::endl; return 0L; } // Make it from the source: result = source->createHeightField( key, _preCacheOp.get(), progress ); } #endif return result; }