40#include <QRegularExpression>
43#include "moc_qgsrasterlayersaveasdialog.cpp"
45using namespace Qt::StringLiterals;
48 : QDialog( parent, f )
49 , mRasterLayer( rasterLayer )
50 , mDataProvider( sourceProvider )
51 , mCurrentExtent( currentExtent )
52 , mLayerCrs( layerCrs )
53 , mCurrentCrs( currentCrs )
57 connect( mRawModeRadioButton, &QRadioButton::toggled,
this, &QgsRasterLayerSaveAsDialog::mRawModeRadioButton_toggled );
58 connect( mFormatComboBox, &QComboBox::currentTextChanged,
this, &QgsRasterLayerSaveAsDialog::mFormatComboBox_currentIndexChanged );
59 connect( mResolutionRadioButton, &QRadioButton::toggled,
this, &QgsRasterLayerSaveAsDialog::mResolutionRadioButton_toggled );
60 connect( mOriginalResolutionPushButton, &QPushButton::clicked,
this, &QgsRasterLayerSaveAsDialog::mOriginalResolutionPushButton_clicked );
61 connect( mXResolutionLineEdit, &QLineEdit::textEdited,
this, &QgsRasterLayerSaveAsDialog::mXResolutionLineEdit_textEdited );
62 connect( mYResolutionLineEdit, &QLineEdit::textEdited,
this, &QgsRasterLayerSaveAsDialog::mYResolutionLineEdit_textEdited );
63 connect( mOriginalSizePushButton, &QPushButton::clicked,
this, &QgsRasterLayerSaveAsDialog::mOriginalSizePushButton_clicked );
64 connect( mColumnsLineEdit, &QLineEdit::textEdited,
this, &QgsRasterLayerSaveAsDialog::mColumnsLineEdit_textEdited );
65 connect( mRowsLineEdit, &QLineEdit::textEdited,
this, &QgsRasterLayerSaveAsDialog::mRowsLineEdit_textEdited );
66 connect( mAddNoDataManuallyToolButton, &QPushButton::clicked,
this, &QgsRasterLayerSaveAsDialog::mAddNoDataManuallyToolButton_clicked );
67 connect( mLoadTransparentNoDataToolButton, &QPushButton::clicked,
this, &QgsRasterLayerSaveAsDialog::mLoadTransparentNoDataToolButton_clicked );
68 connect( mRemoveSelectedNoDataToolButton, &QPushButton::clicked,
this, &QgsRasterLayerSaveAsDialog::mRemoveSelectedNoDataToolButton_clicked );
69 connect( mRemoveAllNoDataToolButton, &QPushButton::clicked,
this, &QgsRasterLayerSaveAsDialog::mRemoveAllNoDataToolButton_clicked );
70 connect( mTileModeCheckBox, &QCheckBox::toggled,
this, &QgsRasterLayerSaveAsDialog::mTileModeCheckBox_toggled );
71 connect( mPyramidsGroupBox, &QgsCollapsibleGroupBox::toggled,
this, &QgsRasterLayerSaveAsDialog::mPyramidsGroupBox_toggled );
77 mNoDataTableWidget->setColumnCount( 2 );
78 mNoDataTableWidget->setHorizontalHeaderItem( 0,
new QTableWidgetItem( tr(
"From" ) ) );
79 mNoDataTableWidget->setHorizontalHeaderItem( 1,
new QTableWidgetItem( tr(
"To" ) ) );
81 mRawModeRadioButton_toggled(
true );
85 toggleResolutionSize();
87 insertAvailableOutputFormats();
94 setOriginalResolution();
95 int xSize = mDataProvider->xSize();
96 int ySize = mDataProvider->ySize();
97 mMaximumSizeXLineEdit->setText( QString::number( xSize ) );
98 mMaximumSizeYLineEdit->setText( QString::number( ySize ) );
102 mTileModeCheckBox->setChecked(
true );
103 mMaximumSizeXLineEdit->setText( QString::number( 2000 ) );
104 mMaximumSizeYLineEdit->setText( QString::number( 2000 ) );
108 mCreationOptionsWidget->setProvider( mDataProvider->name() );
109 if ( mDataProvider->name() ==
"gdal"_L1 )
111 mCreationOptionsWidget->setFormat( mFormatComboBox->currentData().toString() );
113 mCreationOptionsWidget->setRasterLayer( mRasterLayer );
114 mCreationOptionsWidget->update();
122 mPyramidsOptionsWidget->createOptionsWidget()->setRasterLayer( mRasterLayer );
127 mPyramidsUseExistingCheckBox->setEnabled(
false );
128 mPyramidsUseExistingCheckBox->setVisible(
false );
130 populatePyramidsLevels();
135 mPyramidsGroupBox->setEnabled(
false );
136 mPyramidsGroupBox->setCollapsed(
true );
141 mCreateOptionsGroupBox->setSaveCheckedState(
true );
151 mCrsSelector->setSourceEnsemble( ensemble.
name() );
157 mCrsSelector->setShowAccuracyWarnings(
true );
159 mCrsSelector->setLayerCrs( mLayerCrs );
161 mCrsSelector->setCrs( mLayerCrs );
165 QPushButton *okButton = mButtonBox->button( QDialogButtonBox::Ok );
168 okButton->setEnabled(
false );
172 mHelpButtonBox->setVisible(
false );
173 mButtonBox->addButton( QDialogButtonBox::Help );
174 connect( mButtonBox, &QDialogButtonBox::helpRequested,
this, &QgsRasterLayerSaveAsDialog::showHelp );
176 connect( mHelpButtonBox, &QDialogButtonBox::helpRequested,
this, &QgsRasterLayerSaveAsDialog::showHelp );
179 connect( mButtonBox, &QDialogButtonBox::rejected,
this, &QgsRasterLayerSaveAsDialog::reject );
181 mExtentGroupBox->setOutputCrs(
outputCrs() );
184 mExtentGroupBox->setOriginalExtent( mDataProvider->extent(), mLayerCrs );
186 mExtentGroupBox->setCurrentExtent( mCurrentExtent, mCurrentCrs );
187 mExtentGroupBox->setOutputExtentFromOriginal();
190 recalcResolutionSize();
194 if ( mTileModeCheckBox->isChecked() )
196 mTilesGroupBox->show();
198 mFilename->setDialogTitle( tr(
"Select Output Directory" ) );
202 mTilesGroupBox->hide();
204 mFilename->setDialogTitle( tr(
"Save Layer As" ) );
207 mFilename->setDefaultRoot( settings.
value( u
"UI/lastRasterFileDir"_s, QDir::homePath() ).toString() );
210 QFileInfo tmplFileInfo( filePath );
211 settings.
setValue( u
"UI/lastRasterFileDir"_s, tmplFileInfo.absolutePath() );
213 if ( !filePath.isEmpty() && mLayerName->isEnabled() )
215 QFileInfo fileInfo( filePath );
216 mLayerName->setText( fileInfo.baseName() );
219 if ( mTileModeCheckBox->isChecked() )
221 QString fileName = filePath;
226 if ( fileName.isEmpty() )
230 QDir dir( fileName );
231 QString baseName = QFileInfo( fileName ).baseName();
233 filters << u
"%1.*"_s.arg( baseName );
234 QStringList files = dir.entryList( filters );
235 if ( files.isEmpty() )
238 if ( QMessageBox::warning(
this, tr(
"Save Raster Layer" ), tr(
"The directory %1 contains files which will be overwritten: %2" ).arg( dir.absolutePath(), files.join(
", "_L1 ) ), QMessageBox::Ok | QMessageBox::Cancel ) == QMessageBox::Ok )
241 fileName = QFileDialog::getExistingDirectory(
this, tr(
"Select output directory" ), tmplFileInfo.absolutePath() );
245 QPushButton *okButton = mButtonBox->button( QDialogButtonBox::Ok );
250 okButton->setEnabled( tmplFileInfo.absoluteDir().exists() );
254void QgsRasterLayerSaveAsDialog::insertAvailableOutputFormats()
258 int nDrivers = GDALGetDriverCount();
259 QMap<int, QPair<QString, QString>> topPriorityDrivers;
260 QMap<QString, QString> lowPriorityDrivers;
262 for (
int i = 0; i < nDrivers; ++i )
264 GDALDriverH driver = GDALGetDriver( i );
269 QString driverShortName = GDALGetDriverShortName( driver );
270 QString driverLongName = GDALGetDriverLongName( driver );
271 if ( driverShortName ==
"MEM"_L1 )
278 else if ( driverShortName ==
"VRT"_L1 )
283 else if ( driverShortName ==
"GTiff"_L1 )
286 topPriorityDrivers.insert( 1, qMakePair( driverLongName, driverShortName ) );
288 else if ( driverShortName ==
"GPKG"_L1 )
291 topPriorityDrivers.insert( 2, qMakePair( driverLongName, driverShortName ) );
295 lowPriorityDrivers.insert( driverLongName, driverShortName );
302 for (
auto priorityDriversIt = topPriorityDrivers.constBegin(); priorityDriversIt != topPriorityDrivers.constEnd(); ++priorityDriversIt )
304 mFormatComboBox->addItem( priorityDriversIt.value().first, priorityDriversIt.value().second );
307 for (
auto lowPriorityDriversIt = lowPriorityDrivers.constBegin(); lowPriorityDriversIt != lowPriorityDrivers.constEnd(); ++lowPriorityDriversIt )
309 mFormatComboBox->addItem( lowPriorityDriversIt.key(), lowPriorityDriversIt.value() );
313void QgsRasterLayerSaveAsDialog::setValidators()
315 mXResolutionLineEdit->setValidator(
new QgsDoubleValidator(
this ) );
316 mYResolutionLineEdit->setValidator(
new QgsDoubleValidator(
this ) );
317 mColumnsLineEdit->setValidator(
new QIntValidator(
this ) );
318 mRowsLineEdit->setValidator(
new QIntValidator(
this ) );
319 mMaximumSizeXLineEdit->setValidator(
new QIntValidator(
this ) );
320 mMaximumSizeYLineEdit->setValidator(
new QIntValidator(
this ) );
323void QgsRasterLayerSaveAsDialog::mFormatComboBox_currentIndexChanged(
const QString & )
326 if ( mDataProvider && mDataProvider->name() ==
"gdal"_L1 )
329 mCreationOptionsWidget->update();
334 if ( extensions.empty() )
335 filter = tr(
"All files (*.*)" );
338 filter = u
"%1 (*.%2);;%3"_s.arg( mFormatComboBox->currentText(), extensions.join(
" *."_L1 ), tr(
"All files (*.*)" ) );
340 mFilename->setFilter( filter );
343 mTileModeCheckBox->setEnabled(
outputFormat() !=
"GPKG"_L1 );
344 mFilename->setConfirmOverwrite(
outputFormat() !=
"GPKG"_L1 );
346 if ( mLayerName->isEnabled() )
348 QString layerName = QFileInfo( mFilename->filePath() ).baseName();
349 mLayerName->setText( layerName );
350 mTileModeCheckBox->setChecked(
false );
354 mLayerName->setText( QString() );
360 mPyramidsGroupBox->setChecked(
true );
362 mPyramidResolutionsLabel->setVisible( !isCOG );
363 mPyramidResolutionsLineEdit->setVisible( !isCOG );
364 mPyramidsOptionsWidget->tuneForFormat(
outputFormat() );
369 return mColumnsLineEdit->text().toInt();
374 return mRowsLineEdit->text().toInt();
389 return mMaximumSizeXLineEdit->text().toInt();
394 return mMaximumSizeYLineEdit->text().toInt();
399 return mTileModeCheckBox->isChecked();
404 return mAddToCanvas->isChecked();
409 mAddToCanvas->setChecked( checked );
414 QString fileName = mFilename->filePath();
420 if ( !extensions.empty() )
422 defaultExt = extensions.at( 0 );
426 QFileInfo fi( fileName );
427 if ( !fileName.isEmpty() && fi.suffix().isEmpty() && !defaultExt.isEmpty() )
429 fileName +=
'.' + defaultExt;
438 if ( mLayerName->text().isEmpty() &&
outputFormat() ==
"GPKG"_L1 && !mTileModeCheckBox->isChecked() )
441 return QFileInfo( mFilename->filePath() ).baseName();
445 return mLayerName->text();
451 return mFormatComboBox->currentData().toString();
461 QStringList options = mCreateOptionsGroupBox->isChecked() ? mCreationOptionsWidget->options() : QStringList();
465 int indx = options.indexOf( QRegularExpression(
"^RASTER_TABLE=.*", QRegularExpression::CaseInsensitiveOption | QRegularExpression::MultilineOption ) );
468 options.replace( indx, u
"RASTER_TABLE=%1"_s.arg(
outputLayerName() ) );
476 if ( !outputLayerExists() )
478 indx = options.indexOf( QRegularExpression(
"^APPEND_SUBDATASET=.*", QRegularExpression::CaseInsensitiveOption | QRegularExpression::MultilineOption ) );
481 options.replace( indx, u
"APPEND_SUBDATASET=YES"_s );
485 options.append( u
"APPEND_SUBDATASET=YES"_s );
494 return mExtentGroupBox->outputExtent();
499 mFormatLabel->hide();
500 mFormatComboBox->hide();
505 mSaveAsLabel->hide();
507 QPushButton *okButton = mButtonBox->button( QDialogButtonBox::Ok );
510 okButton->setEnabled(
true );
514void QgsRasterLayerSaveAsDialog::toggleResolutionSize()
518 bool on = mResolutionRadioButton->isChecked();
519 mXResolutionLineEdit->setEnabled( on );
520 mYResolutionLineEdit->setEnabled( on );
521 mOriginalResolutionPushButton->setEnabled( on && hasResolution );
522 mColumnsLineEdit->setEnabled( !on );
523 mRowsLineEdit->setEnabled( !on );
524 mOriginalSizePushButton->setEnabled( !on && hasResolution );
527void QgsRasterLayerSaveAsDialog::setOriginalResolution()
533 xRes = mDataProvider->extent().width() / mDataProvider->xSize();
534 yRes = mDataProvider->extent().height() / mDataProvider->ySize();
539 xRes = yRes = mDataProvider->extent().width() / 100;
541 setResolution( xRes, yRes, mLayerCrs );
559 QgsRectangle srcExtent( srsCenter.
x() - xRes / 2, srsCenter.
y() - yRes / 2, srsCenter.
x() + xRes / 2, srsCenter.
y() + yRes / 2 );
561 QgsRectangle extent = ct.transform( srcExtent );
562 xRes = extent.
width();
565 mXResolutionLineEdit->setText( QLocale().toString( xRes ) );
566 mYResolutionLineEdit->setText( QLocale().toString( yRes ) );
569void QgsRasterLayerSaveAsDialog::recalcSize()
574 mColumnsLineEdit->setText( QString::number( xSize ) );
575 mRowsLineEdit->setText( QString::number( ySize ) );
576 updateResolutionStateMsg();
579void QgsRasterLayerSaveAsDialog::setOriginalSize()
581 mColumnsLineEdit->setText( QString::number( mDataProvider->xSize() ) );
582 mRowsLineEdit->setText( QString::number( mDataProvider->ySize() ) );
586void QgsRasterLayerSaveAsDialog::recalcResolution()
591 mXResolutionLineEdit->setText( QLocale().toString( xRes ) );
592 mYResolutionLineEdit->setText( QLocale().toString( yRes ) );
593 updateResolutionStateMsg();
596void QgsRasterLayerSaveAsDialog::recalcResolutionSize()
598 if ( mResolutionRadioButton->isChecked() )
609void QgsRasterLayerSaveAsDialog::updateResolutionStateMsg()
612 switch ( mResolutionState )
618 msg = tr(
"user defined" );
623 msg = tr(
"Resolution (current: %1)" ).arg( msg );
624 mResolutionGroupBox->setTitle( msg );
627void QgsRasterLayerSaveAsDialog::extentChanged()
630 if ( mSizeRadioButton->isChecked() )
634 recalcResolutionSize();
637void QgsRasterLayerSaveAsDialog::crsChanged()
641 mExtentGroupBox->setOutputCrs(
outputCrs() );
644 if ( mResolutionRadioButton->isChecked() )
648 setOriginalResolution();
667 return mCrsSelector->crs();
672 if ( mRenderedModeRadioButton->isChecked() )
677void QgsRasterLayerSaveAsDialog::mRawModeRadioButton_toggled(
bool checked )
679 mNoDataGroupBox->setEnabled( checked && mDataProvider->
bandCount() == 1 );
680 mNoDataGroupBox->setCollapsed( !mNoDataGroupBox->isEnabled() );
683void QgsRasterLayerSaveAsDialog::mAddNoDataManuallyToolButton_clicked()
685 addNoDataRow( std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN() );
688void QgsRasterLayerSaveAsDialog::mLoadTransparentNoDataToolButton_clicked()
690 if ( !mRasterLayer->renderer() )
692 const QgsRasterTransparency *rasterTransparency = mRasterLayer->renderer()->rasterTransparency();
693 if ( !rasterTransparency )
697 for (
const QgsRasterTransparency::TransparentSingleValuePixel &transparencyPixel : constTransparentSingleValuePixelList )
701 addNoDataRow( transparencyPixel.min, transparencyPixel.max );
702 if ( transparencyPixel.min != transparencyPixel.max )
704 setNoDataToEdited( mNoDataTableWidget->rowCount() - 1 );
710void QgsRasterLayerSaveAsDialog::mRemoveSelectedNoDataToolButton_clicked()
712 mNoDataTableWidget->removeRow( mNoDataTableWidget->currentRow() );
715void QgsRasterLayerSaveAsDialog::mRemoveAllNoDataToolButton_clicked()
717 while ( mNoDataTableWidget->rowCount() > 0 )
719 mNoDataTableWidget->removeRow( 0 );
723void QgsRasterLayerSaveAsDialog::addNoDataRow(
double min,
double max )
725 mNoDataTableWidget->insertRow( mNoDataTableWidget->rowCount() );
726 for (
int i = 0; i < 2; i++ )
728 double value = i == 0 ? min : max;
729 QLineEdit *lineEdit =
new QLineEdit();
730 lineEdit->setFrame(
false );
731 lineEdit->setContentsMargins( 1, 1, 1, 1 );
733 switch ( mRasterLayer->dataProvider()->sourceDataType( 1 ) )
737 lineEdit->setValidator(
new QgsDoubleValidator(
nullptr ) );
738 if ( !std::isnan( value ) )
744 lineEdit->setValidator(
new QIntValidator(
nullptr ) );
745 if ( !std::isnan( value ) )
747 valueString = QLocale().toString(
static_cast<int>( value ) );
751 lineEdit->setText( valueString );
752 mNoDataTableWidget->setCellWidget( mNoDataTableWidget->rowCount() - 1, i, lineEdit );
754 adjustNoDataCellWidth( mNoDataTableWidget->rowCount() - 1, i );
756 connect( lineEdit, &QLineEdit::textEdited,
this, &QgsRasterLayerSaveAsDialog::noDataCellTextEdited );
758 mNoDataTableWidget->resizeColumnsToContents();
759 mNoDataTableWidget->resizeRowsToContents();
762void QgsRasterLayerSaveAsDialog::noDataCellTextEdited(
const QString &text )
766 QLineEdit *lineEdit = qobject_cast<QLineEdit *>( sender() );
771 for (
int r = 0; r < mNoDataTableWidget->rowCount(); r++ )
773 for (
int c = 0;
c < mNoDataTableWidget->columnCount();
c++ )
775 if ( mNoDataTableWidget->cellWidget( r,
c ) == sender() )
789 QLineEdit *toLineEdit =
dynamic_cast<QLineEdit *
>( mNoDataTableWidget->cellWidget( row, 1 ) );
792 bool toChanged = mNoDataToEdited.value( row );
796 toLineEdit->setText( lineEdit->text() );
799 else if ( column == 1 )
801 setNoDataToEdited( row );
805void QgsRasterLayerSaveAsDialog::mTileModeCheckBox_toggled(
bool toggled )
824 mTilesGroupBox->show();
826 mFilename->setDialogTitle( tr(
"Select Output Directory" ) );
830 mTilesGroupBox->hide();
832 mFilename->setDialogTitle( tr(
"Save Layer As" ) );
836void QgsRasterLayerSaveAsDialog::mPyramidsGroupBox_toggled(
bool toggled )
839 populatePyramidsLevels();
842void QgsRasterLayerSaveAsDialog::populatePyramidsLevels()
846 if ( mPyramidsGroupBox->isChecked() )
848 QList<QgsRasterPyramid> myPyramidList;
851 if ( mPyramidsUseExistingCheckBox->isChecked() )
853 myPyramidList = mDataProvider->buildPyramidList();
857 if ( !mPyramidsOptionsWidget->overviewList().isEmpty() )
858 myPyramidList = mDataProvider->buildPyramidList( mPyramidsOptionsWidget->overviewList() );
860 for (
const QgsRasterPyramid &pyramid : std::as_const( myPyramidList ) )
862 if ( !mPyramidsUseExistingCheckBox->isChecked() || pyramid.getExists() )
864 text += QString::number( pyramid.getXDim() ) + u
"x"_s + QString::number( pyramid.getYDim() ) +
' ';
869 mPyramidResolutionsLineEdit->setText( text.trimmed() );
872void QgsRasterLayerSaveAsDialog::setNoDataToEdited(
int row )
874 if ( row >= mNoDataToEdited.size() )
876 mNoDataToEdited.resize( row + 1 );
878 mNoDataToEdited[row] =
true;
881double QgsRasterLayerSaveAsDialog::noDataCellValue(
int row,
int column )
const
883 QLineEdit *lineEdit =
dynamic_cast<QLineEdit *
>( mNoDataTableWidget->cellWidget( row, column ) );
884 if ( !lineEdit || lineEdit->text().isEmpty() )
886 return std::numeric_limits<double>::quiet_NaN();
891void QgsRasterLayerSaveAsDialog::adjustNoDataCellWidth(
int row,
int column )
893 QLineEdit *lineEdit =
dynamic_cast<QLineEdit *
>( mNoDataTableWidget->cellWidget( row, column ) );
897 int width = std::max( lineEdit->fontMetrics().boundingRect( lineEdit->text() ).width() + 10, 100 );
898 width = std::max( width, mNoDataTableWidget->columnWidth( column ) );
900 lineEdit->setFixedWidth( width );
906 if ( !mNoDataGroupBox->isChecked() )
909 int rows = mNoDataTableWidget->rowCount();
910 noDataList.reserve( rows );
911 for (
int r = 0; r < rows; r++ )
914 noDataList.append(
noData );
921 return mPyramidsGroupBox->isChecked() ? mPyramidsOptionsWidget->overviewList() : QList<int>();
926 if ( !mPyramidsGroupBox->isChecked() )
928 else if ( mPyramidsUseExistingCheckBox->isChecked() )
934bool QgsRasterLayerSaveAsDialog::validate()
const
936 if ( mCreateOptionsGroupBox->isChecked() )
938 QString message = mCreationOptionsWidget->validateOptions(
true,
false );
939 if ( !message.isNull() )
942 if ( mPyramidsGroupBox->isChecked() )
944 QString message = mPyramidsOptionsWidget->createOptionsWidget()->validateOptions(
true,
false );
945 if ( !message.isNull() )
951bool QgsRasterLayerSaveAsDialog::outputLayerExists()
const
965 QgsRasterLayer rasterLayer( rasterUri, QString(), u
"gdal"_s );
966 if ( !vectorUri.isEmpty() )
968 QgsVectorLayer vectorLayer( vectorUri, QString(), u
"ogr"_s );
969 return rasterLayer.isValid() || vectorLayer.isValid();
973 return rasterLayer.isValid();
986 const int nbTilesWidth = std::ceil(
nColumns() / 256 );
987 const int nbTilesHeight = std::ceil(
nRows() / 256 );
988 int64_t totalTiles =
static_cast<int64_t
>( nbTilesWidth ) * nbTilesHeight;
992 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( u
"<a href=\"https://operations.osmfoundation.org/policies/tiles/\">"_s, u
"</a>"_s ), QMessageBox::Ok );
997 if (
outputFormat() ==
"GPKG"_L1 && 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. "
998 "Do you want to overwrite the whole file?" )
1000 QMessageBox::Yes | QMessageBox::No )
1001 == QMessageBox::No )
1009void QgsRasterLayerSaveAsDialog::showHelp()
1011 QgsHelp::openHelp( u
"managing_data_source/create_layers.html#creating-new-layers-from-an-existing-layer"_s );
@ 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