Status initialize(const osgDB::Options* dbOptions) { _dbOptions = Registry::instance()->cloneOrCreateOptions(dbOptions); URI xyzURI = _options.url().value(); if ( xyzURI.empty() ) { return Status::Error( "Fail: driver requires a valid \"url\" property" ); } // driver requires a profile. if ( !getProfile() ) { return Status::Error( "An explicit profile definition is required by the XYZ driver." ); } _template = xyzURI.full(); _rotateStart = _template.find("["); _rotateEnd = _template.find("]"); if ( _rotateStart != std::string::npos && _rotateEnd != std::string::npos && _rotateEnd-_rotateStart > 1 ) { _rotateString = _template.substr(_rotateStart, _rotateEnd-_rotateStart+1); _rotateChoices = _template.substr(_rotateStart+1, _rotateEnd-_rotateStart-1); } _format = _options.format().isSet() ? *_options.format() : osgDB::getLowerCaseFileExtension( xyzURI.base() ); return STATUS_OK; }
bool SubstituteModelFilter::findResource(const URI& uri, const InstanceSymbol* symbol, FilterContext& context, std::set<URI>& missing, osg::ref_ptr<InstanceResource>& output ) { // be careful about refptrs here since _instanceCache is an LRU. InstanceCache::Record rec; if ( _instanceCache.get(uri, rec) ) { // found it in the cache: output = rec.value().get(); } else if ( _resourceLib.valid() ) { // look it up in the resource library: output = _resourceLib->getInstance( uri.base(), context.getDBOptions() ); } else { // create it on the fly: output = symbol->createResource(); output->uri() = uri; _instanceCache.insert( uri, output.get() ); } // failed to find the instance. if ( !output.valid() ) { if ( missing.find(uri) == missing.end() ) { missing.insert(uri); OE_WARN << LC << "Failed to locate resource: " << uri.full() << std::endl; } } return output.valid(); }
// one-time initialization (per source) Status initialize(const osgDB::Options* dbOptions) { _dbOptions = Registry::instance()->cloneOrCreateOptions(dbOptions); const Profile* profile = getProfile(); URI tmsURI = _options.url().value(); if ( tmsURI.empty() ) { return Status::Error( "Fail: TMS driver requires a valid \"url\" property" ); } // Take the override profile if one is given if ( profile ) { OE_INFO << LC << "Using override profile \"" << getProfile()->toString() << "\" for URI \"" << tmsURI.base() << "\"" << std::endl; _tileMap = TMS::TileMap::create( _options.url()->full(), profile, _options.format().value(), _options.tileSize().value(), _options.tileSize().value() ); } else { // Attempt to read the tile map parameters from a TMS TileMap XML tile on the server: _tileMap = TMS::TileMapReaderWriter::read( tmsURI.full(), _dbOptions.get() ); if (!_tileMap.valid()) { return Status::Error( Stringify() << "Failed to read tilemap from " << tmsURI.full() ); } OE_INFO << LC << "TMS tile map datestamp = " << DateTime(_tileMap->getTimeStamp()).asRFC1123() << std::endl; profile = _tileMap->createProfile(); if ( profile ) setProfile( profile ); } // Make sure we've established a profile by this point: if ( !profile ) { return Status::Error( Stringify() << "Failed to establish a profile for " << tmsURI.full() ); } // TileMap and profile are valid at this point. Build the tile sets. // Automatically set the min and max level of the TileMap if ( _tileMap->getTileSets().size() > 0 ) { OE_DEBUG << LC << "TileMap min/max " << _tileMap->getMinLevel() << ", " << _tileMap->getMaxLevel() << std::endl; if (_tileMap->getDataExtents().size() > 0) { for (DataExtentList::iterator itr = _tileMap->getDataExtents().begin(); itr != _tileMap->getDataExtents().end(); ++itr) { this->getDataExtents().push_back(*itr); } } else { //Push back a single area that encompasses the whole profile going up to the max level this->getDataExtents().push_back(DataExtent(profile->getExtent(), 0, _tileMap->getMaxLevel())); } } // set up the IO options so that we do not cache TMS tiles: CachePolicy::NO_CACHE.apply( _dbOptions.get() ); return STATUS_OK; }
Status TMSTileSource::initialize(const osgDB::Options* dbOptions) { // local copy of options we can modify if necessary. _dbOptions = Registry::instance()->cloneOrCreateOptions(dbOptions); // see if the use passed in a profile const Profile* profile = getProfile(); // URI is mandatory. URI tmsURI = _options.url().value(); if ( tmsURI.empty() ) { return Status::Error( Status::ConfigurationError, "Fail: TMS driver requires a valid \"url\" property" ); } // A repo is writable only if it's local. if ( tmsURI.isRemote() ) { OE_DEBUG << LC << "Repo is remote; opening in read-only mode" << std::endl; } // Is this a new repo? (You can only create a new repo at a local non-archive URI.) bool isNewRepo = false; if (!tmsURI.isRemote() && !osgEarth::isPathToArchivedFile(tmsURI.full()) && !osgDB::fileExists(tmsURI.full()) ) { isNewRepo = true; // new repo REQUIRES a profile: if ( !profile ) { return Status::Error(Status::ConfigurationError, "Fail: profile required to create new TMS repo"); } } // Take the override profile if one is given if ( profile ) { OE_INFO << LC << "Using express profile \"" << getProfile()->toString() << "\" for URI \"" << tmsURI.base() << "\"" << std::endl; DataExtentList extents; _tileMap = TMS::TileMap::create( _options.url()->full(), profile, extents, _options.format().value(), 256, 256); //getPixelsPerTile(), //getPixelsPerTile() ); // If this is a new repo, write the tilemap file to disk now. if ( isNewRepo ) { if ( !_options.format().isSet() ) { return Status::Error(Status::ConfigurationError, "Missing required \"format\" property: e.g. png, jpg"); } TMS::TileMapReaderWriter::write( _tileMap.get(), tmsURI.full() ); OE_INFO << LC << "Created new TMS repo at " << tmsURI.full() << std::endl; } } else { // Attempt to read the tile map parameters from a TMS TileMap XML tile on the server: _tileMap = TMS::TileMapReaderWriter::read( tmsURI.full(), _dbOptions.get() ); if (!_tileMap.valid()) { return Status::Error( Status::ResourceUnavailable, Stringify() << "Failed to read configuration from " << tmsURI.full() ); } OE_INFO << LC << "TMS tile map datestamp = " << DateTime(_tileMap->getTimeStamp()).asRFC1123() << std::endl; profile = _tileMap->createProfile(); if ( profile ) setProfile( profile ); } // Make sure we've established a profile by this point: if ( !profile ) { return Status::Error( Stringify() << "Failed to establish a profile for " << tmsURI.full() ); } // resolve the writer if ( !tmsURI.isRemote() && !resolveWriter() ) { OE_WARN << LC << "Cannot create writer; writing disabled" << std::endl; } // TileMap and profile are valid at this point. Build the tile sets. // Automatically set the min and max level of the TileMap if ( _tileMap->getTileSets().size() > 0 ) { OE_DEBUG << LC << "TileMap min/max " << _tileMap->getMinLevel() << ", " << _tileMap->getMaxLevel() << std::endl; if (_tileMap->getDataExtents().size() > 0) { for (DataExtentList::iterator itr = _tileMap->getDataExtents().begin(); itr != _tileMap->getDataExtents().end(); ++itr) { this->getDataExtents().push_back(*itr); } } } return STATUS_OK; }