void KML_PolyStyle::scan( const Config& conf, Style& style, KMLContext& cx ) { if ( !conf.empty() ) { bool fill = true; if ( conf.hasValue("fill") ) { fill = as<int>(conf.value("fill"), 1) == 1; } bool outline = false; if ( conf.hasValue("outline") ) { outline = as<int>(conf.value("outline"), 0) == 1; } Color color(Color::White); if ( conf.hasValue("color") ) { color = Color( Stringify() << "#" << conf.value("color"), Color::ABGR ); } if ( fill ) { PolygonSymbol* poly = style.getOrCreate<PolygonSymbol>(); poly->fill()->color() = color; } else { LineSymbol* line = style.getOrCreate<LineSymbol>(); line->stroke()->color() = color; } } }
void compute() { //Tell the calculator about the new start/end points _profileCalculator->setStartEnd( GeoPoint(_mapNode->getMapSRS(), _start.x(), _start.y(), 0), GeoPoint(_mapNode->getMapSRS(), _end.x(), _end.y(), 0)); if (_featureNode.valid()) { _root->removeChild( _featureNode.get() ); _featureNode = 0; } LineString* line = new LineString(); line->push_back( _start ); line->push_back( _end ); Feature* feature = new Feature(line, _mapNode->getMapSRS()); feature->geoInterp() = GEOINTERP_GREAT_CIRCLE; //Define a style for the line Style style; LineSymbol* ls = style.getOrCreateSymbol<LineSymbol>(); ls->stroke()->color() = Color::Yellow; ls->stroke()->width() = 2.0f; ls->tessellation() = 20; style.getOrCreate<AltitudeSymbol>()->clamping() = AltitudeSymbol::CLAMP_TO_TERRAIN; feature->style() = style; _featureNode = new FeatureNode( _mapNode, feature ); //Disable lighting _featureNode->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF); _root->addChild( _featureNode.get() ); }
void KML_LineStyle::scan( const Config& conf, Style& style, KMLContext& cx ) { if ( !conf.empty() ) { LineSymbol* line = style.getOrCreate<LineSymbol>(); if ( conf.hasValue("color") ) { line->stroke()->color() = Color( Stringify() << "#" << conf.value("color"), Color::ABGR ); } if ( conf.hasValue("width") ) { line->stroke()->width() = as<float>( conf.value("width"), 1.0f ); } } }
StyleSheet* buildStyleSheet( const osg::Vec4 &color, float width ) { // Define a style for the feature data. Since we are going to render the // vectors as lines, configure the line symbolizer: Style style; LineSymbol* ls = style.getOrCreateSymbol<LineSymbol>(); ls->stroke()->color() = color; ls->stroke()->width() = width; //AltitudeSymbol* as = style.getOrCreate<AltitudeSymbol>(); //as->clamping() = AltitudeSymbol::CLAMP_TO_TERRAIN; StyleSheet* styleSheet = new StyleSheet(); styleSheet->addStyle( style ); return styleSheet; }
void KML_LineStyle::scan( xml_node<>* node, Style& style, KMLContext& cx ) { if ( node ) { LineSymbol* line = style.getOrCreate<LineSymbol>(); std::string color = getValue(node, "color"); if ( !color.empty() ) { line->stroke()->color() = Color( Stringify() << "#" << color, Color::ABGR ); } std::string width = getValue(node, "width"); if ( !width.empty() ) { line->stroke()->width() = as<float>( width, 1.0f ); } } }
void KML_LineString::parseStyle( const Config& conf, KMLContext& cs, Style& style ) { KML_Geometry::parseStyle(conf, cs, style); // need a line symbol minimally LineSymbol* line = style.get<LineSymbol>(); if ( !line ) { line = style.getOrCreate<LineSymbol>(); line->stroke()->color() = osg::Vec4f(1,1,1,1); } if ( conf.value("tessellate") == "1" ) { line->tessellation() = 20; // KML default } }
void KML_LinearRing::parseStyle( xml_node<>* node, KMLContext& cs, Style& style ) { KML_Geometry::parseStyle(node, cs, style); // need a line symbol minimally LineSymbol* line = style.get<LineSymbol>(); if ( !line ) { line = style.getOrCreate<LineSymbol>(); line->stroke()->color() = osg::Vec4f(1,1,1,1); } if ( getValue(node, "tessellate") == "1" ) { line->tessellation() = 20; } }
MGRSGraticule::MGRSGraticule( MapNode* mapNode ) : UTMGraticule( 0L ) { _mapNode = mapNode; init(); if ( !_options->secondaryStyle().isSet() ) { LineSymbol* line = _options->secondaryStyle()->getOrCreate<LineSymbol>(); line->stroke()->color() = Color(Color::White, 0.5f); line->stroke()->stipple() = 0x1111; TextSymbol* text = _options->secondaryStyle()->getOrCreate<TextSymbol>(); text->fill()->color() = Color(Color::White, 0.3f); text->halo()->color() = Color(Color::Black, 0.1f); text->alignment() = TextSymbol::ALIGN_CENTER_CENTER; } _minDepthOffset = DepthOffsetUtils::createMinOffsetUniform(); _minDepthOffset->set( 11000.0f ); }
Style buildStyle( const osg::Vec4 &color, float width ) { // Define a style for the feature data. Since we are going to render the // vectors as lines, configure the line symbolizer: Style style; LineSymbol* ls = style.getOrCreateSymbol<LineSymbol>(); ls->stroke()->color() = color; ls->stroke()->width() = width; ls->tessellation() = 10; AltitudeSymbol* as = style.getOrCreate<AltitudeSymbol>(); as->clamping() = AltitudeSymbol::CLAMP_TO_TERRAIN; as->technique() = AltitudeSymbol::TECHNIQUE_SCENE; RenderSymbol* rs = style.getOrCreateSymbol<RenderSymbol>(); rs->depthOffset()->enabled() = true; rs->depthOffset()->minBias() = 1000; return style; }
void MGRSGraticule::setUpDefaultStyles() { if (!options().gzdStyle().isSet()) { LineSymbol* line = options().gzdStyle()->getOrCreate<LineSymbol>(); line->stroke()->color() = Color::Gray; line->stroke()->width() = 1.0; line->tessellation() = 20; TextSymbol* text = options().gzdStyle()->getOrCreate<TextSymbol>(); text->fill()->color() = Color(Color::White, 0.3f); text->halo()->color() = Color(Color::Black, 0.2f); text->alignment() = TextSymbol::ALIGN_CENTER_CENTER; } if (!options().sqidStyle().isSet()) { LineSymbol* line = options().sqidStyle()->getOrCreate<LineSymbol>(); line->stroke()->color() = Color(Color::White, 0.5f); line->stroke()->stipplePattern() = 0x1111; TextSymbol* text = options().sqidStyle()->getOrCreate<TextSymbol>(); text->fill()->color() = Color(Color::White, 0.3f); text->halo()->color() = Color(Color::Black, 0.1f); text->alignment() = TextSymbol::ALIGN_CENTER_CENTER; } }
void UTMGraticule::rebuild() { // clear everything out this->removeChildren( 0, this->getNumChildren() ); // requires a map node if ( !getMapNode() ) { return; } // requires a geocentric map if ( !getMapNode()->isGeocentric() ) { OE_WARN << LC << "Projected map mode is not yet supported" << std::endl; return; } const Profile* mapProfile = getMapNode()->getMap()->getProfile(); _profile = Profile::create( mapProfile->getSRS(), mapProfile->getExtent().xMin(), mapProfile->getExtent().yMin(), mapProfile->getExtent().xMax(), mapProfile->getExtent().yMax(), 8, 4 ); _featureProfile = new FeatureProfile(_profile->getSRS()); //todo: do this right.. osg::StateSet* set = this->getOrCreateStateSet(); set->setMode( GL_LIGHTING, 0 ); set->setMode( GL_BLEND, 1 ); // set up default options if the caller did not supply them if ( !_options.isSet() ) { _options->primaryStyle() = Style(); LineSymbol* line = _options->primaryStyle()->getOrCreate<LineSymbol>(); line->stroke()->color() = Color::Gray; line->stroke()->width() = 1.0; line->tessellation() = 20; AltitudeSymbol* alt = _options->primaryStyle()->getOrCreate<AltitudeSymbol>(); TextSymbol* text = _options->primaryStyle()->getOrCreate<TextSymbol>(); text->fill()->color() = Color(Color::White, 0.3f); text->halo()->color() = Color(Color::Black, 0.2f); text->alignment() = TextSymbol::ALIGN_CENTER_CENTER; } // rebuild the graph: _root = new DrapeableNode( getMapNode(), false ); this->addChild( _root ); #if 0 // set up depth offsetting. osg::StateSet* s = _root->getOrCreateStateSet(); s->setAttributeAndModes( DepthOffsetUtils::getOrCreateProgram(), 1 ); s->addUniform( DepthOffsetUtils::getIsNotTextUniform() ); osg::Uniform* u = DepthOffsetUtils::createMinOffsetUniform(); u->set( 10000.0f ); s->addUniform( u ); #endif // build the base Grid Zone Designator (GZD) loolup table. This is a table // that maps the GZD string to its extent. static std::string s_gzdRows( "CDEFGHJKLMNPQRSTUVWX" ); const SpatialReference* geosrs = _profile->getSRS()->getGeographicSRS(); // build the lateral zones: for( unsigned zone = 0; zone < 60; ++zone ) { for( unsigned row = 0; row < s_gzdRows.size(); ++row ) { double yMaxExtra = row == s_gzdRows.size()-1 ? 4.0 : 0.0; // extra 4 deg for row X GeoExtent cellExtent( geosrs, -180.0 + double(zone)*6.0, -80.0 + row*8.0, -180.0 + double(zone+1)*6.0, -80.0 + double(row+1)*8.0 + yMaxExtra ); _gzd[ Stringify() << (zone+1) << s_gzdRows[row] ] = cellExtent; } } // the polar zones (UPS): _gzd["1Y"] = GeoExtent( geosrs, -180.0, 84.0, 0.0, 90.0 ); _gzd["1Z"] = GeoExtent( geosrs, 0.0, 84.0, 180.0, 90.0 ); _gzd["1A"] = GeoExtent( geosrs, -180.0, -90.0, 0.0, -80.0 ); _gzd["1B"] = GeoExtent( geosrs, 0.0, -90.0, 180.0, -80.0 ); // replace the "exception" zones in Norway and Svalbard _gzd["31V"] = GeoExtent( geosrs, 0.0, 56.0, 3.0, 64.0 ); _gzd["32V"] = GeoExtent( geosrs, 3.0, 56.0, 12.0, 64.0 ); _gzd["31X"] = GeoExtent( geosrs, 0.0, 72.0, 9.0, 84.0 ); _gzd["33X"] = GeoExtent( geosrs, 9.0, 72.0, 21.0, 84.0 ); _gzd["35X"] = GeoExtent( geosrs, 21.0, 72.0, 33.0, 84.0 ); _gzd["37X"] = GeoExtent( geosrs, 33.0, 72.0, 42.0, 84.0 ); // ..and remove the non-existant zones: _gzd.erase( "32X" ); _gzd.erase( "34X" ); _gzd.erase( "36X" ); // now build the lateral tiles for the GZD level. for( SectorTable::iterator i = _gzd.begin(); i != _gzd.end(); ++i ) { osg::Node* tile = buildGZDTile( i->first, i->second ); if ( tile ) _root->addChild( tile ); } DepthOffsetUtils::prepareGraph( _root ); }
int main(int argc, char** argv) { osg::ArgumentParser arguments(&argc,argv); if ( arguments.read("--help") ) return usage(argv[0]); // general setup: osgViewer::Viewer viewer(arguments); viewer.getDatabasePager()->setUnrefImageDataAfterApplyPolicy( false, false ); viewer.setCameraManipulator( new EarthManipulator(arguments) ); viewer.getCamera()->setSmallFeatureCullingPixelSize(-1.0f); viewer.getCamera()->setNearFarRatio(0.00002); // load an earth file, and support all or our example command-line options // and earth file <external> tags osg::Node* node = MapNodeHelper().load( arguments, &viewer ); if ( node ) { MapNode* mapNode = MapNode::get(node); if ( !mapNode ) return usage(argv[0]); // Create the WFS driver: osgEarth::Drivers::WFSFeatureOptions wfs; wfs.url() = osgEarth::URI("http://demo.opengeo.org/geoserver/wfs"); wfs.typeName() = "states"; wfs.outputFormat() = "json"; // JSON or GML // Configure a rendering style: Style style; style.setName( "states" ); LineSymbol* line = style.getOrCreate<LineSymbol>(); line->stroke()->color() = Color::Yellow; line->stroke()->width() = 5.0f; line->stroke()->widthUnits() = Units::PIXELS; AltitudeSymbol* alt = style.getOrCreate<AltitudeSymbol>(); alt->clamping() = AltitudeSymbol::CLAMP_TO_TERRAIN; alt->technique() = AltitudeSymbol::TECHNIQUE_DRAPE; // Configure a model layer to render the features: osgEarth::Drivers::FeatureGeomModelOptions geom; geom.featureOptions() = wfs; geom.styles() = new StyleSheet(); geom.styles()->addStyle(style); // Make the new layer and add it to the map. ModelLayerOptions layerOptions("states", geom); ModelLayer* layer = new ModelLayer(layerOptions); mapNode->getMap()->addModelLayer(layer); viewer.setSceneData( node ); return viewer.run(); } else { return usage(argv[0]); } }
bool SLDReader::readStyleFromCSSParams( const Config& conf, Style& sc ) { sc.setName( conf.key() ); LineSymbol* line = 0L; PolygonSymbol* polygon = 0L; PointSymbol* point = 0L; TextSymbol* text = 0L; ExtrusionSymbol* extrusion = 0L; MarkerSymbol* marker = 0L; AltitudeSymbol* altitude = 0L; for(Properties::const_iterator p = conf.attrs().begin(); p != conf.attrs().end(); p++ ) { if ( p->first == CSS_STROKE ) { if (!line) line = sc.getOrCreateSymbol<LineSymbol>(); line->stroke()->color() = htmlColorToVec4f( p->second ); } else if ( p->first == CSS_STROKE_OPACITY ) { if (!line) line = sc.getOrCreateSymbol<LineSymbol>(); line->stroke()->color().a() = as<float>( p->second, 1.0f ); } else if ( p->first == CSS_STROKE_WIDTH ) { if (!line) line = sc.getOrCreateSymbol<LineSymbol>(); line->stroke()->width() = as<float>( p->second, 1.0f ); } else if ( p->first == CSS_STROKE_LINECAP ) { if (!line) line = sc.getOrCreateSymbol<LineSymbol>(); parseLineCap( p->second, line->stroke()->lineCap() ); } else if ( p->first == CSS_FILL ) { if (!polygon) polygon = sc.getOrCreateSymbol<PolygonSymbol>(); polygon->fill()->color() = htmlColorToVec4f( p->second ); if ( !point ) point = sc.getOrCreateSymbol<PointSymbol>(); point->fill()->color() = htmlColorToVec4f( p->second ); if ( !text ) text = new TextSymbol(); text->fill()->color() = htmlColorToVec4f( p->second ); } else if ( p->first == CSS_FILL_OPACITY ) { if (!polygon) polygon = sc.getOrCreateSymbol<PolygonSymbol>(); polygon->fill()->color().a() = as<float>( p->second, 1.0f ); if (!polygon) polygon = sc.getOrCreateSymbol<PolygonSymbol>(); point->fill()->color().a() = as<float>( p->second, 1.0f ); if (!text) text = sc.getOrCreateSymbol<TextSymbol>(); text->fill()->color().a() = as<float>( p->second, 1.0f ); } else if (p->first == CSS_POINT_SIZE) { if ( !point ) point = sc.getOrCreateSymbol<PointSymbol>(); point->size() = as<float>(p->second, 1.0f); } else if (p->first == CSS_TEXT_SIZE) { if (!text) text = sc.getOrCreateSymbol<TextSymbol>(); text->size() = as<float>(p->second, 32.0f); } else if (p->first == CSS_TEXT_FONT) { if (!text) text = sc.getOrCreateSymbol<TextSymbol>(); text->font() = p->second; } else if (p->first == CSS_TEXT_HALO) { if (!text) text = sc.getOrCreateSymbol<TextSymbol>(); text->halo()->color() = htmlColorToVec4f( p->second ); } //else if (p->first == CSS_TEXT_ATTRIBUTE) //{ // if (!text) text = sc.getOrCreateSymbol<TextSymbol>(); // text->attribute() = p->second; //} else if (p->first == CSS_TEXT_ROTATE_TO_SCREEN) { if (!text) text = sc.getOrCreateSymbol<TextSymbol>(); if (p->second == "true") text->rotateToScreen() = true; else if (p->second == "false") text->rotateToScreen() = false; } else if (p->first == CSS_TEXT_SIZE_MODE) { if (!text) text = sc.getOrCreateSymbol<TextSymbol>(); if (p->second == "screen") text->sizeMode() = TextSymbol::SIZEMODE_SCREEN; else if (p->second == "object") text->sizeMode() = TextSymbol::SIZEMODE_OBJECT; } else if (p->first == CSS_TEXT_REMOVE_DUPLICATE_LABELS) { if (!text) text = sc.getOrCreateSymbol<TextSymbol>(); if (p->second == "true") text->removeDuplicateLabels() = true; else if (p->second == "false") text->removeDuplicateLabels() = false; } else if (p->first == CSS_TEXT_LINE_ORIENTATION) { if (!text) text = sc.getOrCreateSymbol<TextSymbol>(); if (p->second == "parallel") text->lineOrientation() = TextSymbol::LINEORIENTATION_PARALLEL; else if (p->second == "horizontal") text->lineOrientation() = TextSymbol::LINEORIENTATION_HORIZONTAL; else if (p->second == "perpendicular") text->lineOrientation() = TextSymbol::LINEORIENTATION_PERPENDICULAR; } else if (p->first == CSS_TEXT_LINE_PLACEMENT) { if (!text) text = sc.getOrCreateSymbol<TextSymbol>(); if (p->second == "centroid") text->linePlacement() = TextSymbol::LINEPLACEMENT_CENTROID; else if (p->second == "along-line") text->linePlacement() = TextSymbol::LINEPLACEMENT_ALONG_LINE; } else if (p->first == "text-content") { if (!text) text = sc.getOrCreate<TextSymbol>(); text->content() = StringExpression( p->second ); } else if (p->first == "text-priority") { if (!text) text = sc.getOrCreateSymbol<TextSymbol>(); text->priority() = NumericExpression( p->second ); } else if (p->first == "text-provider") { if (!text) text = sc.getOrCreate<TextSymbol>(); text->provider() = p->second; } //else if (p->first == CSS_TEXT_CONTENT) //{ // if (!text) text = sc.getOrCreateSymbol<TextSymbol>(); // text->content() = p->second; //} //else if (p->first == CSS_TEXT_CONTENT_ATTRIBUTE_DELIMITER) //{ // if (!text) text = sc.getOrCreateSymbol<TextSymbol>(); // text->contentAttributeDelimiter() = p->second; //} else if (p->first == "marker") { if (!marker) marker = sc.getOrCreateSymbol<MarkerSymbol>(); marker->url() = p->second; } else if (p->first == "marker-placement") { if (!marker) marker = sc.getOrCreateSymbol<MarkerSymbol>(); if (p->second == "centroid") marker->placement() = MarkerSymbol::PLACEMENT_CENTROID; else if (p->second == "interval") marker->placement() = MarkerSymbol::PLACEMENT_INTERVAL; else if (p->second == "random" ) marker->placement() = MarkerSymbol::PLACEMENT_RANDOM; } else if (p->first == "marker-density") { if (!marker) marker = sc.getOrCreateSymbol<MarkerSymbol>(); marker->density() = as<float>(p->second, 1.0f); } else if (p->first == "marker-random-seed") { if (!marker) marker = sc.getOrCreateSymbol<MarkerSymbol>(); marker->randomSeed() = as<unsigned>(p->second, 0); } else if (p->first == "marker-scale") { if (!marker) marker = sc.getOrCreateSymbol<MarkerSymbol>(); marker->scale() = stringToVec3f(p->second, osg::Vec3f(1,1,1)); } else if (p->first == "extrusion-height") { if (!extrusion) extrusion = sc.getOrCreateSymbol<ExtrusionSymbol>(); extrusion->heightExpression() = NumericExpression(p->second); } else if (p->first == "extrusion-flatten") { if (!extrusion) extrusion = sc.getOrCreateSymbol<ExtrusionSymbol>(); extrusion->flatten() = as<bool>(p->second, true); } else if (p->first == "altitude-clamping") { if (!altitude) altitude = sc.getOrCreateSymbol<AltitudeSymbol>(); if (p->second == "none" ) altitude->clamping() = AltitudeSymbol::CLAMP_NONE; else if (p->second == "terrain" ) altitude->clamping() = AltitudeSymbol::CLAMP_TO_TERRAIN; else if (p->second == "relative") altitude->clamping() = AltitudeSymbol::CLAMP_RELATIVE_TO_TERRAIN; } else if (p->first == "altitude-offset") { if (!altitude) altitude = sc.getOrCreateSymbol<AltitudeSymbol>(); altitude->verticalOffset() = as<float>( p->second, 0.0f ); } } #if 0 if (line) sc.addSymbol(line); if (polygon) sc.addSymbol(polygon); if (point) sc.addSymbol(point); if (text) sc.addSymbol(text); if (extrusion) sc.addSymbol(extrusion); if (marker) sc.addSymbol(marker); if (altitude) sc.addSymbol(altitude); #endif return true; }
void UTMGraticule::rebuild() { if (_root.valid() == false) return; osg::ref_ptr<const Map> map; if (!_map.lock(map)) return; // clear everything out _root->removeChildren( 0, _root->getNumChildren() ); // requires a geocentric map if ( !map->isGeocentric() ) { OE_WARN << LC << "Projected map mode is not yet supported" << std::endl; return; } const Profile* mapProfile = map->getProfile(); _profile = Profile::create( mapProfile->getSRS(), mapProfile->getExtent().xMin(), mapProfile->getExtent().yMin(), mapProfile->getExtent().xMax(), mapProfile->getExtent().yMax(), 8, 4 ); _featureProfile = new FeatureProfile(_profile->getSRS()); //todo: do this right.. osg::StateSet* set = this->getOrCreateStateSet(); GLUtils::setLighting(set, 0); set->setMode( GL_BLEND, 1 ); set->setMode( GL_CLIP_DISTANCE0, 1 ); // set up default options if the caller did not supply them if ( !options().gzdStyle().isSet() ) { options().gzdStyle() = Style(); LineSymbol* line = options().gzdStyle()->getOrCreate<LineSymbol>(); line->stroke()->color() = Color::Gray; line->stroke()->width() = 1.0; line->tessellation() = 20; TextSymbol* text = options().gzdStyle()->getOrCreate<TextSymbol>(); text->fill()->color() = Color(Color::White, 0.3f); text->halo()->color() = Color(Color::Black, 0.2f); text->alignment() = TextSymbol::ALIGN_CENTER_CENTER; } // initialize the UTM sector tables for this profile. _utmData.rebuild(_profile.get()); // now build the lateral tiles for the GZD level. for( UTMData::SectorTable::iterator i = _utmData.sectorTable().begin(); i != _utmData.sectorTable().end(); ++i ) { osg::Node* tile = _utmData.buildGZDTile(i->first, i->second, options().gzdStyle().get(), _featureProfile.get(), map.get()); if ( tile ) _root->addChild( tile ); } }
void UTMGraticule::init() { if ( !_mapNode.valid() ) { OE_WARN << LC << "Illegal NULL map node" << std::endl; return; } if ( !_mapNode->isGeocentric() ) { OE_WARN << LC << "Projected map mode is not yet supported" << std::endl; return; } // safely generate a unique ID for this graticule: _id = Registry::instance()->createUID(); { Threading::ScopedMutexLock lock( s_graticuleMutex ); s_graticuleRegistry[_id] = this; } const Profile* mapProfile = _mapNode->getMap()->getProfile(); _profile = Profile::create( mapProfile->getSRS(), mapProfile->getExtent().xMin(), mapProfile->getExtent().yMin(), mapProfile->getExtent().xMax(), mapProfile->getExtent().yMax(), 8, 4 ); _featureProfile = new FeatureProfile(_profile->getSRS()); //todo: do this right.. osg::StateSet* set = this->getOrCreateStateSet(); set->setMode( GL_LIGHTING, 0 ); set->setMode( GL_BLEND, 1 ); // set up default options if the caller did not supply them if ( !_options.isSet() ) { _options->primaryStyle()= Style(); LineSymbol* line = _options->primaryStyle()->getOrCreate<LineSymbol>(); line->stroke()->color() = Color::Gray; line->stroke()->width() = 1.0; line->tessellation() = 20; AltitudeSymbol* alt = _options->primaryStyle()->getOrCreate<AltitudeSymbol>(); //alt->verticalOffset() = NumericExpression(4900.0); TextSymbol* text = _options->primaryStyle()->getOrCreate<TextSymbol>(); text->fill()->color() = Color(Color::White, 0.3f); text->halo()->color() = Color(Color::Black, 0.2f); text->alignment() = TextSymbol::ALIGN_CENTER_CENTER; } // make the shared depth attr: _depthAttribute = new osg::Depth(osg::Depth::LEQUAL,0,1,false); // this will intialize the graph. rebuild(); }
void GeodeticGraticule::rebuild() { this->removeChildren( 0, this->getNumChildren() ); if ( !getMapNode() ) { OE_WARN << LC << "Illegal NULL map node" << std::endl; return; } if ( !getMapNode()->isGeocentric() ) { OE_WARN << LC << "Projected map mode is not yet supported" << std::endl; return; } const Profile* mapProfile = _mapNode->getMap()->getProfile(); _profile = Profile::create( mapProfile->getSRS(), mapProfile->getExtent().xMin(), mapProfile->getExtent().yMin(), mapProfile->getExtent().xMax(), mapProfile->getExtent().yMax(), 8, 4 ); _featureProfile = new FeatureProfile(_profile->getSRS()); //todo: do this right.. osg::StateSet* set = this->getOrCreateStateSet(); set->setRenderBinDetails( 9999, "RenderBin" ); set->setMode( GL_LIGHTING, 0 ); // set up default options if the caller did not supply them if ( !_options.isSet() ) { _options->lineStyle() = Style(); LineSymbol* line = _options->lineStyle()->getOrCreate<LineSymbol>(); line->stroke()->color() = Color::Gray; line->stroke()->width() = 1.0; AltitudeSymbol* alt = _options->lineStyle()->getOrCreate<AltitudeSymbol>(); alt->verticalOffset() = NumericExpression(5000.0); _options->textStyle() = Style(); TextSymbol* text = _options->textStyle()->getOrCreate<TextSymbol>(); text->alignment() = TextSymbol::ALIGN_CENTER_CENTER; if ( _mapNode->isGeocentric() ) { double r = _mapNode->getMapSRS()->getEllipsoid()->getRadiusEquator(); _options->addLevel( FLT_MAX, 0.0f, 1u ); double d = 4.5*r; for(int i=0; i<3; i++) { d *= 0.5; _options->addLevel( d, d*0.25 ); } } else { //todo? } } _root = new DrapeableNode( _mapNode.get(), false ); this->addChild( _root ); // need at least one level if ( _options->levels().size() < 1 ) return; const GeodeticGraticuleOptions::Level& level0 = _options->levels()[0]; // build the top level cell grid. unsigned tilesX, tilesY; _profile->getNumTiles( 0, tilesX, tilesY ); for( unsigned tx = 0; tx < tilesX; ++tx ) { for( unsigned ty = 0; ty < tilesY; ++ty ) { TileKey key( 0, tx, ty, _profile.get() ); osg::Node* tile = buildTile( key, getMapNode()->getMap() ); if ( tile ) _root->addChild( tile ); } } }
// // NOTE: run this sample from the repo/tests directory. // int main(int argc, char** argv) { osg::ArgumentParser arguments(&argc,argv); if ( arguments.read("--help") ) return usage( argv[0] ); bool useRaster = arguments.read("--rasterize"); bool useOverlay = arguments.read("--overlay"); bool useStencil = arguments.read("--stencil"); bool useMem = arguments.read("--mem"); bool useLabels = arguments.read("--labels"); if ( useStencil ) osg::DisplaySettings::instance()->setMinimumNumStencilBits( 8 ); osgViewer::Viewer viewer(arguments); // Start by creating the map: Map* map = new Map(); // Start with a basemap imagery layer; we'll be using the GDAL driver // to load a local GeoTIFF file: GDALOptions basemapOpt; basemapOpt.url() = "../data/world.tif"; map->addImageLayer( new ImageLayer( ImageLayerOptions("basemap", basemapOpt) ) ); // Next we add a feature layer. OGRFeatureOptions featureOptions; if ( !useMem ) { // Configures the feature driver to load the vectors from a shapefile: featureOptions.url() = "../data/world.shp"; } else { // the --mem options tells us to just make an in-memory geometry: Ring* line = new Ring(); line->push_back( osg::Vec3d(-60, 20, 0) ); line->push_back( osg::Vec3d(-120, 20, 0) ); line->push_back( osg::Vec3d(-120, 60, 0) ); line->push_back( osg::Vec3d(-60, 60, 0) ); featureOptions.geometry() = line; } // Define a style for the feature data. Since we are going to render the // vectors as lines, configure the line symbolizer: Style style; LineSymbol* ls = style.getOrCreateSymbol<LineSymbol>(); ls->stroke()->color() = Color::Yellow; ls->stroke()->width() = 2.0f; // That's it, the map is ready; now create a MapNode to render the Map: MapNodeOptions mapNodeOptions; mapNodeOptions.enableLighting() = false; MapNode* mapNode = new MapNode( map, mapNodeOptions ); osg::Group* root = new osg::Group(); root->addChild( mapNode ); viewer.setSceneData( root ); viewer.setCameraManipulator( new EarthManipulator() ); // Process cmdline args MapNodeHelper().parse(mapNode, arguments, &viewer, root, new LabelControl("Features Demo")); if (useStencil) { FeatureStencilModelOptions stencilOptions; stencilOptions.featureOptions() = featureOptions; stencilOptions.styles() = new StyleSheet(); stencilOptions.styles()->addStyle( style ); stencilOptions.enableLighting() = false; stencilOptions.depthTestEnabled() = false; ls->stroke()->width() = 0.1f; map->addModelLayer( new ModelLayer("my features", stencilOptions) ); } else if (useRaster) { AGGLiteOptions rasterOptions; rasterOptions.featureOptions() = featureOptions; rasterOptions.styles() = new StyleSheet(); rasterOptions.styles()->addStyle( style ); map->addImageLayer( new ImageLayer("my features", rasterOptions) ); } else //if (useGeom || useOverlay) { FeatureGeomModelOptions geomOptions; geomOptions.featureOptions() = featureOptions; geomOptions.styles() = new StyleSheet(); geomOptions.styles()->addStyle( style ); geomOptions.enableLighting() = false; ModelLayerOptions layerOptions( "my features", geomOptions ); map->addModelLayer( new ModelLayer(layerOptions) ); } if ( useLabels ) { // set up symbology for drawing labels. We're pulling the label // text from the name attribute, and its draw priority from the // population attribute. Style labelStyle; TextSymbol* text = labelStyle.getOrCreateSymbol<TextSymbol>(); text->content() = StringExpression( "[cntry_name]" ); text->priority() = NumericExpression( "[pop_cntry]" ); text->removeDuplicateLabels() = true; text->size() = 16.0f; text->alignment() = TextSymbol::ALIGN_CENTER_CENTER; text->fill()->color() = Color::White; text->halo()->color() = Color::DarkGray; // and configure a model layer: FeatureGeomModelOptions geomOptions; geomOptions.featureOptions() = featureOptions; geomOptions.styles() = new StyleSheet(); geomOptions.styles()->addStyle( labelStyle ); map->addModelLayer( new ModelLayer("labels", geomOptions) ); } if ( !useStencil ) viewer.getCamera()->addCullCallback( new osgEarth::Util::AutoClipPlaneCullCallback(mapNode) ); // add some stock OSG handlers: viewer.addEventHandler(new osgViewer::StatsHandler()); viewer.addEventHandler(new osgViewer::WindowSizeHandler()); viewer.addEventHandler(new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet())); return viewer.run(); }
// // NOTE: run this sample from the repo/tests directory. // int main(int argc, char** argv) { osg::ArgumentParser arguments(&argc,argv); bool useRaster = arguments.read("--rasterize"); bool useOverlay = arguments.read("--overlay"); bool useStencil = arguments.read("--stencil"); bool useMem = arguments.read("--mem"); bool useLabels = arguments.read("--labels"); osgViewer::Viewer viewer(arguments); // Start by creating the map: Map* map = new Map(); // Start with a basemap imagery layer; we'll be using the GDAL driver // to load a local GeoTIFF file: GDALOptions basemapOpt; basemapOpt.url() = "../data/world.tif"; map->addImageLayer( new ImageLayer( ImageLayerOptions("basemap", basemapOpt) ) ); // Next we add a feature layer. First configure a feature driver to // load the vectors from a shapefile: OGRFeatureOptions featureOpt; if ( !useMem ) { featureOpt.url() = "../data/usa.shp"; } else { Ring* line = new Ring(); line->push_back( osg::Vec3d(-60, 20, 0) ); line->push_back( osg::Vec3d(-120, 20, 0) ); line->push_back( osg::Vec3d(-120, 60, 0) ); line->push_back( osg::Vec3d(-60, 60, 0) ); featureOpt.geometry() = line; } // Define a style for the feature data. Since we are going to render the // vectors as lines, configure the line symbolizer: Style style; LineSymbol* ls = style.getOrCreateSymbol<LineSymbol>(); ls->stroke()->color() = osg::Vec4f( 1,1,0,1 ); // yellow ls->stroke()->width() = 2.0f; // Add some text labels. if ( useLabels ) { TextSymbol* text = style.getOrCreateSymbol<TextSymbol>(); text->provider() = "overlay"; text->content() = StringExpression( "[name]" ); text->priority() = NumericExpression( "[area]" ); text->removeDuplicateLabels() = true; text->size() = 16.0f; text->fill()->color() = Color::White; text->halo()->color() = Color::DarkGray; } // That's it, the map is ready; now create a MapNode to render the Map: MapNodeOptions mapNodeOptions; mapNodeOptions.enableLighting() = false; MapNode* mapNode = new MapNode( map, mapNodeOptions ); // Now we'll choose the AGG-Lite driver to render the features. By the way, the // feature data is actually polygons, so we override that to treat it as lines. // We apply the feature driver and set the style as well. if (useStencil) { FeatureStencilModelOptions worldOpt; worldOpt.featureOptions() = featureOpt; worldOpt.geometryTypeOverride() = Geometry::TYPE_LINESTRING; worldOpt.styles() = new StyleSheet(); worldOpt.styles()->addStyle( style ); worldOpt.enableLighting() = false; worldOpt.depthTestEnabled() = false; map->addModelLayer( new ModelLayer( "my features", worldOpt ) ); } else if (useRaster) { AGGLiteOptions worldOpt; worldOpt.featureOptions() = featureOpt; worldOpt.geometryTypeOverride() = Geometry::TYPE_LINESTRING; worldOpt.styles() = new StyleSheet(); worldOpt.styles()->addStyle( style ); map->addImageLayer( new ImageLayer( ImageLayerOptions("world", worldOpt) ) ); } else //if (useGeom || useOverlay) { FeatureGeomModelOptions worldOpt; worldOpt.featureOptions() = featureOpt; worldOpt.geometryTypeOverride() = Geometry::TYPE_LINESTRING; worldOpt.styles() = new StyleSheet(); worldOpt.styles()->addStyle( style ); worldOpt.enableLighting() = false; worldOpt.depthTestEnabled() = false; ModelLayerOptions options( "my features", worldOpt ); options.overlay() = useOverlay; map->addModelLayer( new ModelLayer(options) ); } viewer.setSceneData( mapNode ); viewer.setCameraManipulator( new EarthManipulator() ); if ( !useStencil && !useOverlay ) viewer.addEventHandler( new osgEarth::Util::AutoClipPlaneHandler ); // add some stock OSG handlers: viewer.addEventHandler(new osgViewer::StatsHandler()); viewer.addEventHandler(new osgViewer::WindowSizeHandler()); viewer.addEventHandler(new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet())); return viewer.run(); }