40#include <QRegularExpression>
43#include "moc_qgsrasterlayersaveasdialog.cpp"
45using namespace Qt::StringLiterals;
56 : QDialog( parent, f )
57 , mRasterLayer( rasterLayer )
58 , mDataProvider( sourceProvider )
59 , mCurrentExtent( currentExtent )
60 , mLayerCrs( layerCrs )
61 , mCurrentCrs( currentCrs )
65 connect( mRawModeRadioButton, &QRadioButton::toggled,
this, &QgsRasterLayerSaveAsDialog::mRawModeRadioButton_toggled );
66 connect( mFormatComboBox, &QComboBox::currentTextChanged,
this, &QgsRasterLayerSaveAsDialog::mFormatComboBox_currentIndexChanged );
67 connect( mResolutionRadioButton, &QRadioButton::toggled,
this, &QgsRasterLayerSaveAsDialog::mResolutionRadioButton_toggled );
68 connect( mOriginalResolutionPushButton, &QPushButton::clicked,
this, &QgsRasterLayerSaveAsDialog::mOriginalResolutionPushButton_clicked );
69 connect( mXResolutionLineEdit, &QLineEdit::textEdited,
this, &QgsRasterLayerSaveAsDialog::mXResolutionLineEdit_textEdited );
70 connect( mYResolutionLineEdit, &QLineEdit::textEdited,
this, &QgsRasterLayerSaveAsDialog::mYResolutionLineEdit_textEdited );
71 connect( mOriginalSizePushButton, &QPushButton::clicked,
this, &QgsRasterLayerSaveAsDialog::mOriginalSizePushButton_clicked );
72 connect( mColumnsLineEdit, &QLineEdit::textEdited,
this, &QgsRasterLayerSaveAsDialog::mColumnsLineEdit_textEdited );
73 connect( mRowsLineEdit, &QLineEdit::textEdited,
this, &QgsRasterLayerSaveAsDialog::mRowsLineEdit_textEdited );
74 connect( mAddNoDataManuallyToolButton, &QPushButton::clicked,
this, &QgsRasterLayerSaveAsDialog::mAddNoDataManuallyToolButton_clicked );
75 connect( mLoadTransparentNoDataToolButton, &QPushButton::clicked,
this, &QgsRasterLayerSaveAsDialog::mLoadTransparentNoDataToolButton_clicked );
76 connect( mRemoveSelectedNoDataToolButton, &QPushButton::clicked,
this, &QgsRasterLayerSaveAsDialog::mRemoveSelectedNoDataToolButton_clicked );
77 connect( mRemoveAllNoDataToolButton, &QPushButton::clicked,
this, &QgsRasterLayerSaveAsDialog::mRemoveAllNoDataToolButton_clicked );
78 connect( mTileModeCheckBox, &QCheckBox::toggled,
this, &QgsRasterLayerSaveAsDialog::mTileModeCheckBox_toggled );
79 connect( mPyramidsGroupBox, &QgsCollapsibleGroupBox::toggled,
this, &QgsRasterLayerSaveAsDialog::mPyramidsGroupBox_toggled );
85 mNoDataTableWidget->setColumnCount( 2 );
86 mNoDataTableWidget->setHorizontalHeaderItem( 0,
new QTableWidgetItem( tr(
"From" ) ) );
87 mNoDataTableWidget->setHorizontalHeaderItem( 1,
new QTableWidgetItem( tr(
"To" ) ) );
89 mRawModeRadioButton_toggled(
true );
93 toggleResolutionSize();
95 insertAvailableOutputFormats();
102 setOriginalResolution();
103 int xSize = mDataProvider->xSize();
104 int ySize = mDataProvider->ySize();
105 mMaximumSizeXLineEdit->setText( QString::number( xSize ) );
106 mMaximumSizeYLineEdit->setText( QString::number( ySize ) );
110 mTileModeCheckBox->setChecked(
true );
111 mMaximumSizeXLineEdit->setText( QString::number( 2000 ) );
112 mMaximumSizeYLineEdit->setText( QString::number( 2000 ) );
116 mCreationOptionsWidget->setProvider( mDataProvider->name() );
117 if ( mDataProvider->name() ==
"gdal"_L1 )
119 mCreationOptionsWidget->setFormat( mFormatComboBox->currentData().toString() );
121 mCreationOptionsWidget->setRasterLayer( mRasterLayer );
122 mCreationOptionsWidget->update();
130 mPyramidsOptionsWidget->createOptionsWidget()->setRasterLayer( mRasterLayer );
135 mPyramidsUseExistingCheckBox->setEnabled(
false );
136 mPyramidsUseExistingCheckBox->setVisible(
false );
138 populatePyramidsLevels();
143 mPyramidsGroupBox->setEnabled(
false );
144 mPyramidsGroupBox->setCollapsed(
true );
149 mCreateOptionsGroupBox->setSaveCheckedState(
true );
159 mCrsSelector->setSourceEnsemble( ensemble.
name() );
164 mCrsSelector->setShowAccuracyWarnings(
true );
166 mCrsSelector->setLayerCrs( mLayerCrs );
168 mCrsSelector->setCrs( mLayerCrs );
172 QPushButton *okButton = mButtonBox->button( QDialogButtonBox::Ok );
175 okButton->setEnabled(
false );
179 mHelpButtonBox->setVisible(
false );
180 mButtonBox->addButton( QDialogButtonBox::Help );
181 connect( mButtonBox, &QDialogButtonBox::helpRequested,
this, &QgsRasterLayerSaveAsDialog::showHelp );
183 connect( mHelpButtonBox, &QDialogButtonBox::helpRequested,
this, &QgsRasterLayerSaveAsDialog::showHelp );
186 connect( mButtonBox, &QDialogButtonBox::rejected,
this, &QgsRasterLayerSaveAsDialog::reject );
188 mExtentGroupBox->setOutputCrs(
outputCrs() );
191 mExtentGroupBox->setOriginalExtent( mDataProvider->extent(), mLayerCrs );
193 mExtentGroupBox->setCurrentExtent( mCurrentExtent, mCurrentCrs );
194 mExtentGroupBox->setOutputExtentFromOriginal();
197 recalcResolutionSize();
201 if ( mTileModeCheckBox->isChecked() )
203 mTilesGroupBox->show();
205 mFilename->setDialogTitle( tr(
"Select Output Directory" ) );
209 mTilesGroupBox->hide();
211 mFilename->setDialogTitle( tr(
"Save Layer As" ) );
214 mFilename->setDefaultRoot( settings.
value( u
"UI/lastRasterFileDir"_s, QDir::homePath() ).toString() );
217 QFileInfo tmplFileInfo( filePath );
218 settings.
setValue( u
"UI/lastRasterFileDir"_s, tmplFileInfo.absolutePath() );
220 if ( !filePath.isEmpty() && mLayerName->isEnabled() )
222 QFileInfo fileInfo( filePath );
223 mLayerName->setText( fileInfo.baseName() );
226 if ( mTileModeCheckBox->isChecked() )
228 QString fileName = filePath;
233 if ( fileName.isEmpty() )
237 QDir dir( fileName );
238 QString baseName = QFileInfo( fileName ).baseName();
240 filters << u
"%1.*"_s.arg( baseName );
241 QStringList files = dir.entryList( filters );
242 if ( files.isEmpty() )
245 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 )
249 fileName = QFileDialog::getExistingDirectory(
this, tr(
"Select output directory" ), tmplFileInfo.absolutePath() );
253 QPushButton *okButton = mButtonBox->button( QDialogButtonBox::Ok );
258 okButton->setEnabled( tmplFileInfo.absoluteDir().exists() );
262void QgsRasterLayerSaveAsDialog::insertAvailableOutputFormats()
266 int nDrivers = GDALGetDriverCount();
267 QMap<int, QPair<QString, QString>> topPriorityDrivers;
268 QMap<QString, QString> lowPriorityDrivers;
270 for (
int i = 0; i < nDrivers; ++i )
272 GDALDriverH driver = GDALGetDriver( i );
277 QString driverShortName = GDALGetDriverShortName( driver );
278 QString driverLongName = GDALGetDriverLongName( driver );
279 if ( driverShortName ==
"MEM"_L1 )
286 else if ( driverShortName ==
"VRT"_L1 )
291 else if ( driverShortName ==
"GTiff"_L1 )
294 topPriorityDrivers.insert( 1, qMakePair( driverLongName, driverShortName ) );
296 else if ( driverShortName ==
"GPKG"_L1 )
299 topPriorityDrivers.insert( 2, qMakePair( driverLongName, driverShortName ) );
303 lowPriorityDrivers.insert( driverLongName, driverShortName );
310 for (
auto priorityDriversIt = topPriorityDrivers.constBegin(); priorityDriversIt != topPriorityDrivers.constEnd(); ++priorityDriversIt )
312 mFormatComboBox->addItem( priorityDriversIt.value().first, priorityDriversIt.value().second );
315 for (
auto lowPriorityDriversIt = lowPriorityDrivers.constBegin(); lowPriorityDriversIt != lowPriorityDrivers.constEnd(); ++lowPriorityDriversIt )
317 mFormatComboBox->addItem( lowPriorityDriversIt.key(), lowPriorityDriversIt.value() );
321void QgsRasterLayerSaveAsDialog::setValidators()
323 mXResolutionLineEdit->setValidator(
new QgsDoubleValidator(
this ) );
324 mYResolutionLineEdit->setValidator(
new QgsDoubleValidator(
this ) );
325 mColumnsLineEdit->setValidator(
new QIntValidator(
this ) );
326 mRowsLineEdit->setValidator(
new QIntValidator(
this ) );
327 mMaximumSizeXLineEdit->setValidator(
new QIntValidator(
this ) );
328 mMaximumSizeYLineEdit->setValidator(
new QIntValidator(
this ) );
331void QgsRasterLayerSaveAsDialog::mFormatComboBox_currentIndexChanged(
const QString & )
334 if ( mDataProvider && mDataProvider->name() ==
"gdal"_L1 )
337 mCreationOptionsWidget->update();
342 if ( extensions.empty() )
343 filter = tr(
"All files (*.*)" );
346 filter = u
"%1 (*.%2);;%3"_s.arg( mFormatComboBox->currentText(), extensions.join(
" *."_L1 ), tr(
"All files (*.*)" ) );
348 mFilename->setFilter( filter );
351 mTileModeCheckBox->setEnabled(
outputFormat() !=
"GPKG"_L1 );
352 mFilename->setConfirmOverwrite(
outputFormat() !=
"GPKG"_L1 );
354 if ( mLayerName->isEnabled() )
356 QString layerName = QFileInfo( mFilename->filePath() ).baseName();
357 mLayerName->setText( layerName );
358 mTileModeCheckBox->setChecked(
false );
362 mLayerName->setText( QString() );
368 mPyramidsGroupBox->setChecked(
true );
370 mPyramidResolutionsLabel->setVisible( !isCOG );
371 mPyramidResolutionsLineEdit->setVisible( !isCOG );
372 mPyramidsOptionsWidget->tuneForFormat(
outputFormat() );
377 return mColumnsLineEdit->text().toInt();
382 return mRowsLineEdit->text().toInt();
397 return mMaximumSizeXLineEdit->text().toInt();
402 return mMaximumSizeYLineEdit->text().toInt();
407 return mTileModeCheckBox->isChecked();
412 return mAddToCanvas->isChecked();
417 mAddToCanvas->setChecked( checked );
422 QString fileName = mFilename->filePath();
428 if ( !extensions.empty() )
430 defaultExt = extensions.at( 0 );
434 QFileInfo fi( fileName );
435 if ( !fileName.isEmpty() && fi.suffix().isEmpty() && !defaultExt.isEmpty() )
437 fileName +=
'.' + defaultExt;
446 if ( mLayerName->text().isEmpty() &&
outputFormat() ==
"GPKG"_L1 && !mTileModeCheckBox->isChecked() )
449 return QFileInfo( mFilename->filePath() ).baseName();
453 return mLayerName->text();
459 return mFormatComboBox->currentData().toString();
469 QStringList options = mCreateOptionsGroupBox->isChecked() ? mCreationOptionsWidget->options() : QStringList();
473 int indx = options.indexOf( QRegularExpression(
"^RASTER_TABLE=.*", QRegularExpression::CaseInsensitiveOption | QRegularExpression::MultilineOption ) );
476 options.replace( indx, u
"RASTER_TABLE=%1"_s.arg(
outputLayerName() ) );
484 if ( !outputLayerExists() )
486 indx = options.indexOf( QRegularExpression(
"^APPEND_SUBDATASET=.*", QRegularExpression::CaseInsensitiveOption | QRegularExpression::MultilineOption ) );
489 options.replace( indx, u
"APPEND_SUBDATASET=YES"_s );
493 options.append( u
"APPEND_SUBDATASET=YES"_s );
502 return mExtentGroupBox->outputExtent();
507 mFormatLabel->hide();
508 mFormatComboBox->hide();
513 mSaveAsLabel->hide();
515 QPushButton *okButton = mButtonBox->button( QDialogButtonBox::Ok );
518 okButton->setEnabled(
true );
522void QgsRasterLayerSaveAsDialog::toggleResolutionSize()
526 bool on = mResolutionRadioButton->isChecked();
527 mXResolutionLineEdit->setEnabled( on );
528 mYResolutionLineEdit->setEnabled( on );
529 mOriginalResolutionPushButton->setEnabled( on && hasResolution );
530 mColumnsLineEdit->setEnabled( !on );
531 mRowsLineEdit->setEnabled( !on );
532 mOriginalSizePushButton->setEnabled( !on && hasResolution );
535void QgsRasterLayerSaveAsDialog::setOriginalResolution()
541 xRes = mDataProvider->extent().width() / mDataProvider->xSize();
542 yRes = mDataProvider->extent().height() / mDataProvider->ySize();
547 xRes = yRes = mDataProvider->extent().width() / 100;
549 setResolution( xRes, yRes, mLayerCrs );
567 QgsRectangle srcExtent( srsCenter.
x() - xRes / 2, srsCenter.
y() - yRes / 2, srsCenter.
x() + xRes / 2, srsCenter.
y() + yRes / 2 );
569 QgsRectangle extent = ct.transform( srcExtent );
570 xRes = extent.
width();
573 mXResolutionLineEdit->setText( QLocale().toString( xRes ) );
574 mYResolutionLineEdit->setText( QLocale().toString( yRes ) );
577void QgsRasterLayerSaveAsDialog::recalcSize()
582 mColumnsLineEdit->setText( QString::number( xSize ) );
583 mRowsLineEdit->setText( QString::number( ySize ) );
584 updateResolutionStateMsg();
587void QgsRasterLayerSaveAsDialog::setOriginalSize()
589 mColumnsLineEdit->setText( QString::number( mDataProvider->xSize() ) );
590 mRowsLineEdit->setText( QString::number( mDataProvider->ySize() ) );
594void QgsRasterLayerSaveAsDialog::recalcResolution()
599 mXResolutionLineEdit->setText( QLocale().toString( xRes ) );
600 mYResolutionLineEdit->setText( QLocale().toString( yRes ) );
601 updateResolutionStateMsg();
604void QgsRasterLayerSaveAsDialog::recalcResolutionSize()
606 if ( mResolutionRadioButton->isChecked() )
617void QgsRasterLayerSaveAsDialog::updateResolutionStateMsg()
620 switch ( mResolutionState )
626 msg = tr(
"user defined" );
631 msg = tr(
"Resolution (current: %1)" ).arg( msg );
632 mResolutionGroupBox->setTitle( msg );
635void QgsRasterLayerSaveAsDialog::extentChanged()
638 if ( mSizeRadioButton->isChecked() )
642 recalcResolutionSize();
645void QgsRasterLayerSaveAsDialog::crsChanged()
649 mExtentGroupBox->setOutputCrs(
outputCrs() );
652 if ( mResolutionRadioButton->isChecked() )
656 setOriginalResolution();
675 return mCrsSelector->crs();
680 if ( mRenderedModeRadioButton->isChecked() )
685void QgsRasterLayerSaveAsDialog::mRawModeRadioButton_toggled(
bool checked )
687 mNoDataGroupBox->setEnabled( checked && mDataProvider->
bandCount() == 1 );
688 mNoDataGroupBox->setCollapsed( !mNoDataGroupBox->isEnabled() );
691void QgsRasterLayerSaveAsDialog::mAddNoDataManuallyToolButton_clicked()
693 addNoDataRow( std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN() );
696void QgsRasterLayerSaveAsDialog::mLoadTransparentNoDataToolButton_clicked()
698 if ( !mRasterLayer->renderer() )
700 const QgsRasterTransparency *rasterTransparency = mRasterLayer->renderer()->rasterTransparency();
701 if ( !rasterTransparency )
705 for (
const QgsRasterTransparency::TransparentSingleValuePixel &transparencyPixel : constTransparentSingleValuePixelList )
709 addNoDataRow( transparencyPixel.min, transparencyPixel.max );
710 if ( transparencyPixel.min != transparencyPixel.max )
712 setNoDataToEdited( mNoDataTableWidget->rowCount() - 1 );
718void QgsRasterLayerSaveAsDialog::mRemoveSelectedNoDataToolButton_clicked()
720 mNoDataTableWidget->removeRow( mNoDataTableWidget->currentRow() );
723void QgsRasterLayerSaveAsDialog::mRemoveAllNoDataToolButton_clicked()
725 while ( mNoDataTableWidget->rowCount() > 0 )
727 mNoDataTableWidget->removeRow( 0 );
731void QgsRasterLayerSaveAsDialog::addNoDataRow(
double min,
double max )
733 mNoDataTableWidget->insertRow( mNoDataTableWidget->rowCount() );
734 for (
int i = 0; i < 2; i++ )
736 double value = i == 0 ? min : max;
737 QLineEdit *lineEdit =
new QLineEdit();
738 lineEdit->setFrame(
false );
739 lineEdit->setContentsMargins( 1, 1, 1, 1 );
741 switch ( mRasterLayer->dataProvider()->sourceDataType( 1 ) )
745 lineEdit->setValidator(
new QgsDoubleValidator(
nullptr ) );
746 if ( !std::isnan( value ) )
752 lineEdit->setValidator(
new QIntValidator(
nullptr ) );
753 if ( !std::isnan( value ) )
755 valueString = QLocale().toString(
static_cast<int>( value ) );
759 lineEdit->setText( valueString );
760 mNoDataTableWidget->setCellWidget( mNoDataTableWidget->rowCount() - 1, i, lineEdit );
762 adjustNoDataCellWidth( mNoDataTableWidget->rowCount() - 1, i );
764 connect( lineEdit, &QLineEdit::textEdited,
this, &QgsRasterLayerSaveAsDialog::noDataCellTextEdited );
766 mNoDataTableWidget->resizeColumnsToContents();
767 mNoDataTableWidget->resizeRowsToContents();
770void QgsRasterLayerSaveAsDialog::noDataCellTextEdited(
const QString &text )
774 QLineEdit *lineEdit = qobject_cast<QLineEdit *>( sender() );
779 for (
int r = 0; r < mNoDataTableWidget->rowCount(); r++ )
781 for (
int c = 0;
c < mNoDataTableWidget->columnCount();
c++ )
783 if ( mNoDataTableWidget->cellWidget( r,
c ) == sender() )
797 QLineEdit *toLineEdit =
dynamic_cast<QLineEdit *
>( mNoDataTableWidget->cellWidget( row, 1 ) );
800 bool toChanged = mNoDataToEdited.value( row );
804 toLineEdit->setText( lineEdit->text() );
807 else if ( column == 1 )
809 setNoDataToEdited( row );
813void QgsRasterLayerSaveAsDialog::mTileModeCheckBox_toggled(
bool toggled )
832 mTilesGroupBox->show();
834 mFilename->setDialogTitle( tr(
"Select Output Directory" ) );
838 mTilesGroupBox->hide();
840 mFilename->setDialogTitle( tr(
"Save Layer As" ) );
844void QgsRasterLayerSaveAsDialog::mPyramidsGroupBox_toggled(
bool toggled )
847 populatePyramidsLevels();
850void QgsRasterLayerSaveAsDialog::populatePyramidsLevels()
854 if ( mPyramidsGroupBox->isChecked() )
856 QList<QgsRasterPyramid> myPyramidList;
859 if ( mPyramidsUseExistingCheckBox->isChecked() )
861 myPyramidList = mDataProvider->buildPyramidList();
865 if ( !mPyramidsOptionsWidget->overviewList().isEmpty() )
866 myPyramidList = mDataProvider->buildPyramidList( mPyramidsOptionsWidget->overviewList() );
868 for (
const QgsRasterPyramid &pyramid : std::as_const( myPyramidList ) )
870 if ( !mPyramidsUseExistingCheckBox->isChecked() || pyramid.getExists() )
872 text += QString::number( pyramid.getXDim() ) + u
"x"_s + QString::number( pyramid.getYDim() ) +
' ';
877 mPyramidResolutionsLineEdit->setText( text.trimmed() );
880void QgsRasterLayerSaveAsDialog::setNoDataToEdited(
int row )
882 if ( row >= mNoDataToEdited.size() )
884 mNoDataToEdited.resize( row + 1 );
886 mNoDataToEdited[row] =
true;
889double QgsRasterLayerSaveAsDialog::noDataCellValue(
int row,
int column )
const
891 QLineEdit *lineEdit =
dynamic_cast<QLineEdit *
>( mNoDataTableWidget->cellWidget( row, column ) );
892 if ( !lineEdit || lineEdit->text().isEmpty() )
894 return std::numeric_limits<double>::quiet_NaN();
899void QgsRasterLayerSaveAsDialog::adjustNoDataCellWidth(
int row,
int column )
901 QLineEdit *lineEdit =
dynamic_cast<QLineEdit *
>( mNoDataTableWidget->cellWidget( row, column ) );
905 int width = std::max( lineEdit->fontMetrics().boundingRect( lineEdit->text() ).width() + 10, 100 );
906 width = std::max( width, mNoDataTableWidget->columnWidth( column ) );
908 lineEdit->setFixedWidth( width );
914 if ( !mNoDataGroupBox->isChecked() )
917 int rows = mNoDataTableWidget->rowCount();
918 noDataList.reserve( rows );
919 for (
int r = 0; r < rows; r++ )
922 noDataList.append(
noData );
929 return mPyramidsGroupBox->isChecked() ? mPyramidsOptionsWidget->overviewList() : QList<int>();
934 if ( !mPyramidsGroupBox->isChecked() )
936 else if ( mPyramidsUseExistingCheckBox->isChecked() )
942bool QgsRasterLayerSaveAsDialog::validate()
const
944 if ( mCreateOptionsGroupBox->isChecked() )
946 QString message = mCreationOptionsWidget->validateOptions(
true,
false );
947 if ( !message.isNull() )
950 if ( mPyramidsGroupBox->isChecked() )
952 QString message = mPyramidsOptionsWidget->createOptionsWidget()->validateOptions(
true,
false );
953 if ( !message.isNull() )
959bool QgsRasterLayerSaveAsDialog::outputLayerExists()
const
973 QgsRasterLayer rasterLayer( rasterUri, QString(), u
"gdal"_s );
974 if ( !vectorUri.isEmpty() )
976 QgsVectorLayer vectorLayer( vectorUri, QString(), u
"ogr"_s );
977 return rasterLayer.isValid() || vectorLayer.isValid();
981 return rasterLayer.isValid();
994 const int nbTilesWidth = std::ceil(
nColumns() / 256 );
995 const int nbTilesHeight = std::ceil(
nRows() / 256 );
996 int64_t totalTiles =
static_cast<int64_t
>( nbTilesWidth ) * nbTilesHeight;
1000 QMessageBox::warning(
1002 tr(
"Save Raster Layer" ),
1003 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." )
1004 .arg( u
"<a href=\"https://operations.osmfoundation.org/policies/tiles/\">"_s, u
"</a>"_s ),
1012 && outputLayerExists()
1013 && QMessageBox::warning(
1015 tr(
"Save Raster Layer" ),
1017 "The layer %1 already exists in the target file, and overwriting layers in GeoPackage is not supported. "
1018 "Do you want to overwrite the whole file?"
1021 QMessageBox::Yes | QMessageBox::No
1022 ) == QMessageBox::No )
1030void QgsRasterLayerSaveAsDialog::showHelp()
1032 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