void ShaderOptions::fromConfig(const Config& conf) { _code = conf.value(); _samplers.clear(); ConfigSet s = conf.children("sampler"); for (ConfigSet::const_iterator i = s.begin(); i != s.end(); ++i) { _samplers.push_back(Sampler()); _samplers.back()._name = i->value("name"); const Config* urlarray = i->find("array"); if (urlarray) { ConfigSet uris = urlarray->children("url"); for (ConfigSet::const_iterator j = uris.begin(); j != uris.end(); ++j) { URI uri(j->value(), URIContext(conf.referrer())); _samplers.back()._uris.push_back(uri); } } else { optional<URI> uri; i->get("url", uri); if (uri.isSet()) _samplers.back()._uris.push_back(uri.get()); } } s = conf.children("uniform"); for (ConfigSet::const_iterator i = s.begin(); i != s.end(); ++i) { _uniforms.push_back(Uniform()); _uniforms.back()._name = i->value("name"); i->get("value", _uniforms.back()._value); } }
bool TileMapServiceReader::read( const Config& conf, TileMapEntryList& tileMaps) { const Config* TileMapServiceConf = conf.find("tilemapservice"); if (!TileMapServiceConf) { OE_NOTICE << "Couldn't find root TileMapService element" << std::endl; return false; } const Config* TileMapsConf = TileMapServiceConf->find("tilemaps"); if (TileMapsConf) { const ConfigSet& TileMaps = TileMapsConf->children("tilemap"); if (TileMaps.size() == 0) { return false; } for (ConfigSet::const_iterator itr = TileMaps.begin(); itr != TileMaps.end(); ++itr) { std::string href = itr->value("href"); std::string title = itr->value("title"); std::string profile = itr->value("profile"); std::string srs = itr->value("srs"); tileMaps.push_back( TileMapEntry( title, href, srs, profile ) ); } return true; } return false; }
Biome::Biome(const Config& conf) { conf.getIfSet( "name", _name ); conf.getIfSet( "catalog", _catalogURI ); // only supports lat long for now const SpatialReference* srs = SpatialReference::create("wgs84"); const Config& extentsConf = conf.child("regions"); for(ConfigSet::const_iterator i = extentsConf.children().begin(); i != extentsConf.children().end(); ++i) { double xmin = i->value("xmin", -DBL_MAX); double xmax = i->value("xmax", DBL_MAX); double ymin = i->value("ymin", -DBL_MAX); double ymax = i->value("ymax", DBL_MAX); double zmin = i->value("zmin", -DBL_MAX); double zmax = i->value("zmax", DBL_MAX); _regions.push_back( Region() ); _regions.back().extent = GeoExtent(srs, xmin, ymin, xmax, ymax); _regions.back().zmin = zmin; _regions.back().zmax = zmax; } }
TerrainLayer::CacheBinMetadata::CacheBinMetadata(const Config& conf) { _valid = !conf.empty(); conf.getIfSet("cachebin_id", _cacheBinId); conf.getIfSet("source_name", _sourceName); conf.getIfSet("source_driver", _sourceDriver); conf.getIfSet("source_tile_size", _sourceTileSize); conf.getObjIfSet("source_profile", _sourceProfile); conf.getObjIfSet("cache_profile", _cacheProfile); conf.getIfSet("cache_create_time", _cacheCreateTime); const Config* extentsRoot = conf.child_ptr("extents"); if ( extentsRoot ) { const ConfigSet& extents = extentsRoot->children(); for (ConfigSet::const_iterator i = extents.begin(); i != extents.end(); ++i) { std::string srsString; double xmin, ymin, xmax, ymax; optional<unsigned> minLevel, maxLevel; srsString = i->value("srs"); xmin = i->value("xmin", 0.0f); ymin = i->value("ymin", 0.0f); xmax = i->value("xmax", 0.0f); ymax = i->value("ymax", 0.0f); i->getIfSet("minlevel", minLevel); i->getIfSet("maxlevel", maxLevel); const SpatialReference* srs = SpatialReference::get(srsString); DataExtent e( GeoExtent(srs, xmin, ymin, xmax, ymax) ); if (minLevel.isSet()) e.minLevel() = minLevel.get(); if (maxLevel.isSet()) e.maxLevel() = maxLevel.get(); _dataExtents.push_back(e); } } // check for validity. This will reject older caches that don't have // sufficient attribution. if (_valid) { if (!conf.hasValue("source_tile_size") || !conf.hasChild("source_profile") || !conf.hasChild("cache_profile")) { _valid = false; } } }
void ZoneOptions::fromConfig(const Config& conf) { conf.getIfSet("name", _name); const Config* boundaries = conf.child_ptr("boundaries"); if ( boundaries ) { for(ConfigSet::const_iterator i = boundaries->children().begin(); i != boundaries->children().end(); ++i) { _boundaries.push_back(osg::BoundingBox( i->value("xmin", -FLT_MAX), i->value("ymin", -FLT_MAX), i->value("zmin", -FLT_MAX), i->value("xmax", FLT_MAX), i->value("ymax", FLT_MAX), i->value("zmax", FLT_MAX))); } } conf.getObjIfSet( "surface", _surface ); conf.getObjIfSet( "land_cover", _landCover ); }
void KML_Model::parseStyle(const Config& conf, KMLContext& cx, Style& style) { ModelSymbol* model = 0L; std::string url = KMLUtils::parseLink(conf); if ( !url.empty() ) { if ( !model ) model = style.getOrCreate<ModelSymbol>(); model->url()->setLiteral( url ); model->url()->setURIContext( URIContext(conf.referrer()) ); } Config scale = conf.child("scale"); if (!scale.empty()) { if ( !model ) model = style.getOrCreate<ModelSymbol>(); //TODO: Support XYZ scale instead of single value model->scale() = scale.value("x", 1.0); } Config orientation = conf.child("orientation"); if (!orientation.empty()) { if ( !model ) model = style.getOrCreate<ModelSymbol>(); double h = orientation.value("heading", 0); if ( !osg::equivalent(h, 0.0) ) model->heading() = NumericExpression( h ); double p = orientation.value("tilt", 0); if ( !osg::equivalent(p, 0.0) ) model->pitch() = NumericExpression( p ); double r = orientation.value("roll", 0); if ( !osg::equivalent(r, 0.0) ) model->roll() = NumericExpression( r ); } // Read and store file path aliases from a KML ResourceMap. Config resource_map = conf.child("resourcemap"); if ( !resource_map.empty() ) { const ConfigSet aliases = resource_map.children("alias"); for( ConfigSet::const_iterator i = aliases.begin(); i != aliases.end(); ++i ) { std::string source = i->value("sourcehref"); std::string target = i->value("targethref"); if ( !source.empty() || !target.empty() ) { if ( !model ) model = style.getOrCreate<ModelSymbol>(); model->uriAliasMap()->insert( source, target ); } } } KML_Geometry::parseStyle(conf, cx, style); }
XmlElement::XmlElement( const Config& conf ) { name = conf.key(); for( Properties::const_iterator i = conf.attrs().begin(); i != conf.attrs().end(); i++ ) attrs[i->first] = i->second; for( ConfigSet::const_iterator j = conf.children().begin(); j != conf.children().end(); j++ ) { if (!j->children().empty()) { children.push_back( new XmlElement( *j ) ); } else { addSubElement(j->key(), j->attrs(), j->value()); } } }
void ChromeMetricsBackend::end(const std::string& name, const Config& args) { osg::Timer_t now = osg::Timer::instance()->tick(); OpenThreads::ScopedLock< OpenThreads::Mutex > lk(_mutex); if (_firstEvent) { _firstEvent = false; } else { _metricsFile << "," << std::endl; } _metricsFile << "{" << "\"cat\": \"" << "" << "\"," << "\"pid\": \"" << 0 << "\"," << "\"tid\": \"" << osgEarth::Threading::getCurrentThreadId() << "\"," << "\"ts\": \"" << std::setprecision(9) << osg::Timer::instance()->delta_u(_startTime, now) << "\"," << "\"ph\": \"E\"," << "\"name\": \"" << name << "\""; if (!args.empty()) { _metricsFile << "," << std::endl << " \"args\": {"; bool first = true; for( ConfigSet::const_iterator i = args.children().begin(); i != args.children().end(); ++i ) { if (first) { first = !first; } else { _metricsFile << "," << std::endl; } _metricsFile << "\"" << i->key() << "\" : \"" << i->value() << "\""; } _metricsFile << "}"; } _metricsFile << "}"; }
XmlElement::XmlElement( const Config& conf ) { name = conf.key(); if ( !conf.value().empty() ) { children.push_back( new XmlText(conf.value()) ); } for( ConfigSet::const_iterator j = conf.children().begin(); j != conf.children().end(); j++ ) { if ( j->isSimple() ) { attrs[j->key()] = j->value(); } else if ( j->children().size() > 0 ) { children.push_back( new XmlElement(*j) ); } } }
/** * Create and return an image for the given TileKey. */ osg::Image* createImage( const TileKey& key, ProgressCallback* progress ) { if (_debugDirect) { //osg::Image* image = new osg::Image; //image->allocateImage(256,256,1, GL_RGB, GL_UNSIGNED_BYTE); //return image; return osgDB::readImageFile( getDirectURI(key) ); //return URI(getDirectURI(key)).getImage(_dbOptions.get(), progress); } // center point of the tile (will be in spherical mercator) double x, y; key.getExtent().getCentroid(x, y); // transform it to lat/long: GeoPoint geo; GeoPoint( getProfile()->getSRS(), x, y ).transform( getProfile()->getSRS()->getGeographicSRS(), geo ); // contact the REST API. Docs are here: // http://msdn.microsoft.com/en-us/library/ff701716.aspx // construct the request URI: std::string request = Stringify() << std::setprecision(12) << _options.imageryMetadataAPI().get() // base REST API << "/" << _options.imagerySet().get() // imagery set to use << "/" << geo.y() << "," << geo.x() // center point in lat/long << "?zl=" << key.getLOD() + 1 // zoom level << "&o=json" // response format << "&key=" << _options.key().get(); // API key // check the URI cache. URI location; TileURICache::Record rec; if ( _tileURICache.get(request, rec) ) { location = URI(rec.value()); //CacheStats stats = _tileURICache.getStats(); //OE_INFO << "Ratio = " << (stats._hitRatio*100) << "%" << std::endl; } else { unsigned c = ++_apiCount; if ( c % 25 == 0 ) OE_INFO << LC << "API calls = " << c << std::endl; // fetch it: ReadResult metadataResult = URI(request).readString(_dbOptions, progress); if ( metadataResult.failed() ) { // check for a REST error: if ( metadataResult.code() == ReadResult::RESULT_SERVER_ERROR ) { OE_WARN << LC << "REST API request error!" << std::endl; Config metadata; std::string content = metadataResult.getString(); metadata.fromJSON( content ); ConfigSet errors = metadata.child("errorDetails").children(); for(ConfigSet::const_iterator i = errors.begin(); i != errors.end(); ++i ) { OE_WARN << LC << "REST API: " << i->value() << std::endl; } return 0L; } else { OE_WARN << LC << "Request error: " << metadataResult.getResultCodeString() << std::endl; } return 0L; } // decode it: Config metadata; if ( !metadata.fromJSON(metadataResult.getString()) ) { OE_WARN << LC << "Error decoding REST API response" << std::endl; return 0L; } // check the vintage field. If it's empty, that means we got a "no data" tile. Config* vintageEnd = metadata.find("vintageEnd"); if ( !vintageEnd || vintageEnd->value().empty() ) { OE_DEBUG << LC << "NO data image encountered." << std::endl; return 0L; } // find the tile URI: Config* locationConf= metadata.find("imageUrl"); if ( !locationConf ) { OE_WARN << LC << "REST API JSON parsing error (imageUrl not found)" << std::endl; return 0L; } location = URI( locationConf->value() ); _tileURICache.insert( request, location.full() ); } // request the actual tile //OE_INFO << "key = " << key.str() << ", URL = " << location->value() << std::endl; //osg::Image* image = location.getImage(_dbOptions.get(), progress); osg::Image* image = osgDB::readImageFile( location.full() ); if ( image && _geom.valid() ) { GeometryRasterizer rasterizer( image->s(), image->t() ); rasterizer.draw( _geom.get(), osg::Vec4(1,1,1,1) ); osg::ref_ptr<osg::Image> overlay = rasterizer.finalize(); ImageUtils::PixelVisitor<AlphaBlend> blend; blend.accept( overlay.get(), image ); } return image; }