23#include "moc_qgsrasterlayersaveasdialog.cpp" 
   39#include <QRegularExpression> 
   42  : QDialog( parent, f )
 
   43  , mRasterLayer( rasterLayer )
 
   44  , mDataProvider( sourceProvider )
 
   45  , mCurrentExtent( currentExtent )
 
   46  , mLayerCrs( layerCrs )
 
   47  , mCurrentCrs( currentCrs )
 
   48  , mResolutionState( OriginalResolution )
 
   52  connect( mRawModeRadioButton, &QRadioButton::toggled, 
this, &QgsRasterLayerSaveAsDialog::mRawModeRadioButton_toggled );
 
   53  connect( mFormatComboBox, &QComboBox::currentTextChanged, 
this, &QgsRasterLayerSaveAsDialog::mFormatComboBox_currentIndexChanged );
 
   54  connect( mResolutionRadioButton, &QRadioButton::toggled, 
this, &QgsRasterLayerSaveAsDialog::mResolutionRadioButton_toggled );
 
   55  connect( mOriginalResolutionPushButton, &QPushButton::clicked, 
this, &QgsRasterLayerSaveAsDialog::mOriginalResolutionPushButton_clicked );
 
   56  connect( mXResolutionLineEdit, &QLineEdit::textEdited, 
this, &QgsRasterLayerSaveAsDialog::mXResolutionLineEdit_textEdited );
 
   57  connect( mYResolutionLineEdit, &QLineEdit::textEdited, 
this, &QgsRasterLayerSaveAsDialog::mYResolutionLineEdit_textEdited );
 
   58  connect( mOriginalSizePushButton, &QPushButton::clicked, 
this, &QgsRasterLayerSaveAsDialog::mOriginalSizePushButton_clicked );
 
   59  connect( mColumnsLineEdit, &QLineEdit::textEdited, 
this, &QgsRasterLayerSaveAsDialog::mColumnsLineEdit_textEdited );
 
   60  connect( mRowsLineEdit, &QLineEdit::textEdited, 
this, &QgsRasterLayerSaveAsDialog::mRowsLineEdit_textEdited );
 
   61  connect( mAddNoDataManuallyToolButton, &QPushButton::clicked, 
this, &QgsRasterLayerSaveAsDialog::mAddNoDataManuallyToolButton_clicked );
 
   62  connect( mLoadTransparentNoDataToolButton, &QPushButton::clicked, 
this, &QgsRasterLayerSaveAsDialog::mLoadTransparentNoDataToolButton_clicked );
 
   63  connect( mRemoveSelectedNoDataToolButton, &QPushButton::clicked, 
this, &QgsRasterLayerSaveAsDialog::mRemoveSelectedNoDataToolButton_clicked );
 
   64  connect( mRemoveAllNoDataToolButton, &QPushButton::clicked, 
this, &QgsRasterLayerSaveAsDialog::mRemoveAllNoDataToolButton_clicked );
 
   65  connect( mTileModeCheckBox, &QCheckBox::toggled, 
this, &QgsRasterLayerSaveAsDialog::mTileModeCheckBox_toggled );
 
   66  connect( mPyramidsGroupBox, &QgsCollapsibleGroupBox::toggled, 
this, &QgsRasterLayerSaveAsDialog::mPyramidsGroupBox_toggled );
 
   72  mNoDataTableWidget->setColumnCount( 2 );
 
   73  mNoDataTableWidget->setHorizontalHeaderItem( 0, 
new QTableWidgetItem( tr( 
"From" ) ) );
 
   74  mNoDataTableWidget->setHorizontalHeaderItem( 1, 
new QTableWidgetItem( tr( 
"To" ) ) );
 
   76  mRawModeRadioButton_toggled( 
true );
 
   80  toggleResolutionSize();
 
   82  insertAvailableOutputFormats();
 
   89      setOriginalResolution();
 
   90      int xSize = mDataProvider->
xSize();
 
   91      int ySize = mDataProvider->
ySize();
 
   92      mMaximumSizeXLineEdit->setText( QString::number( xSize ) );
 
   93      mMaximumSizeYLineEdit->setText( QString::number( ySize ) );
 
   97      mTileModeCheckBox->setChecked( 
true );
 
   98      mMaximumSizeXLineEdit->setText( QString::number( 2000 ) );
 
   99      mMaximumSizeYLineEdit->setText( QString::number( 2000 ) );
 
  103    mCreationOptionsWidget->setProvider( mDataProvider->
name() );
 
  104    if ( mDataProvider->
name() == QLatin1String( 
"gdal" ) )
 
  106      mCreationOptionsWidget->setFormat( mFormatComboBox->currentData().toString() );
 
  108    mCreationOptionsWidget->setRasterLayer( mRasterLayer );
 
  109    mCreationOptionsWidget->update();
 
  117    mPyramidsOptionsWidget->createOptionsWidget()->setRasterLayer( mRasterLayer );
 
  122    mPyramidsUseExistingCheckBox->setEnabled( 
false );
 
  123    mPyramidsUseExistingCheckBox->setVisible( 
false );
 
  125    populatePyramidsLevels();
 
  130    mPyramidsGroupBox->setEnabled( 
false );
 
  131    mPyramidsGroupBox->setCollapsed( 
true );
 
  136  mCreateOptionsGroupBox->setSaveCheckedState( 
true );
 
  146      mCrsSelector->setSourceEnsemble( ensemble.
name() );
 
  152  mCrsSelector->setShowAccuracyWarnings( 
true );
 
  154  mCrsSelector->setLayerCrs( mLayerCrs );
 
  156  mCrsSelector->setCrs( mLayerCrs );
 
  160  QPushButton *okButton = mButtonBox->button( QDialogButtonBox::Ok );
 
  163    okButton->setEnabled( 
false );
 
  167  mHelpButtonBox->setVisible( 
false );
 
  168  mButtonBox->addButton( QDialogButtonBox::Help );
 
  169  connect( mButtonBox, &QDialogButtonBox::helpRequested, 
this, &QgsRasterLayerSaveAsDialog::showHelp );
 
  171  connect( mHelpButtonBox, &QDialogButtonBox::helpRequested, 
this, &QgsRasterLayerSaveAsDialog::showHelp );
 
  174  connect( mButtonBox, &QDialogButtonBox::rejected, 
this, &QgsRasterLayerSaveAsDialog::reject );
 
  176  mExtentGroupBox->setOutputCrs( 
outputCrs() );
 
  177  mExtentGroupBox->setOriginalExtent( mDataProvider->
extent(), mLayerCrs );
 
  178  mExtentGroupBox->setCurrentExtent( mCurrentExtent, mCurrentCrs );
 
  179  mExtentGroupBox->setOutputExtentFromOriginal();
 
  182  recalcResolutionSize();
 
  186  if ( mTileModeCheckBox->isChecked() )
 
  188    mTilesGroupBox->show();
 
  190    mFilename->setDialogTitle( tr( 
"Select Output Directory" ) );
 
  194    mTilesGroupBox->hide();
 
  196    mFilename->setDialogTitle( tr( 
"Save Layer As" ) );
 
  199  mFilename->setDefaultRoot( settings.
value( QStringLiteral( 
"UI/lastRasterFileDir" ), QDir::homePath() ).toString() );
 
  202    QFileInfo tmplFileInfo( filePath );
 
  203    settings.
setValue( QStringLiteral( 
"UI/lastRasterFileDir" ), tmplFileInfo.absolutePath() );
 
  205    if ( !filePath.isEmpty() && mLayerName->isEnabled() )
 
  207      QFileInfo fileInfo( filePath );
 
  208      mLayerName->setText( fileInfo.baseName() );
 
  211    if ( mTileModeCheckBox->isChecked() )
 
  213      QString fileName = filePath;
 
  218        if ( fileName.isEmpty() )
 
  222        QDir dir( fileName );
 
  223        QString baseName = QFileInfo( fileName ).baseName();
 
  225        filters << QStringLiteral( 
"%1.*" ).arg( baseName );
 
  226        QStringList files = dir.entryList( filters );
 
  227        if ( files.isEmpty() )
 
  230        if ( QMessageBox::warning( 
this, tr( 
"Save Raster Layer" ), tr( 
"The directory %1 contains files which will be overwritten: %2" ).arg( dir.absolutePath(), files.join( QLatin1String( 
", " ) ) ), QMessageBox::Ok | QMessageBox::Cancel ) == QMessageBox::Ok )
 
  233        fileName = QFileDialog::getExistingDirectory( 
this, tr( 
"Select output directory" ), tmplFileInfo.absolutePath() );
 
  237    QPushButton *okButton = mButtonBox->button( QDialogButtonBox::Ok );
 
  242    okButton->setEnabled( tmplFileInfo.absoluteDir().exists() );
 
 
  246void QgsRasterLayerSaveAsDialog::insertAvailableOutputFormats()
 
  250  int nDrivers = GDALGetDriverCount();
 
  251  QMap<int, QPair<QString, QString>> topPriorityDrivers;
 
  252  QMap<QString, QString> lowPriorityDrivers;
 
  254  for ( 
int i = 0; i < nDrivers; ++i )
 
  256    GDALDriverH driver = GDALGetDriver( i );
 
  261        QString driverShortName = GDALGetDriverShortName( driver );
 
  262        QString driverLongName = GDALGetDriverLongName( driver );
 
  263        if ( driverShortName == QLatin1String( 
"MEM" ) )
 
  270        else if ( driverShortName == QLatin1String( 
"VRT" ) )
 
  275        else if ( driverShortName == QLatin1String( 
"GTiff" ) )
 
  278          topPriorityDrivers.insert( 1, qMakePair( driverLongName, driverShortName ) );
 
  280        else if ( driverShortName == QLatin1String( 
"GPKG" ) )
 
  283          topPriorityDrivers.insert( 2, qMakePair( driverLongName, driverShortName ) );
 
  287          lowPriorityDrivers.insert( driverLongName, driverShortName );
 
  294  for ( 
auto priorityDriversIt = topPriorityDrivers.constBegin(); priorityDriversIt != topPriorityDrivers.constEnd(); ++priorityDriversIt )
 
  296    mFormatComboBox->addItem( priorityDriversIt.value().first, priorityDriversIt.value().second );
 
  299  for ( 
auto lowPriorityDriversIt = lowPriorityDrivers.constBegin(); lowPriorityDriversIt != lowPriorityDrivers.constEnd(); ++lowPriorityDriversIt )
 
  301    mFormatComboBox->addItem( lowPriorityDriversIt.key(), lowPriorityDriversIt.value() );
 
  305void QgsRasterLayerSaveAsDialog::setValidators()
 
  309  mColumnsLineEdit->setValidator( 
new QIntValidator( 
this ) );
 
  310  mRowsLineEdit->setValidator( 
new QIntValidator( 
this ) );
 
  311  mMaximumSizeXLineEdit->setValidator( 
new QIntValidator( 
this ) );
 
  312  mMaximumSizeYLineEdit->setValidator( 
new QIntValidator( 
this ) );
 
  315void QgsRasterLayerSaveAsDialog::mFormatComboBox_currentIndexChanged( 
const QString & )
 
  318  if ( mDataProvider && mDataProvider->
name() == QLatin1String( 
"gdal" ) )
 
  321    mCreationOptionsWidget->update();
 
  326  if ( extensions.empty() )
 
  327    filter = tr( 
"All files (*.*)" );
 
  330    filter = QStringLiteral( 
"%1 (*.%2);;%3" ).arg( mFormatComboBox->currentText(), extensions.join( QLatin1String( 
" *." ) ), tr( 
"All files (*.*)" ) );
 
  332  mFilename->setFilter( filter );
 
  335  mTileModeCheckBox->setEnabled( 
outputFormat() != QLatin1String( 
"GPKG" ) );
 
  336  mFilename->setConfirmOverwrite( 
outputFormat() != QLatin1String( 
"GPKG" ) );
 
  337  mLayerName->setEnabled( 
outputFormat() == QLatin1String( 
"GPKG" ) );
 
  338  if ( mLayerName->isEnabled() )
 
  340    QString layerName = QFileInfo( mFilename->filePath() ).baseName();
 
  341    mLayerName->setText( layerName );
 
  342    mTileModeCheckBox->setChecked( 
false );
 
  346    mLayerName->setText( QString() );
 
  352  return mColumnsLineEdit->text().toInt();
 
 
  357  return mRowsLineEdit->text().toInt();
 
 
  372  return mMaximumSizeXLineEdit->text().toInt();
 
 
  377  return mMaximumSizeYLineEdit->text().toInt();
 
 
  382  return mTileModeCheckBox->isChecked();
 
 
  387  return mAddToCanvas->isChecked();
 
 
  392  mAddToCanvas->setChecked( checked );
 
 
  397  QString fileName = mFilename->filePath();
 
  403    if ( !extensions.empty() )
 
  405      defaultExt = extensions.at( 0 );
 
  409    QFileInfo fi( fileName );
 
  410    if ( !fileName.isEmpty() && fi.suffix().isEmpty() && !defaultExt.isEmpty() )
 
  412      fileName += 
'.' + defaultExt;
 
 
  421  if ( mLayerName->text().isEmpty() && 
outputFormat() == QLatin1String( 
"GPKG" ) && !mTileModeCheckBox->isChecked() )
 
  424    return QFileInfo( mFilename->filePath() ).baseName();
 
  428    return mLayerName->text();
 
 
  434  return mFormatComboBox->currentData().toString();
 
 
  444  QStringList options = mCreateOptionsGroupBox->isChecked() ? mCreationOptionsWidget->options() : QStringList();
 
  448    int indx = options.indexOf( QRegularExpression( 
"^RASTER_TABLE=.*", QRegularExpression::CaseInsensitiveOption | QRegularExpression::MultilineOption ) );
 
  451      options.replace( indx, QStringLiteral( 
"RASTER_TABLE=%1" ).arg( 
outputLayerName() ) );
 
  455      options.append( QStringLiteral( 
"RASTER_TABLE=%1" ).arg( 
outputLayerName() ) );
 
  459    if ( !outputLayerExists() )
 
  461      indx = options.indexOf( QRegularExpression( 
"^APPEND_SUBDATASET=.*", QRegularExpression::CaseInsensitiveOption | QRegularExpression::MultilineOption ) );
 
  464        options.replace( indx, QStringLiteral( 
"APPEND_SUBDATASET=YES" ) );
 
  468        options.append( QStringLiteral( 
"APPEND_SUBDATASET=YES" ) );
 
 
  477  return mExtentGroupBox->outputExtent();
 
 
  482  mFormatLabel->hide();
 
  483  mFormatComboBox->hide();
 
 
  488  mSaveAsLabel->hide();
 
  490  QPushButton *okButton = mButtonBox->button( QDialogButtonBox::Ok );
 
  493    okButton->setEnabled( 
true );
 
 
  497void QgsRasterLayerSaveAsDialog::toggleResolutionSize()
 
  501  bool on = mResolutionRadioButton->isChecked();
 
  502  mXResolutionLineEdit->setEnabled( on );
 
  503  mYResolutionLineEdit->setEnabled( on );
 
  504  mOriginalResolutionPushButton->setEnabled( on && hasResolution );
 
  505  mColumnsLineEdit->setEnabled( !on );
 
  506  mRowsLineEdit->setEnabled( !on );
 
  507  mOriginalSizePushButton->setEnabled( !on && hasResolution );
 
  510void QgsRasterLayerSaveAsDialog::setOriginalResolution()
 
  522    xRes = yRes = mDataProvider->
extent().
width() / 100;
 
  524  setResolution( xRes, yRes, mLayerCrs );
 
  542    QgsRectangle srcExtent( srsCenter.
x() - xRes / 2, srsCenter.
y() - yRes / 2, srsCenter.
x() + xRes / 2, srsCenter.
y() + yRes / 2 );
 
  545    xRes = extent.
width();
 
  548  mXResolutionLineEdit->setText( QLocale().toString( xRes ) );
 
  549  mYResolutionLineEdit->setText( QLocale().toString( yRes ) );
 
  552void QgsRasterLayerSaveAsDialog::recalcSize()
 
  557  mColumnsLineEdit->setText( QString::number( xSize ) );
 
  558  mRowsLineEdit->setText( QString::number( ySize ) );
 
  559  updateResolutionStateMsg();
 
  562void QgsRasterLayerSaveAsDialog::setOriginalSize()
 
  564  mColumnsLineEdit->setText( QString::number( mDataProvider->
xSize() ) );
 
  565  mRowsLineEdit->setText( QString::number( mDataProvider->
ySize() ) );
 
  569void QgsRasterLayerSaveAsDialog::recalcResolution()
 
  574  mXResolutionLineEdit->setText( QLocale().toString( xRes ) );
 
  575  mYResolutionLineEdit->setText( QLocale().toString( yRes ) );
 
  576  updateResolutionStateMsg();
 
  579void QgsRasterLayerSaveAsDialog::recalcResolutionSize()
 
  581  if ( mResolutionRadioButton->isChecked() )
 
  592void QgsRasterLayerSaveAsDialog::updateResolutionStateMsg()
 
  595  switch ( mResolutionState )
 
  601      msg = tr( 
"user defined" );
 
  606  msg = tr( 
"Resolution (current: %1)" ).arg( msg );
 
  607  mResolutionGroupBox->setTitle( msg );
 
  610void QgsRasterLayerSaveAsDialog::extentChanged()
 
  613  if ( mSizeRadioButton->isChecked() )
 
  617  recalcResolutionSize();
 
  620void QgsRasterLayerSaveAsDialog::crsChanged()
 
  624    mExtentGroupBox->setOutputCrs( 
outputCrs() );
 
  627    if ( mResolutionRadioButton->isChecked() )
 
  631        setOriginalResolution();
 
  650  return mCrsSelector->crs();
 
 
  655  if ( mRenderedModeRadioButton->isChecked() )
 
 
  660void QgsRasterLayerSaveAsDialog::mRawModeRadioButton_toggled( 
bool checked )
 
  662  mNoDataGroupBox->setEnabled( checked && mDataProvider->
bandCount() == 1 );
 
  663  mNoDataGroupBox->setCollapsed( !mNoDataGroupBox->isEnabled() );
 
  666void QgsRasterLayerSaveAsDialog::mAddNoDataManuallyToolButton_clicked()
 
  668  addNoDataRow( std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN() );
 
  671void QgsRasterLayerSaveAsDialog::mLoadTransparentNoDataToolButton_clicked()
 
  676  if ( !rasterTransparency )
 
  684      addNoDataRow( transparencyPixel.min, transparencyPixel.max );
 
  685      if ( transparencyPixel.min != transparencyPixel.max )
 
  687        setNoDataToEdited( mNoDataTableWidget->rowCount() - 1 );
 
  693void QgsRasterLayerSaveAsDialog::mRemoveSelectedNoDataToolButton_clicked()
 
  695  mNoDataTableWidget->removeRow( mNoDataTableWidget->currentRow() );
 
  698void QgsRasterLayerSaveAsDialog::mRemoveAllNoDataToolButton_clicked()
 
  700  while ( mNoDataTableWidget->rowCount() > 0 )
 
  702    mNoDataTableWidget->removeRow( 0 );
 
  706void QgsRasterLayerSaveAsDialog::addNoDataRow( 
double min, 
double max )
 
  708  mNoDataTableWidget->insertRow( mNoDataTableWidget->rowCount() );
 
  709  for ( 
int i = 0; i < 2; i++ )
 
  711    double value = i == 0 ? min : max;
 
  712    QLineEdit *lineEdit = 
new QLineEdit();
 
  713    lineEdit->setFrame( 
false );
 
  714    lineEdit->setContentsMargins( 1, 1, 1, 1 );
 
  721        if ( !std::isnan( value ) )
 
  727        lineEdit->setValidator( 
new QIntValidator( 
nullptr ) );
 
  728        if ( !std::isnan( value ) )
 
  730          valueString = QLocale().toString( 
static_cast<int>( value ) );
 
  734    lineEdit->setText( valueString );
 
  735    mNoDataTableWidget->setCellWidget( mNoDataTableWidget->rowCount() - 1, i, lineEdit );
 
  737    adjustNoDataCellWidth( mNoDataTableWidget->rowCount() - 1, i );
 
  739    connect( lineEdit, &QLineEdit::textEdited, 
this, &QgsRasterLayerSaveAsDialog::noDataCellTextEdited );
 
  741  mNoDataTableWidget->resizeColumnsToContents();
 
  742  mNoDataTableWidget->resizeRowsToContents();
 
  745void QgsRasterLayerSaveAsDialog::noDataCellTextEdited( 
const QString &text )
 
  749  QLineEdit *lineEdit = qobject_cast<QLineEdit *>( sender() );
 
  754  for ( 
int r = 0; r < mNoDataTableWidget->rowCount(); r++ )
 
  756    for ( 
int c = 0; 
c < mNoDataTableWidget->columnCount(); 
c++ )
 
  758      if ( mNoDataTableWidget->cellWidget( r, 
c ) == sender() )
 
  768  QgsDebugMsgLevel( QStringLiteral( 
"row = %1 column =%2" ).arg( row ).arg( column ), 2 );
 
  772    QLineEdit *toLineEdit = 
dynamic_cast<QLineEdit *
>( mNoDataTableWidget->cellWidget( row, 1 ) );
 
  775    bool toChanged = mNoDataToEdited.value( row );
 
  779      toLineEdit->setText( lineEdit->text() );
 
  782  else if ( column == 1 )
 
  784    setNoDataToEdited( row );
 
  788void QgsRasterLayerSaveAsDialog::mTileModeCheckBox_toggled( 
bool toggled )
 
  807    mTilesGroupBox->show();
 
  809    mFilename->setDialogTitle( tr( 
"Select Output Directory" ) );
 
  813    mTilesGroupBox->hide();
 
  815    mFilename->setDialogTitle( tr( 
"Save Layer As" ) );
 
  819void QgsRasterLayerSaveAsDialog::mPyramidsGroupBox_toggled( 
bool toggled )
 
  822  populatePyramidsLevels();
 
  825void QgsRasterLayerSaveAsDialog::populatePyramidsLevels()
 
  829  if ( mPyramidsGroupBox->isChecked() )
 
  831    QList<QgsRasterPyramid> myPyramidList;
 
  834    if ( mPyramidsUseExistingCheckBox->isChecked() )
 
  840      if ( !mPyramidsOptionsWidget->overviewList().isEmpty() )
 
  841        myPyramidList = mDataProvider->
buildPyramidList( mPyramidsOptionsWidget->overviewList() );
 
  845      if ( !mPyramidsUseExistingCheckBox->isChecked() || pyramid.getExists() )
 
  847        text += QString::number( pyramid.getXDim() ) + QStringLiteral( 
"x" ) + QString::number( pyramid.getYDim() ) + 
' ';
 
  852  mPyramidResolutionsLineEdit->setText( text.trimmed() );
 
  855void QgsRasterLayerSaveAsDialog::setNoDataToEdited( 
int row )
 
  857  if ( row >= mNoDataToEdited.size() )
 
  859    mNoDataToEdited.resize( row + 1 );
 
  861  mNoDataToEdited[row] = 
true;
 
  864double QgsRasterLayerSaveAsDialog::noDataCellValue( 
int row, 
int column )
 const 
  866  QLineEdit *lineEdit = 
dynamic_cast<QLineEdit *
>( mNoDataTableWidget->cellWidget( row, column ) );
 
  867  if ( !lineEdit || lineEdit->text().isEmpty() )
 
  869    return std::numeric_limits<double>::quiet_NaN();
 
  874void QgsRasterLayerSaveAsDialog::adjustNoDataCellWidth( 
int row, 
int column )
 
  876  QLineEdit *lineEdit = 
dynamic_cast<QLineEdit *
>( mNoDataTableWidget->cellWidget( row, column ) );
 
  880  int width = std::max( lineEdit->fontMetrics().boundingRect( lineEdit->text() ).width() + 10, 100 );
 
  881  width = std::max( width, mNoDataTableWidget->columnWidth( column ) );
 
  883  lineEdit->setFixedWidth( width );
 
  889  if ( !mNoDataGroupBox->isChecked() )
 
  892  int rows = mNoDataTableWidget->rowCount();
 
  893  noDataList.reserve( rows );
 
  894  for ( 
int r = 0; r < rows; r++ )
 
  897    noDataList.append( 
noData );
 
 
  904  return mPyramidsGroupBox->isChecked() ? mPyramidsOptionsWidget->overviewList() : QList<int>();
 
 
  909  if ( !mPyramidsGroupBox->isChecked() )
 
  911  else if ( mPyramidsUseExistingCheckBox->isChecked() )
 
 
  917bool QgsRasterLayerSaveAsDialog::validate()
 const 
  919  if ( mCreateOptionsGroupBox->isChecked() )
 
  921    QString message = mCreationOptionsWidget->validateOptions( 
true, 
false );
 
  922    if ( !message.isNull() )
 
  925  if ( mPyramidsGroupBox->isChecked() )
 
  927    QString message = mPyramidsOptionsWidget->createOptionsWidget()->validateOptions( 
true, 
false );
 
  928    if ( !message.isNull() )
 
  934bool QgsRasterLayerSaveAsDialog::outputLayerExists()
 const 
  948  QgsRasterLayer rasterLayer( rasterUri, QString(), QStringLiteral( 
"gdal" ) );
 
  949  if ( !vectorUri.isEmpty() )
 
  951    QgsVectorLayer vectorLayer( vectorUri, QString(), QStringLiteral( 
"ogr" ) );
 
  952    return rasterLayer.isValid() || vectorLayer.isValid();
 
  956    return rasterLayer.isValid();
 
  969    const int nbTilesWidth = std::ceil( 
nColumns() / 256 );
 
  970    const int nbTilesHeight = std::ceil( 
nRows() / 256 );
 
  971    int64_t totalTiles = 
static_cast<int64_t
>( nbTilesWidth ) * nbTilesHeight;
 
  975      QMessageBox::warning( 
this, tr( 
"Save Raster Layer" ), tr( 
"The number of OpenStreetMap tiles needed to produce the raster layer is too large and will lead to bulk downloading behavior which is prohibited by the %1OpenStreetMap Foundation tile usage policy%2." ).arg( QStringLiteral( 
"<a href=\"https://operations.osmfoundation.org/policies/tiles/\">" ), QStringLiteral( 
"</a>" ) ), QMessageBox::Ok );
 
  980  if ( 
outputFormat() == QLatin1String( 
"GPKG" ) && outputLayerExists() && QMessageBox::warning( 
this, tr( 
"Save Raster Layer" ), tr( 
"The layer %1 already exists in the target file, and overwriting layers in GeoPackage is not supported. " 
  981                                                                                                                                      "Do you want to overwrite the whole file?" )
 
  983                                                                                                 QMessageBox::Yes | QMessageBox::No )
 
 
  992void QgsRasterLayerSaveAsDialog::showHelp()
 
  994  QgsHelp::openHelp( QStringLiteral( 
"managing_data_source/create_layers.html#creating-new-layers-from-an-existing-layer" ) );
 
@ BuildPyramids
Supports building of pyramids (overviews) (since QGIS 3.38 – this is a replacement for RasterInterfac...
 
@ BuildPyramids
Supports building of pyramids (overviews) (Deprecated since QGIS 3.38 – use RasterProviderCapability:...
 
@ Size
Original data source size (and thus resolution) is known, it is not always available,...
 
@ Float32
Thirty two bit floating point (float)
 
@ Float64
Sixty four bit floating point (double)
 
RasterBuildPyramidOption
Raster pyramid building options.
 
@ CopyExisting
Copy existing.
 
@ Reverse
Reverse/inverse transform (from destination to source)
 
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
 
Represents a coordinate reference system (CRS).
 
QgsDatumEnsemble datumEnsemble() const
Attempts to retrieve datum ensemble details from the CRS.
 
virtual QString name() const =0
Returns a provider name.
 
Contains information about a datum ensemble.
 
bool isValid() const
Returns true if the datum ensemble is a valid object, or false if it is a null/invalid object.
 
QString name() const
Display name of datum ensemble.
 
A custom validator which allows entry of doubles in a locale-tolerant way.
 
static double toDouble(const QString &input, bool *ok)
Converts input string to double value.
 
void extentChanged(const QgsRectangle &r)
Emitted when the widget's extent is changed.
 
static bool supportsRasterCreate(GDALDriverH driver)
Reads whether a driver supports GDALCreate() for raster purposes.
 
static void enableAutoGeometryRestore(QWidget *widget, const QString &key=QString())
Register the widget to allow its position to be automatically saved and restored when open and closed...
 
static void openHelp(const QString &key)
Opens help topic for the given help key using default system web browser.
 
static bool isOpenStreetMapLayer(QgsMapLayer *layer)
Returns true if the layer is served by OpenStreetMap server.
 
Custom exception class which is raised when an operation is not supported.
 
static QgsProject * instance()
Returns the QgsProject singleton instance.
 
static QString printValue(double value, bool localized=false)
Print double value with all necessary significant digits.
 
Base class for raster data providers.
 
Qgis::DataType sourceDataType(int bandNo) const override=0
Returns source data type for the band specified by number, source data type may be shorter than dataT...
 
QgsRectangle extent() const override=0
Returns the extent of the layer.
 
virtual Qgis::RasterProviderCapabilities providerCapabilities() const
Returns flags containing the supported capabilities of the data provider.
 
virtual QList< QgsRasterPyramid > buildPyramidList(const QList< int > &overviewList=QList< int >())
Returns the raster layers pyramid list.
 
static QStringList extensionsForFormat(const QString &format)
Returns a list of known file extensions for the given GDAL driver format.
 
virtual Qgis::RasterInterfaceCapabilities capabilities() const
Returns the capabilities supported by the interface.
 
virtual int xSize() const
Gets raster size.
 
virtual int bandCount() const =0
Gets number of bands.
 
virtual int ySize() const
 
double xResolution() const
 
double yResolution() const
 
QgsRasterRangeList noData() const
 
QStringList creationOptions() const
Raster creation options set for the output layer.
 
int maximumTileSizeX() const
 
QString outputLayerName() const
Name of the output layer within GeoPackage file.
 
QList< int > pyramidsList() const
 
Qgis::RasterBuildPyramidOption buildPyramidsFlag() const
Returns the pyramid building option.
 
QString outputFormat() const
 
QgsRectangle outputRectangle() const
 
QgsRasterLayerSaveAsDialog(QgsRasterLayer *rasterLayer, QgsRasterDataProvider *sourceProvider, const QgsRectangle ¤tExtent, const QgsCoordinateReferenceSystem &layerCrs, const QgsCoordinateReferenceSystem ¤tCrs, QWidget *parent SIP_TRANSFERTHIS=nullptr, Qt::WindowFlags f=Qt::WindowFlags())
Constructor for QgsRasterLayerSaveAsDialog.
 
bool addToCanvas() const
Returns true if the "add to canvas" checkbox is checked.
 
Q_DECL_DEPRECATED QStringList createOptions() const
 
int maximumTileSizeY() const
 
void setAddToCanvas(bool checked)
Sets whether the "add to canvas" checkbox should be checked.
 
QgsCoordinateReferenceSystem outputCrs()
 
QString outputFileName() const
 
Represents a raster layer.
 
QgsRasterRenderer * renderer() const
Returns the raster's renderer.
 
QgsRasterDataProvider * dataProvider() override
Returns the source data provider.
 
This struct is used to store pyramid info for the raster layer.
 
Represents a range of raster values between min and max, optionally including the min and max value.
 
const QgsRasterTransparency * rasterTransparency() const
 
Defines the list of pixel values to be considered as transparent or semi transparent when rendering r...
 
QVector< QgsRasterTransparency::TransparentSingleValuePixel > transparentSingleValuePixelList() const
Returns the transparent single value pixel list.
 
A rectangle specified with double values.
 
Stores settings for use within QGIS.
 
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
 
void setValue(const QString &key, const QVariant &value, QgsSettings::Section section=QgsSettings::NoSection)
Sets the value of setting key to value.
 
Represents a vector layer which manages a vector based dataset.
 
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c
 
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
 
#define QgsDebugMsgLevel(str, level)
 
#define MAXIMUM_OPENSTREETMAP_TILES_FETCH
 
QList< QgsRasterRange > QgsRasterRangeList
 
Defines the transparency for a range of single-band pixel values.