void KML_Geometry::buildChild( const Config& conf, KMLContext& cx, Style& style) { if ( conf.key() == "point" ) { KML_Point g; g.parseStyle(conf, cx, style); g.parseCoords(conf, cx); _geom = g._geom.get(); } else if ( conf.key() == "linestring" ) { KML_LineString g; g.parseStyle(conf, cx, style); g.parseCoords(conf, cx); _geom = g._geom.get(); } else if ( conf.key() == "linearring" ) { KML_LinearRing g; g.parseStyle(conf, cx, style); g.parseCoords(conf, cx); _geom = g._geom.get(); } else if ( conf.key() == "polygon" || conf.key() == "gx:latlonquad" ) { KML_Polygon g; g.parseStyle(conf, cx, style); g.parseCoords(conf, cx); _geom = g._geom.get(); } else if ( conf.key() == "multigeometry" ) { KML_MultiGeometry g; g.parseStyle(conf, cx, style); g.parseCoords(conf, cx); const ConfigSet& mgChildren = conf.children(); for( ConfigSet::const_iterator i = mgChildren.begin(); i != mgChildren.end(); ++i ) { const Config& mgChild = *i; Style subStyle = style; KML_Geometry subGeom; subGeom.parseStyle( mgChild, cx, subStyle ); subGeom.buildChild( mgChild, cx, style ); if ( subGeom._geom.valid() ) dynamic_cast<MultiGeometry*>(g._geom.get())->getComponents().push_back( subGeom._geom.get() ); } //g.parseCoords(conf.child("multigeometry"), cx); _geom = g._geom.get(); } else if ( conf.key() == "model" ) { KML_Model g; g.parseStyle(conf, cx, style); g.parseCoords(conf, cx); _geom = g._geom.get(); } }
void KML_Geometry::buildChild( xml_node<>* node, KMLContext& cx, Style& style) { std::string name = toLower(node->name()); if ( name == "point" ) { KML_Point g; g.parseCoords(node, cx); _geom = g._geom.get(); g.parseStyle(node, cx, style); } else if (name == "linestring" ) { KML_LineString g; g.parseCoords(node, cx); _geom = g._geom.get(); g.parseStyle(node, cx, style); } else if ( name == "linearring" || name == "gx:latlonquad" ) { KML_LinearRing g; g.parseCoords(node, cx); _geom = g._geom.get(); g.parseStyle(node, cx, style); } else if ( name == "polygon" ) { KML_Polygon g; g.parseCoords(node, cx); _geom = g._geom.get(); g.parseStyle(node, cx, style); } else if ( name == "multigeometry" ) { KML_MultiGeometry g; g.parseCoords(node, cx); _geom = g._geom.get(); for( xml_node<>* n = node->first_node(); n; n = n->next_sibling()) { KML_Geometry subGeom; subGeom.buildChild( n, cx, style ); //use single style for all subgeometries if ( subGeom._geom.valid() ) dynamic_cast<MultiGeometry*>(g._geom.get())->getComponents().push_back( subGeom._geom.get() ); } } else if ( name == "model" ) { KML_Model g; g.parseCoords(node, cx); _geom = g._geom.get(); g.parseStyle(node, cx, style); } }
void KML_GroundOverlay::build( const Config& conf, KMLContext& cx ) { // the URL of the overlay image std::string href = conf.child("icon").value("href"); if ( href.empty() ) { OE_WARN << LC << "GroundOverlay missing required Icon element" << std::endl; return; } ImageOverlay* im = 0L; // the extent of the overlay image const Config& llb = conf.child("latlonbox"); if ( !llb.empty() ) { double north = llb.value<double>("north", 0.0); double south = llb.value<double>("south", 0.0); double east = llb.value<double>("east", 0.0); double west = llb.value<double>("west", 0.0); Angular rotation( -llb.value<double>("rotation", 0.0), Units::DEGREES ); osg::ref_ptr<osg::Image> image = URI(href, conf.referrer()).readImage().getImage(); if ( !image.valid() ) { OE_WARN << LC << "GroundOverlay failed to read image from " << href << std::endl; return; } im = new ImageOverlay( cx._mapNode, image.get() ); im->setBoundsAndRotation( Bounds(west, south, east, north), rotation ); cx._groupStack.top()->addChild( im ); } else if ( conf.hasChild("gx:latlonquad") ) { const Config& llq = conf.child("gx:latlonquad"); KML_Geometry g; Style style; g.buildChild( llq, cx, style ); if ( g._geom.valid() && g._geom->size() >= 4 ) { osg::ref_ptr<osg::Image> image = URI(href, conf.referrer()).readImage().getImage(); if ( !image.valid() ) { OE_WARN << LC << "GroundOverlay failed to read image from " << href << std::endl; return; } const Geometry& p = *(g._geom.get()); im = new ImageOverlay( cx._mapNode, image.get() ); im->setCorners( osg::Vec2d( p[0].x(), p[0].y() ), osg::Vec2d( p[1].x(), p[1].y() ), osg::Vec2d( p[3].x(), p[3].y() ), osg::Vec2d( p[2].x(), p[2].y() ) ); cx._groupStack.top()->addChild( im ); } } else { OE_WARN << LC << "GroundOverlay missing required LatLonBox/gx:LatLonQuad element" << std::endl; return; } // superclass build always called last KML_Overlay::build( conf, cx, im ); }