Exemplo n.º 1
0
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 );
}
Exemplo n.º 2
0
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.");
}