void QgsLabel::writeXML( QDomNode & layer_node, QDomDocument & document ) const { QDomElement labelattributes = document.createElement( "labelattributes" ); // Text QDomElement label = document.createElement( "label" ); label.setAttribute( "text", mLabelAttributes->text() ); if ( mLabelAttributes->textIsSet() && mLabelFieldIdx[Text] != -1 ) { label.setAttribute( "fieldname", labelField( Text ) ); } else { label.setAttribute( "fieldname", "" ); } labelattributes.appendChild( label ); // Family QDomElement family = document.createElement( "family" ); if ( mLabelAttributes->familyIsSet() && !mLabelAttributes->family().isNull() ) { if ( mLabelFieldIdx[Family] != -1 ) { family.setAttribute( "name", mLabelAttributes->family() ); family.setAttribute( "fieldname", labelField( Family ) ); } else { family.setAttribute( "name", mLabelAttributes->family() ); family.setAttribute( "fieldname", "" ); } } else { family.setAttribute( "name", "Arial" ); family.setAttribute( "fieldname", "" ); } labelattributes.appendChild( family ); // size and units QDomElement size = document.createElement( "size" ); size.setAttribute( "value", QString::number( mLabelAttributes->size() ) ); if ( mLabelAttributes->sizeIsSet() ) { if ( mLabelFieldIdx[Size] != -1 ) { if ( mLabelFieldIdx[SizeType] != -1 ) { size.setAttribute( "unitfieldname", labelField( SizeType ) ); } else { size.setAttribute( "units", QgsLabelAttributes::unitsName( mLabelAttributes->sizeType() ) ); } size.setAttribute( "fieldname", labelField( Size ) ); } else { size.setAttribute( "units", QgsLabelAttributes::unitsName( mLabelAttributes->sizeType() ) ); size.setAttribute( "fieldname", "" ); } } else { size.setAttribute( "value", "12" ); size.setAttribute( "units", "Points" ); size.setAttribute( "fieldname", "" ); } labelattributes.appendChild( size ); // bold QDomElement bold = document.createElement( "bold" ); if ( mLabelAttributes->boldIsSet() ) { bold.setAttribute( "on", mLabelAttributes->bold() ); if ( mLabelFieldIdx[Bold] != -1 ) { bold.setAttribute( "fieldname", labelField( Bold ) ); } else { bold.setAttribute( "fieldname", "" ); } } else { bold.setAttribute( "on", 0 ); bold.setAttribute( "fieldname", 0 ); } labelattributes.appendChild( bold ); // italics QDomElement italic = document.createElement( "italic" ); if ( mLabelAttributes->italicIsSet() ) { italic.setAttribute( "on", mLabelAttributes->italic() ); if ( mLabelFieldIdx[Italic] != -1 ) { italic.setAttribute( "fieldname", labelField( Italic ) ); } else { italic.setAttribute( "fieldname", "" ); } } else { italic.setAttribute( "on", "0" ); italic.setAttribute( "fieldname", "" ); } labelattributes.appendChild( italic ); // underline QDomElement underline = document.createElement( "underline" ); if ( mLabelAttributes->underlineIsSet() ) { underline.setAttribute( "on", mLabelAttributes->underline() ); if ( mLabelFieldIdx[Underline] != -1 ) { underline.setAttribute( "fieldname", labelField( Underline ) ); } else { underline.setAttribute( "fieldname", "" ); } } else { underline.setAttribute( "on", 0 ); underline.setAttribute( "fieldname", "" ); } labelattributes.appendChild( underline ); // strikeout QDomElement strikeOut = document.createElement( "strikeout" ); if ( mLabelAttributes->strikeOutIsSet() ) { strikeOut.setAttribute( "on", mLabelAttributes->strikeOut() ); if ( mLabelFieldIdx[StrikeOut] != -1 ) { strikeOut.setAttribute( "fieldname", labelField( StrikeOut ) ); } else { strikeOut.setAttribute( "fieldname", "" ); } } else { strikeOut.setAttribute( "on", 0 ); strikeOut.setAttribute( "fieldname", "" ); } labelattributes.appendChild( strikeOut ); // color QDomElement color = document.createElement( "color" ); if ( mLabelAttributes->colorIsSet() ) { color.setAttribute( "red", mLabelAttributes->color().red() ); color.setAttribute( "green", mLabelAttributes->color().green() ); color.setAttribute( "blue", mLabelAttributes->color().blue() ); if ( mLabelFieldIdx[Color] != -1 ) { color.setAttribute( "fieldname", labelField( Color ) ); } else { color.setAttribute( "fieldname", "" ); } } else { color.setAttribute( "red", 0 ); color.setAttribute( "green", 0 ); color.setAttribute( "blue", 0 ); color.setAttribute( "fieldname", "" ); } labelattributes.appendChild( color ); /* X */ QDomElement x = document.createElement( "x" ); if ( mLabelFieldIdx[XCoordinate] != -1 ) { x.setAttribute( "fieldname", labelField( XCoordinate ) ); } else { x.setAttribute( "fieldname", "" ); } labelattributes.appendChild( x ); /* Y */ QDomElement y = document.createElement( "y" ); if ( mLabelFieldIdx[YCoordinate] != -1 ) { y.setAttribute( "fieldname", labelField( YCoordinate ) ); } else { y.setAttribute( "fieldname", "" ); } labelattributes.appendChild( y ); // offset if ( mLabelAttributes->offsetIsSet() ) { QDomElement offset = document.createElement( "offset" ); offset.setAttribute( "units", QgsLabelAttributes::unitsName( mLabelAttributes->offsetType() ) ); offset.setAttribute( "x", QString::number( mLabelAttributes->xOffset() ) ); offset.setAttribute( "xfieldname", labelField( XOffset ) ); offset.setAttribute( "y", QString::number( mLabelAttributes->yOffset() ) ); offset.setAttribute( "yfieldname", labelField( YOffset ) ); labelattributes.appendChild( offset ); } // Angle QDomElement angle = document.createElement( "angle" ); if ( mLabelAttributes->angleIsSet() ) { angle.setAttribute( "value", QString::number( mLabelAttributes->angle() ) ); if ( mLabelFieldIdx[Angle] != -1 ) { angle.setAttribute( "fieldname", labelField( Angle ) ); } else { angle.setAttribute( "fieldname", "" ); } } else { angle.setAttribute( "value", "" ); angle.setAttribute( "fieldname", "" ); } angle.setAttribute( "auto", mLabelAttributes->angleIsAuto() ? "1" : "0" ); labelattributes.appendChild( angle ); // alignment if ( mLabelAttributes->alignmentIsSet() ) { QDomElement alignment = document.createElement( "alignment" ); alignment.setAttribute( "value", QgsLabelAttributes::alignmentName( mLabelAttributes->alignment() ) ); alignment.setAttribute( "fieldname", labelField( Alignment ) ); labelattributes.appendChild( alignment ); } // buffer color QDomElement buffercolor = document.createElement( "buffercolor" ); if ( mLabelAttributes->bufferColorIsSet() ) { buffercolor.setAttribute( "red", mLabelAttributes->bufferColor().red() ); buffercolor.setAttribute( "green", mLabelAttributes->bufferColor().green() ); buffercolor.setAttribute( "blue", mLabelAttributes->bufferColor().blue() ); if ( mLabelFieldIdx[BufferColor] != -1 ) { buffercolor.setAttribute( "fieldname", labelField( BufferColor ) ); } else { buffercolor.setAttribute( "fieldname", "" ); } } else { buffercolor.setAttribute( "red", "" ); buffercolor.setAttribute( "green", "" ); buffercolor.setAttribute( "blue", "" ); buffercolor.setAttribute( "fieldname", "" ); } labelattributes.appendChild( buffercolor ); // buffer size QDomElement buffersize = document.createElement( "buffersize" ); if ( mLabelAttributes->bufferSizeIsSet() ) { buffersize.setAttribute( "value", QString::number( mLabelAttributes->bufferSize() ) ); buffersize.setAttribute( "units", QgsLabelAttributes::unitsName( mLabelAttributes->bufferSizeType() ) ); if ( mLabelFieldIdx[BufferSize] != -1 ) { buffersize.setAttribute( "fieldname", labelField( BufferSize ) ); } else { buffersize.setAttribute( "fieldname", "" ); } } else { buffersize.setAttribute( "value", "" ); buffersize.setAttribute( "units", "" ); buffersize.setAttribute( "fieldname", "" ); } labelattributes.appendChild( buffersize ); // buffer enabled QDomElement bufferenabled = document.createElement( "bufferenabled" ); if ( mLabelAttributes->bufferEnabled() ) { bufferenabled.setAttribute( "on", mLabelAttributes->bufferEnabled() ); if ( mLabelFieldIdx[BufferEnabled] != -1 ) { bufferenabled.setAttribute( "fieldname", labelField( BufferEnabled ) ); } else { bufferenabled.setAttribute( "fieldname", "" ); } } else { bufferenabled.setAttribute( "on", "" ); bufferenabled.setAttribute( "fieldname", "" ); } labelattributes.appendChild( bufferenabled ); // multiline enabled QDomElement multilineenabled = document.createElement( "multilineenabled" ); if ( mLabelAttributes->multilineEnabled() ) { multilineenabled.setAttribute( "on", mLabelAttributes->multilineEnabled() ); if ( mLabelFieldIdx[MultilineEnabled] != -1 ) { multilineenabled.setAttribute( "fieldname", labelField( MultilineEnabled ) ); } else { multilineenabled.setAttribute( "fieldname", "" ); } } else { multilineenabled.setAttribute( "on", "" ); multilineenabled.setAttribute( "fieldname", "" ); } labelattributes.appendChild( multilineenabled ); QDomElement selectedonly = document.createElement( "selectedonly" ); if ( mLabelAttributes->selectedOnly() ) { selectedonly.setAttribute( "on", mLabelAttributes->selectedOnly() ); } else { selectedonly.setAttribute( "on", "" ); } labelattributes.appendChild( selectedonly ); layer_node.appendChild( labelattributes ); }
void otb::Wrapper::Aggregate::DoExecute() { // Récupération de la labelmap LabelImageType::Pointer labelIn = GetParameterUInt32Image("inseg"); labelIn->SetRequestedRegionToLargestPossibleRegion(); labelIn->Update(); // Filtre statistique pour récupérer le nombre de label dans la labelmap StatisticsImageFilterType::Pointer stats = StatisticsImageFilterType::New(); stats->SetInput(labelIn); stats->Update(); unsigned int regionCount=stats->GetMaximum(); otbAppLogINFO(<<"Number of objects: "<<regionCount); //Récupération de la classification et statistique pour connaître le nombre de classes ImageType::Pointer imageIn = GetParameterUInt32Image("in"); stats->SetInput(imageIn); stats->Update(); unsigned int nbclass=stats->GetMaximum()-stats->GetMinimum()+1; otbAppLogINFO(<<"Number of classes: "<<nbclass); unsigned int minimum =stats->GetMinimum(); otbAppLogINFO(<<"Minimum: "<<minimum); // Filtre LabelImage vers LabelMap(StatisticsLabelObject) ConverterStatisticsType::Pointer converterStats = ConverterStatisticsType::New(); converterStats->SetInput(labelIn); converterStats->SetBackgroundValue(0); converterStats->Update(); // Calcul des statistiques par objet de la LabelMap StatisticsFilterType::Pointer statistics = StatisticsFilterType::New(); statistics->SetInput(converterStats->GetOutput()); statistics->SetFeatureImage(imageIn); statistics->SetNumberOfBins(nbclass); statistics->Update(); // Définition du filtre ChangeLabel m_ChangeLabelFilter = ChangeLabelImageFilterType::New(); m_ChangeLabelFilter->SetInput(labelIn); // Iteration sur les objets, récupération de l'histogramme, extraction de la valeur mojoritaire // Changement de la valeur du label par la valeur majoritaire dans la label map => obtention d'une classification corrigée for(unsigned int i=0; i<regionCount+1; i++) { if(statistics->GetOutput()->HasLabel(i)) { const StatisticsLabelObjectType *labelObjectStats = statistics->GetOutput()->GetLabelObject(i); const HistogramType *histogram = labelObjectStats->GetHistogram(); unsigned int var = 0; unsigned int classe = minimum; for(unsigned int j=0; j< nbclass; j++) { if(histogram->GetFrequency(j)>var) { var = histogram->GetFrequency(j); classe = j+minimum; } } m_ChangeLabelFilter->SetChange(i,classe); } } SetParameterOutputImage("outim", m_ChangeLabelFilter->GetOutput()); //Vectorisation otbAppLogINFO(<<"Vectorization..."); //Définition du shapefile const std::string shapefile = GetParameterString("out"); otb::ogr::DataSource::Pointer ogrDS; otb::ogr::Layer layer(NULL, false); std::string projRef = imageIn->GetProjectionRef(); OGRSpatialReference oSRS(projRef.c_str()); otbAppLogINFO(<< projRef); std::vector<std::string> options; ogrDS = otb::ogr::DataSource::New(shapefile, otb::ogr::DataSource::Modes::Overwrite); std::string layername = itksys::SystemTools::GetFilenameName(shapefile.c_str()); std::string const extension = itksys::SystemTools::GetFilenameLastExtension(shapefile.c_str()); layername = layername.substr(0,layername.size()-(extension.size())); layer = ogrDS->CreateLayer(layername, &oSRS, wkbMultiPolygon, options); OGRFieldDefn labelField("label", OFTInteger); layer.CreateField(labelField, true); OGRFieldDefn MajorityField("Majority", OFTInteger); layer.CreateField(MajorityField, true); // Write label image /* WriterType::Pointer writer = WriterType::New(); writer->SetInput(m_ChangeLabelFilter->GetOutput()); writer->SetFileName("label_image.tif"); writer->Update(); */ // Filtre LabelImage vers OGRDataSource LabelImageToOGRDataSourceFilterType::Pointer labelToOGR = LabelImageToOGRDataSourceFilterType::New(); labelToOGR->SetInput(m_ChangeLabelFilter->GetOutput()); labelToOGR->SetInputMask(m_ChangeLabelFilter->GetOutput()); // La classe 0 est considérée comme du background et n'est pas vectorisée labelToOGR->SetFieldName("Majority"); labelToOGR->Update(); otb::ogr::DataSource::ConstPointer ogrDSTmp = labelToOGR->GetOutput(); otb::ogr::Layer layerTmp = ogrDSTmp->GetLayerChecked(0); otb::ogr::Layer::const_iterator featIt = layerTmp.begin(); int nveau_label = 1; for(; featIt!=layerTmp.end(); ++featIt) { otb::ogr::Feature dstFeature(layer.GetLayerDefn()); dstFeature.SetFrom( *featIt, TRUE ); layer.CreateFeature( dstFeature ); dstFeature.ogr().SetField("label",nveau_label); layer.SetFeature(dstFeature); nveau_label +=1; } otbAppLogINFO(<<"Processing complete."); }