void CompositeTileSource::initialize( const std::string& referenceURI, const Profile* overrideProfile ) { osg::ref_ptr<const Profile> profile = overrideProfile; for(CompositeTileSourceOptions::ComponentVector::iterator i = _options._components.begin(); i != _options._components.end(); ++i) { TileSource* source = i->_tileSourceInstance.get(); if ( source ) { osg::ref_ptr<const Profile> localOverrideProfile = overrideProfile; const TileSourceOptions& opt = source->getOptions(); if ( opt.profile().isSet() ) localOverrideProfile = Profile::create( opt.profile().value() ); source->initialize( referenceURI, localOverrideProfile.get() ); if ( !profile.valid() ) { // assume the profile of the first source to be the overall profile. profile = source->getProfile(); } else if ( !profile->isEquivalentTo( source->getProfile() ) ) { // if sub-sources have different profiles, print a warning because this is // not supported! OE_WARN << LC << "Components with differing profiles are not supported. " << "Visual anomalies may result." << std::endl; } _dynamic = _dynamic || source->isDynamic(); // gather extents const DataExtentList& extents = source->getDataExtents(); for( DataExtentList::const_iterator j = extents.begin(); j != extents.end(); ++j ) { getDataExtents().push_back( *j ); } } } setProfile( profile.get() ); _initialized = true; }
CacheBin* TerrainLayer::getCacheBin( const Profile* profile, const std::string& binId ) { // make sure we've initialized the tile source first. TileSource* tileSource = getTileSource(); // in no-cache mode, there are no cache bins. if ( getCachePolicy() == CachePolicy::NO_CACHE ) { return 0L; } // if cache is not setted, return NULL if (_cache == NULL) { return 0L; } // see if the cache bin already exists and return it if so { Threading::ScopedReadLock shared(_cacheBinsMutex); CacheBinInfoMap::iterator i = _cacheBins.find( binId ); if ( i != _cacheBins.end() ) return i->second._bin.get(); } // create/open the cache bin. { Threading::ScopedWriteLock exclusive(_cacheBinsMutex); // double-check: CacheBinInfoMap::iterator i = _cacheBins.find( binId ); if ( i != _cacheBins.end() ) return i->second._bin.get(); // add the new bin: osg::ref_ptr<CacheBin> newBin = _cache->addBin( binId ); // and configure: if ( newBin.valid() ) { // attempt to read the cache metadata: CacheBinMetadata meta( newBin->readMetadata() ); if ( meta.isValid() ) // cache exists and is valid. { // verify that the cache if compatible with the tile source: if ( tileSource && getProfile() ) { //todo: check the profile too if ( *meta._sourceDriver != tileSource->getOptions().getDriver() ) { OE_WARN << LC << "Cache has an incompatible driver or profile... disabling" << std::endl; setCachePolicy( CachePolicy::NO_CACHE ); return 0L; } } else if ( isCacheOnly() && !_profile.valid() ) { // in cacheonly mode, create a profile from the first cache bin accessed // (they SHOULD all be the same...) _profile = Profile::create( *meta._sourceProfile ); _tileSize = *meta._sourceTileSize; } } else { // cache does not exist, so try to create it. A valid TileSource is necessary // for this. if ( tileSource && getProfile() ) { // no existing metadata; create some. meta._cacheBinId = binId; meta._sourceName = this->getName(); meta._sourceDriver = tileSource->getOptions().getDriver(); meta._sourceTileSize = getTileSize(); meta._sourceProfile = getProfile()->toProfileOptions(); meta._cacheProfile = profile->toProfileOptions(); meta._cacheCreateTime = DateTime().asTimeStamp(); // store it in the cache bin. newBin->writeMetadata( meta.getConfig() ); } else if ( isCacheOnly() ) { OE_WARN << LC << "Failed to open a cache for layer " "because cache_only policy is in effect and bin [" << binId << "] " "could not be located." << std::endl; return 0L; } else { OE_WARN << LC << "Failed to create cache bin [" << binId << "] " "because there is no valid tile source." << std::endl; return 0L; } } // store the bin. CacheBinInfo& newInfo = _cacheBins[binId]; newInfo._metadata = meta; newInfo._bin = newBin.get(); OE_INFO << LC << "Opened cache bin [" << binId << "]" << std::endl; } else { // bin creation failed, so disable caching for this layer. setCachePolicy( CachePolicy::NO_CACHE ); OE_WARN << LC << "Failed to create a cache bin; cache disabled." << std::endl; } return newBin.get(); // not release() } }
TileSource::Status CompositeTileSource::initialize(const osgDB::Options* dbOptions) { _dbOptions = Registry::instance()->cloneOrCreateOptions(dbOptions); osg::ref_ptr<const Profile> profile = getProfile(); for(CompositeTileSourceOptions::ComponentVector::iterator i = _options._components.begin(); i != _options._components.end(); ) { if ( i->_imageLayerOptions.isSet() ) { if ( !i->_tileSourceInstance.valid() ) { i->_tileSourceInstance = TileSourceFactory::create( i->_imageLayerOptions->driver().value() ); if ( !i->_tileSourceInstance.valid() ) { OE_WARN << LC << "Could not find a TileSource for driver [" << i->_imageLayerOptions->driver()->getDriver() << "]" << std::endl; } } } if ( !i->_tileSourceInstance.valid() ) { OE_WARN << LC << "A component has no valid TileSource ... removing." << std::endl; i = _options._components.erase( i ); } else { TileSource* source = i->_tileSourceInstance.get(); if ( source ) { osg::ref_ptr<const Profile> localOverrideProfile = profile.get(); const TileSourceOptions& opt = source->getOptions(); if ( opt.profile().isSet() ) { localOverrideProfile = Profile::create( opt.profile().value() ); source->setProfile( localOverrideProfile.get() ); } // initialize the component tile source: TileSource::Status compStatus = source->startup( _dbOptions.get() ); if ( compStatus == TileSource::STATUS_OK ) { if ( !profile.valid() ) { // assume the profile of the first source to be the overall profile. profile = source->getProfile(); } else if ( !profile->isEquivalentTo( source->getProfile() ) ) { // if sub-sources have different profiles, print a warning because this is // not supported! OE_WARN << LC << "Components with differing profiles are not supported. " << "Visual anomalies may result." << std::endl; } _dynamic = _dynamic || source->isDynamic(); // gather extents const DataExtentList& extents = source->getDataExtents(); for( DataExtentList::const_iterator j = extents.begin(); j != extents.end(); ++j ) { getDataExtents().push_back( *j ); } } else { // if even one of the components fails to initialize, the entire // composite tile source is invalid. return Status::Error("At least one component is invalid"); } } } ++i; } // set the new profile that was derived from the components setProfile( profile.get() ); _initialized = true; return STATUS_OK; }
void CompositeTileSource::initialize(const osgDB::Options* dbOptions, const Profile* overrideProfile ) { _dbOptions = dbOptions; osg::ref_ptr<const Profile> profile = overrideProfile; for(CompositeTileSourceOptions::ComponentVector::iterator i = _options._components.begin(); i != _options._components.end(); ) { if ( i->_imageLayerOptions.isSet() ) { if ( !i->_tileSourceInstance.valid() ) { i->_tileSourceInstance = TileSourceFactory::create( i->_imageLayerOptions->driver().value() ); if ( !i->_tileSourceInstance.valid() ) { OE_WARN << LC << "Could not find a TileSource for driver [" << i->_imageLayerOptions->driver()->getDriver() << "]" << std::endl; } } } if ( !i->_tileSourceInstance.valid() ) { OE_WARN << LC << "A component has no valid TileSource ... removing." << std::endl; i = _options._components.erase( i ); } else { TileSource* source = i->_tileSourceInstance.get(); if ( source ) { osg::ref_ptr<const Profile> localOverrideProfile = overrideProfile; const TileSourceOptions& opt = source->getOptions(); if ( opt.profile().isSet() ) localOverrideProfile = Profile::create( opt.profile().value() ); source->initialize( dbOptions, localOverrideProfile.get() ); if ( !profile.valid() ) { // assume the profile of the first source to be the overall profile. profile = source->getProfile(); } else if ( !profile->isEquivalentTo( source->getProfile() ) ) { // if sub-sources have different profiles, print a warning because this is // not supported! OE_WARN << LC << "Components with differing profiles are not supported. " << "Visual anomalies may result." << std::endl; } _dynamic = _dynamic || source->isDynamic(); // gather extents const DataExtentList& extents = source->getDataExtents(); for( DataExtentList::const_iterator j = extents.begin(); j != extents.end(); ++j ) { getDataExtents().push_back( *j ); } } } ++i; } setProfile( profile.get() ); _initialized = true; }