QgsFeatureRendererV2* QgsSingleSymbolRendererV2::createFromSld( QDomElement& element, QGis::GeometryType geomType ) { // XXX this renderer can handle only one Rule! // get the first Rule element QDomElement ruleElem = element.firstChildElement( "Rule" ); if ( ruleElem.isNull() ) { QgsDebugMsg( "no Rule elements found!" ); return NULL; } QString label, description; QgsSymbolLayerV2List layers; // retrieve the Rule element child nodes QDomElement childElem = ruleElem.firstChildElement(); while ( !childElem.isNull() ) { if ( childElem.localName() == "Name" ) { // <se:Name> tag contains the rule identifier, // so prefer title tag for the label property value if ( label.isEmpty() ) label = childElem.firstChild().nodeValue(); } else if ( childElem.localName() == "Description" ) { // <se:Description> can contains a title and an abstract QDomElement titleElem = childElem.firstChildElement( "Title" ); if ( !titleElem.isNull() ) { label = titleElem.firstChild().nodeValue(); } QDomElement abstractElem = childElem.firstChildElement( "Abstract" ); if ( !abstractElem.isNull() ) { description = abstractElem.firstChild().nodeValue(); } } else if ( childElem.localName() == "Abstract" ) { // <sld:Abstract> (v1.0) description = childElem.firstChild().nodeValue(); } else if ( childElem.localName() == "Title" ) { // <sld:Title> (v1.0) label = childElem.firstChild().nodeValue(); } else if ( childElem.localName().endsWith( "Symbolizer" ) ) { // create symbol layers for this symbolizer QgsSymbolLayerV2Utils::createSymbolLayerV2ListFromSld( childElem, geomType, layers ); } childElem = childElem.nextSiblingElement(); } if ( layers.size() == 0 ) return NULL; // now create the symbol QgsSymbolV2 *symbol; switch ( geomType ) { case QGis::Line: symbol = new QgsLineSymbolV2( layers ); break; case QGis::Polygon: symbol = new QgsFillSymbolV2( layers ); break; case QGis::Point: symbol = new QgsMarkerSymbolV2( layers ); break; default: QgsDebugMsg( QString( "invalid geometry type: found %1" ).arg( geomType ) ); return NULL; } // and finally return the new renderer return new QgsSingleSymbolRendererV2( symbol ); }
QgsFeatureRendererV2* QgsSingleSymbolRendererV2::createFromSld( QDomElement& element, QGis::GeometryType geomType ) { // XXX this renderer can handle only one Rule! // get the first Rule element QDomElement ruleElem = element.firstChildElement( "Rule" ); if ( ruleElem.isNull() ) { QgsDebugMsg( "no Rule elements found!" ); return NULL; } QString label, description; QgsSymbolLayerV2List layers; // retrieve the Rule element child nodes QDomElement childElem = ruleElem.firstChildElement(); while ( !childElem.isNull() ) { if ( childElem.localName() == "Name" ) { label = childElem.firstChild().nodeValue(); } else if ( childElem.localName() == "Description" || childElem.localName() == "Abstract" ) { description = childElem.firstChild().nodeValue(); } else if ( childElem.localName().endsWith( "Symbolizer" ) ) { // create symbol layers for this symbolizer QgsSymbolLayerV2Utils::createSymbolLayerV2ListFromSld( childElem, geomType, layers ); } childElem = childElem.nextSiblingElement(); } // now create the symbol QgsSymbolV2 *symbol = 0; if ( layers.size() > 0 ) { switch ( geomType ) { case QGis::Line: symbol = new QgsLineSymbolV2( layers ); break; case QGis::Polygon: symbol = new QgsFillSymbolV2( layers ); break; case QGis::Point: symbol = new QgsMarkerSymbolV2( layers ); break; default: QgsDebugMsg( QString( "invalid geometry type: found %1" ).arg( geomType ) ); return NULL; } } // and finally return the new renderer return new QgsSingleSymbolRendererV2( symbol ); }