40#include <QRegularExpression>
42#include "moc_qgsrasterlayersaveasdialog.cpp"
45 : QDialog( parent, f )
46 , mRasterLayer( rasterLayer )
47 , mDataProvider( sourceProvider )
48 , mCurrentExtent( currentExtent )
49 , mLayerCrs( layerCrs )
50 , mCurrentCrs( currentCrs )
54 connect( mRawModeRadioButton, &QRadioButton::toggled,
this, &QgsRasterLayerSaveAsDialog::mRawModeRadioButton_toggled );
55 connect( mFormatComboBox, &QComboBox::currentTextChanged,
this, &QgsRasterLayerSaveAsDialog::mFormatComboBox_currentIndexChanged );
56 connect( mResolutionRadioButton, &QRadioButton::toggled,
this, &QgsRasterLayerSaveAsDialog::mResolutionRadioButton_toggled );
57 connect( mOriginalResolutionPushButton, &QPushButton::clicked,
this, &QgsRasterLayerSaveAsDialog::mOriginalResolutionPushButton_clicked );
58 connect( mXResolutionLineEdit, &QLineEdit::textEdited,
this, &QgsRasterLayerSaveAsDialog::mXResolutionLineEdit_textEdited );
59 connect( mYResolutionLineEdit, &QLineEdit::textEdited,
this, &QgsRasterLayerSaveAsDialog::mYResolutionLineEdit_textEdited );
60 connect( mOriginalSizePushButton, &QPushButton::clicked,
this, &QgsRasterLayerSaveAsDialog::mOriginalSizePushButton_clicked );
61 connect( mColumnsLineEdit, &QLineEdit::textEdited,
this, &QgsRasterLayerSaveAsDialog::mColumnsLineEdit_textEdited );
62 connect( mRowsLineEdit, &QLineEdit::textEdited,
this, &QgsRasterLayerSaveAsDialog::mRowsLineEdit_textEdited );
63 connect( mAddNoDataManuallyToolButton, &QPushButton::clicked,
this, &QgsRasterLayerSaveAsDialog::mAddNoDataManuallyToolButton_clicked );
64 connect( mLoadTransparentNoDataToolButton, &QPushButton::clicked,
this, &QgsRasterLayerSaveAsDialog::mLoadTransparentNoDataToolButton_clicked );
65 connect( mRemoveSelectedNoDataToolButton, &QPushButton::clicked,
this, &QgsRasterLayerSaveAsDialog::mRemoveSelectedNoDataToolButton_clicked );
66 connect( mRemoveAllNoDataToolButton, &QPushButton::clicked,
this, &QgsRasterLayerSaveAsDialog::mRemoveAllNoDataToolButton_clicked );
67 connect( mTileModeCheckBox, &QCheckBox::toggled,
this, &QgsRasterLayerSaveAsDialog::mTileModeCheckBox_toggled );
68 connect( mPyramidsGroupBox, &QgsCollapsibleGroupBox::toggled,
this, &QgsRasterLayerSaveAsDialog::mPyramidsGroupBox_toggled );
74 mNoDataTableWidget->setColumnCount( 2 );
75 mNoDataTableWidget->setHorizontalHeaderItem( 0,
new QTableWidgetItem( tr(
"From" ) ) );
76 mNoDataTableWidget->setHorizontalHeaderItem( 1,
new QTableWidgetItem( tr(
"To" ) ) );
78 mRawModeRadioButton_toggled(
true );
82 toggleResolutionSize();
84 insertAvailableOutputFormats();
91 setOriginalResolution();
92 int xSize = mDataProvider->xSize();
93 int ySize = mDataProvider->ySize();
94 mMaximumSizeXLineEdit->setText( QString::number( xSize ) );
95 mMaximumSizeYLineEdit->setText( QString::number( ySize ) );
99 mTileModeCheckBox->setChecked(
true );
100 mMaximumSizeXLineEdit->setText( QString::number( 2000 ) );
101 mMaximumSizeYLineEdit->setText( QString::number( 2000 ) );
105 mCreationOptionsWidget->setProvider( mDataProvider->name() );
106 if ( mDataProvider->name() == QLatin1String(
"gdal" ) )
108 mCreationOptionsWidget->setFormat( mFormatComboBox->currentData().toString() );
110 mCreationOptionsWidget->setRasterLayer( mRasterLayer );
111 mCreationOptionsWidget->update();
119 mPyramidsOptionsWidget->createOptionsWidget()->setRasterLayer( mRasterLayer );
124 mPyramidsUseExistingCheckBox->setEnabled(
false );
125 mPyramidsUseExistingCheckBox->setVisible(
false );
127 populatePyramidsLevels();
132 mPyramidsGroupBox->setEnabled(
false );
133 mPyramidsGroupBox->setCollapsed(
true );
138 mCreateOptionsGroupBox->setSaveCheckedState(
true );
148 mCrsSelector->setSourceEnsemble( ensemble.
name() );
154 mCrsSelector->setShowAccuracyWarnings(
true );
156 mCrsSelector->setLayerCrs( mLayerCrs );
158 mCrsSelector->setCrs( mLayerCrs );
162 QPushButton *okButton = mButtonBox->button( QDialogButtonBox::Ok );
165 okButton->setEnabled(
false );
169 mHelpButtonBox->setVisible(
false );
170 mButtonBox->addButton( QDialogButtonBox::Help );
171 connect( mButtonBox, &QDialogButtonBox::helpRequested,
this, &QgsRasterLayerSaveAsDialog::showHelp );
173 connect( mHelpButtonBox, &QDialogButtonBox::helpRequested,
this, &QgsRasterLayerSaveAsDialog::showHelp );
176 connect( mButtonBox, &QDialogButtonBox::rejected,
this, &QgsRasterLayerSaveAsDialog::reject );
178 mExtentGroupBox->setOutputCrs(
outputCrs() );
181 mExtentGroupBox->setOriginalExtent( mDataProvider->extent(), mLayerCrs );
183 mExtentGroupBox->setCurrentExtent( mCurrentExtent, mCurrentCrs );
184 mExtentGroupBox->setOutputExtentFromOriginal();
187 recalcResolutionSize();
191 if ( mTileModeCheckBox->isChecked() )
193 mTilesGroupBox->show();
195 mFilename->setDialogTitle( tr(
"Select Output Directory" ) );
199 mTilesGroupBox->hide();
201 mFilename->setDialogTitle( tr(
"Save Layer As" ) );
204 mFilename->setDefaultRoot( settings.
value( QStringLiteral(
"UI/lastRasterFileDir" ), QDir::homePath() ).toString() );
207 QFileInfo tmplFileInfo( filePath );
208 settings.
setValue( QStringLiteral(
"UI/lastRasterFileDir" ), tmplFileInfo.absolutePath() );
210 if ( !filePath.isEmpty() && mLayerName->isEnabled() )
212 QFileInfo fileInfo( filePath );
213 mLayerName->setText( fileInfo.baseName() );
216 if ( mTileModeCheckBox->isChecked() )
218 QString fileName = filePath;
223 if ( fileName.isEmpty() )
227 QDir dir( fileName );
228 QString baseName = QFileInfo( fileName ).baseName();
230 filters << QStringLiteral(
"%1.*" ).arg( baseName );
231 QStringList files = dir.entryList( filters );
232 if ( files.isEmpty() )
235 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 )
238 fileName = QFileDialog::getExistingDirectory(
this, tr(
"Select output directory" ), tmplFileInfo.absolutePath() );
242 QPushButton *okButton = mButtonBox->button( QDialogButtonBox::Ok );
247 okButton->setEnabled( tmplFileInfo.absoluteDir().exists() );
251void QgsRasterLayerSaveAsDialog::insertAvailableOutputFormats()
255 int nDrivers = GDALGetDriverCount();
256 QMap<int, QPair<QString, QString>> topPriorityDrivers;
257 QMap<QString, QString> lowPriorityDrivers;
259 for (
int i = 0; i < nDrivers; ++i )
261 GDALDriverH driver = GDALGetDriver( i );
266 QString driverShortName = GDALGetDriverShortName( driver );
267 QString driverLongName = GDALGetDriverLongName( driver );
268 if ( driverShortName == QLatin1String(
"MEM" ) )
275 else if ( driverShortName == QLatin1String(
"VRT" ) )
280 else if ( driverShortName == QLatin1String(
"GTiff" ) )
283 topPriorityDrivers.insert( 1, qMakePair( driverLongName, driverShortName ) );
285 else if ( driverShortName == QLatin1String(
"GPKG" ) )
288 topPriorityDrivers.insert( 2, qMakePair( driverLongName, driverShortName ) );
292 lowPriorityDrivers.insert( driverLongName, driverShortName );
299 for (
auto priorityDriversIt = topPriorityDrivers.constBegin(); priorityDriversIt != topPriorityDrivers.constEnd(); ++priorityDriversIt )
301 mFormatComboBox->addItem( priorityDriversIt.value().first, priorityDriversIt.value().second );
304 for (
auto lowPriorityDriversIt = lowPriorityDrivers.constBegin(); lowPriorityDriversIt != lowPriorityDrivers.constEnd(); ++lowPriorityDriversIt )
306 mFormatComboBox->addItem( lowPriorityDriversIt.key(), lowPriorityDriversIt.value() );
310void QgsRasterLayerSaveAsDialog::setValidators()
312 mXResolutionLineEdit->setValidator(
new QgsDoubleValidator(
this ) );
313 mYResolutionLineEdit->setValidator(
new QgsDoubleValidator(
this ) );
314 mColumnsLineEdit->setValidator(
new QIntValidator(
this ) );
315 mRowsLineEdit->setValidator(
new QIntValidator(
this ) );
316 mMaximumSizeXLineEdit->setValidator(
new QIntValidator(
this ) );
317 mMaximumSizeYLineEdit->setValidator(
new QIntValidator(
this ) );
320void QgsRasterLayerSaveAsDialog::mFormatComboBox_currentIndexChanged(
const QString & )
323 if ( mDataProvider && mDataProvider->name() == QLatin1String(
"gdal" ) )
326 mCreationOptionsWidget->update();
331 if ( extensions.empty() )
332 filter = tr(
"All files (*.*)" );
335 filter = QStringLiteral(
"%1 (*.%2);;%3" ).arg( mFormatComboBox->currentText(), extensions.join( QLatin1String(
" *." ) ), tr(
"All files (*.*)" ) );
337 mFilename->setFilter( filter );
340 mTileModeCheckBox->setEnabled(
outputFormat() != QLatin1String(
"GPKG" ) );
341 mFilename->setConfirmOverwrite(
outputFormat() != QLatin1String(
"GPKG" ) );
342 mLayerName->setEnabled(
outputFormat() == QLatin1String(
"GPKG" ) );
343 if ( mLayerName->isEnabled() )
345 QString layerName = QFileInfo( mFilename->filePath() ).baseName();
346 mLayerName->setText( layerName );
347 mTileModeCheckBox->setChecked(
false );
351 mLayerName->setText( QString() );
357 return mColumnsLineEdit->text().toInt();
362 return mRowsLineEdit->text().toInt();
377 return mMaximumSizeXLineEdit->text().toInt();
382 return mMaximumSizeYLineEdit->text().toInt();
387 return mTileModeCheckBox->isChecked();
392 return mAddToCanvas->isChecked();
397 mAddToCanvas->setChecked( checked );
402 QString fileName = mFilename->filePath();
408 if ( !extensions.empty() )
410 defaultExt = extensions.at( 0 );
414 QFileInfo fi( fileName );
415 if ( !fileName.isEmpty() && fi.suffix().isEmpty() && !defaultExt.isEmpty() )
417 fileName +=
'.' + defaultExt;
426 if ( mLayerName->text().isEmpty() &&
outputFormat() == QLatin1String(
"GPKG" ) && !mTileModeCheckBox->isChecked() )
429 return QFileInfo( mFilename->filePath() ).baseName();
433 return mLayerName->text();
439 return mFormatComboBox->currentData().toString();
449 QStringList options = mCreateOptionsGroupBox->isChecked() ? mCreationOptionsWidget->options() : QStringList();
453 int indx = options.indexOf( QRegularExpression(
"^RASTER_TABLE=.*", QRegularExpression::CaseInsensitiveOption | QRegularExpression::MultilineOption ) );
456 options.replace( indx, QStringLiteral(
"RASTER_TABLE=%1" ).arg(
outputLayerName() ) );
460 options.append( QStringLiteral(
"RASTER_TABLE=%1" ).arg(
outputLayerName() ) );
464 if ( !outputLayerExists() )
466 indx = options.indexOf( QRegularExpression(
"^APPEND_SUBDATASET=.*", QRegularExpression::CaseInsensitiveOption | QRegularExpression::MultilineOption ) );
469 options.replace( indx, QStringLiteral(
"APPEND_SUBDATASET=YES" ) );
473 options.append( QStringLiteral(
"APPEND_SUBDATASET=YES" ) );
482 return mExtentGroupBox->outputExtent();
487 mFormatLabel->hide();
488 mFormatComboBox->hide();
493 mSaveAsLabel->hide();
495 QPushButton *okButton = mButtonBox->button( QDialogButtonBox::Ok );
498 okButton->setEnabled(
true );
502void QgsRasterLayerSaveAsDialog::toggleResolutionSize()
506 bool on = mResolutionRadioButton->isChecked();
507 mXResolutionLineEdit->setEnabled( on );
508 mYResolutionLineEdit->setEnabled( on );
509 mOriginalResolutionPushButton->setEnabled( on && hasResolution );
510 mColumnsLineEdit->setEnabled( !on );
511 mRowsLineEdit->setEnabled( !on );
512 mOriginalSizePushButton->setEnabled( !on && hasResolution );
515void QgsRasterLayerSaveAsDialog::setOriginalResolution()
521 xRes = mDataProvider->extent().width() / mDataProvider->xSize();
522 yRes = mDataProvider->extent().height() / mDataProvider->ySize();
527 xRes = yRes = mDataProvider->extent().width() / 100;
529 setResolution( xRes, yRes, mLayerCrs );
547 QgsRectangle srcExtent( srsCenter.
x() - xRes / 2, srsCenter.
y() - yRes / 2, srsCenter.
x() + xRes / 2, srsCenter.
y() + yRes / 2 );
549 QgsRectangle extent = ct.transform( srcExtent );
550 xRes = extent.
width();
553 mXResolutionLineEdit->setText( QLocale().toString( xRes ) );
554 mYResolutionLineEdit->setText( QLocale().toString( yRes ) );
557void QgsRasterLayerSaveAsDialog::recalcSize()
562 mColumnsLineEdit->setText( QString::number( xSize ) );
563 mRowsLineEdit->setText( QString::number( ySize ) );
564 updateResolutionStateMsg();
567void QgsRasterLayerSaveAsDialog::setOriginalSize()
569 mColumnsLineEdit->setText( QString::number( mDataProvider->xSize() ) );
570 mRowsLineEdit->setText( QString::number( mDataProvider->ySize() ) );
574void QgsRasterLayerSaveAsDialog::recalcResolution()
579 mXResolutionLineEdit->setText( QLocale().toString( xRes ) );
580 mYResolutionLineEdit->setText( QLocale().toString( yRes ) );
581 updateResolutionStateMsg();
584void QgsRasterLayerSaveAsDialog::recalcResolutionSize()
586 if ( mResolutionRadioButton->isChecked() )
597void QgsRasterLayerSaveAsDialog::updateResolutionStateMsg()
600 switch ( mResolutionState )
606 msg = tr(
"user defined" );
611 msg = tr(
"Resolution (current: %1)" ).arg( msg );
612 mResolutionGroupBox->setTitle( msg );
615void QgsRasterLayerSaveAsDialog::extentChanged()
618 if ( mSizeRadioButton->isChecked() )
622 recalcResolutionSize();
625void QgsRasterLayerSaveAsDialog::crsChanged()
629 mExtentGroupBox->setOutputCrs(
outputCrs() );
632 if ( mResolutionRadioButton->isChecked() )
636 setOriginalResolution();
655 return mCrsSelector->crs();
660 if ( mRenderedModeRadioButton->isChecked() )
665void QgsRasterLayerSaveAsDialog::mRawModeRadioButton_toggled(
bool checked )
667 mNoDataGroupBox->setEnabled( checked && mDataProvider->
bandCount() == 1 );
668 mNoDataGroupBox->setCollapsed( !mNoDataGroupBox->isEnabled() );
671void QgsRasterLayerSaveAsDialog::mAddNoDataManuallyToolButton_clicked()
673 addNoDataRow( std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN() );
676void QgsRasterLayerSaveAsDialog::mLoadTransparentNoDataToolButton_clicked()
678 if ( !mRasterLayer->renderer() )
680 const QgsRasterTransparency *rasterTransparency = mRasterLayer->renderer()->rasterTransparency();
681 if ( !rasterTransparency )
685 for (
const QgsRasterTransparency::TransparentSingleValuePixel &transparencyPixel : constTransparentSingleValuePixelList )
689 addNoDataRow( transparencyPixel.min, transparencyPixel.max );
690 if ( transparencyPixel.min != transparencyPixel.max )
692 setNoDataToEdited( mNoDataTableWidget->rowCount() - 1 );
698void QgsRasterLayerSaveAsDialog::mRemoveSelectedNoDataToolButton_clicked()
700 mNoDataTableWidget->removeRow( mNoDataTableWidget->currentRow() );
703void QgsRasterLayerSaveAsDialog::mRemoveAllNoDataToolButton_clicked()
705 while ( mNoDataTableWidget->rowCount() > 0 )
707 mNoDataTableWidget->removeRow( 0 );
711void QgsRasterLayerSaveAsDialog::addNoDataRow(
double min,
double max )
713 mNoDataTableWidget->insertRow( mNoDataTableWidget->rowCount() );
714 for (
int i = 0; i < 2; i++ )
716 double value = i == 0 ? min : max;
717 QLineEdit *lineEdit =
new QLineEdit();
718 lineEdit->setFrame(
false );
719 lineEdit->setContentsMargins( 1, 1, 1, 1 );
721 switch ( mRasterLayer->dataProvider()->sourceDataType( 1 ) )
725 lineEdit->setValidator(
new QgsDoubleValidator(
nullptr ) );
726 if ( !std::isnan( value ) )
732 lineEdit->setValidator(
new QIntValidator(
nullptr ) );
733 if ( !std::isnan( value ) )
735 valueString = QLocale().toString(
static_cast<int>( value ) );
739 lineEdit->setText( valueString );
740 mNoDataTableWidget->setCellWidget( mNoDataTableWidget->rowCount() - 1, i, lineEdit );
742 adjustNoDataCellWidth( mNoDataTableWidget->rowCount() - 1, i );
744 connect( lineEdit, &QLineEdit::textEdited,
this, &QgsRasterLayerSaveAsDialog::noDataCellTextEdited );
746 mNoDataTableWidget->resizeColumnsToContents();
747 mNoDataTableWidget->resizeRowsToContents();
750void QgsRasterLayerSaveAsDialog::noDataCellTextEdited(
const QString &text )
754 QLineEdit *lineEdit = qobject_cast<QLineEdit *>( sender() );
759 for (
int r = 0; r < mNoDataTableWidget->rowCount(); r++ )
761 for (
int c = 0;
c < mNoDataTableWidget->columnCount();
c++ )
763 if ( mNoDataTableWidget->cellWidget( r,
c ) == sender() )
773 QgsDebugMsgLevel( QStringLiteral(
"row = %1 column =%2" ).arg( row ).arg( column ), 2 );
777 QLineEdit *toLineEdit =
dynamic_cast<QLineEdit *
>( mNoDataTableWidget->cellWidget( row, 1 ) );
780 bool toChanged = mNoDataToEdited.value( row );
784 toLineEdit->setText( lineEdit->text() );
787 else if ( column == 1 )
789 setNoDataToEdited( row );
793void QgsRasterLayerSaveAsDialog::mTileModeCheckBox_toggled(
bool toggled )
812 mTilesGroupBox->show();
814 mFilename->setDialogTitle( tr(
"Select Output Directory" ) );
818 mTilesGroupBox->hide();
820 mFilename->setDialogTitle( tr(
"Save Layer As" ) );
824void QgsRasterLayerSaveAsDialog::mPyramidsGroupBox_toggled(
bool toggled )
827 populatePyramidsLevels();
830void QgsRasterLayerSaveAsDialog::populatePyramidsLevels()
834 if ( mPyramidsGroupBox->isChecked() )
836 QList<QgsRasterPyramid> myPyramidList;
839 if ( mPyramidsUseExistingCheckBox->isChecked() )
841 myPyramidList = mDataProvider->buildPyramidList();
845 if ( !mPyramidsOptionsWidget->overviewList().isEmpty() )
846 myPyramidList = mDataProvider->buildPyramidList( mPyramidsOptionsWidget->overviewList() );
848 for (
const QgsRasterPyramid &pyramid : std::as_const( myPyramidList ) )
850 if ( !mPyramidsUseExistingCheckBox->isChecked() || pyramid.getExists() )
852 text += QString::number( pyramid.getXDim() ) + QStringLiteral(
"x" ) + QString::number( pyramid.getYDim() ) +
' ';
857 mPyramidResolutionsLineEdit->setText( text.trimmed() );
860void QgsRasterLayerSaveAsDialog::setNoDataToEdited(
int row )
862 if ( row >= mNoDataToEdited.size() )
864 mNoDataToEdited.resize( row + 1 );
866 mNoDataToEdited[row] =
true;
869double QgsRasterLayerSaveAsDialog::noDataCellValue(
int row,
int column )
const
871 QLineEdit *lineEdit =
dynamic_cast<QLineEdit *
>( mNoDataTableWidget->cellWidget( row, column ) );
872 if ( !lineEdit || lineEdit->text().isEmpty() )
874 return std::numeric_limits<double>::quiet_NaN();
879void QgsRasterLayerSaveAsDialog::adjustNoDataCellWidth(
int row,
int column )
881 QLineEdit *lineEdit =
dynamic_cast<QLineEdit *
>( mNoDataTableWidget->cellWidget( row, column ) );
885 int width = std::max( lineEdit->fontMetrics().boundingRect( lineEdit->text() ).width() + 10, 100 );
886 width = std::max( width, mNoDataTableWidget->columnWidth( column ) );
888 lineEdit->setFixedWidth( width );
894 if ( !mNoDataGroupBox->isChecked() )
897 int rows = mNoDataTableWidget->rowCount();
898 noDataList.reserve( rows );
899 for (
int r = 0; r < rows; r++ )
902 noDataList.append(
noData );
909 return mPyramidsGroupBox->isChecked() ? mPyramidsOptionsWidget->overviewList() : QList<int>();
914 if ( !mPyramidsGroupBox->isChecked() )
916 else if ( mPyramidsUseExistingCheckBox->isChecked() )
922bool QgsRasterLayerSaveAsDialog::validate()
const
924 if ( mCreateOptionsGroupBox->isChecked() )
926 QString message = mCreationOptionsWidget->validateOptions(
true,
false );
927 if ( !message.isNull() )
930 if ( mPyramidsGroupBox->isChecked() )
932 QString message = mPyramidsOptionsWidget->createOptionsWidget()->validateOptions(
true,
false );
933 if ( !message.isNull() )
939bool QgsRasterLayerSaveAsDialog::outputLayerExists()
const
953 QgsRasterLayer rasterLayer( rasterUri, QString(), QStringLiteral(
"gdal" ) );
954 if ( !vectorUri.isEmpty() )
956 QgsVectorLayer vectorLayer( vectorUri, QString(), QStringLiteral(
"ogr" ) );
957 return rasterLayer.isValid() || vectorLayer.isValid();
961 return rasterLayer.isValid();
974 const int nbTilesWidth = std::ceil(
nColumns() / 256 );
975 const int nbTilesHeight = std::ceil(
nRows() / 256 );
976 int64_t totalTiles =
static_cast<int64_t
>( nbTilesWidth ) * nbTilesHeight;
980 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 );
985 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. "
986 "Do you want to overwrite the whole file?" )
988 QMessageBox::Yes | QMessageBox::No )
997void QgsRasterLayerSaveAsDialog::showHelp()
999 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).
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.
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.
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 bandCount() const =0
Gets number of bands.
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.
Represents a range of raster values between min and max, optionally including the min and max value.
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.
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