27 #include "cpl_string.h" 31 #include <QFileDialog> 32 #include <QMessageBox> 37 QWidget *parent, Qt::WindowFlags
f )
38 : QDialog( parent, f )
39 , mRasterLayer( rasterLayer )
40 , mDataProvider( sourceProvider )
41 , mCurrentExtent( currentExtent )
42 , mLayerCrs( layerCrs )
43 , mCurrentCrs( currentCrs )
44 , mResolutionState( OriginalResolution )
47 connect( mRawModeRadioButton, &QRadioButton::toggled,
this, &QgsRasterLayerSaveAsDialog::mRawModeRadioButton_toggled );
48 connect( mFormatComboBox,
static_cast<void ( QComboBox::* )(
const QString & )
>( &QComboBox::currentIndexChanged ),
this, &QgsRasterLayerSaveAsDialog::mFormatComboBox_currentIndexChanged );
49 connect( mResolutionRadioButton, &QRadioButton::toggled,
this, &QgsRasterLayerSaveAsDialog::mResolutionRadioButton_toggled );
50 connect( mOriginalResolutionPushButton, &QPushButton::clicked,
this, &QgsRasterLayerSaveAsDialog::mOriginalResolutionPushButton_clicked );
51 connect( mXResolutionLineEdit, &QLineEdit::textEdited,
this, &QgsRasterLayerSaveAsDialog::mXResolutionLineEdit_textEdited );
52 connect( mYResolutionLineEdit, &QLineEdit::textEdited,
this, &QgsRasterLayerSaveAsDialog::mYResolutionLineEdit_textEdited );
53 connect( mOriginalSizePushButton, &QPushButton::clicked,
this, &QgsRasterLayerSaveAsDialog::mOriginalSizePushButton_clicked );
54 connect( mColumnsLineEdit, &QLineEdit::textEdited,
this, &QgsRasterLayerSaveAsDialog::mColumnsLineEdit_textEdited );
55 connect( mRowsLineEdit, &QLineEdit::textEdited,
this, &QgsRasterLayerSaveAsDialog::mRowsLineEdit_textEdited );
56 connect( mAddNoDataManuallyToolButton, &QPushButton::clicked,
this, &QgsRasterLayerSaveAsDialog::mAddNoDataManuallyToolButton_clicked );
57 connect( mLoadTransparentNoDataToolButton, &QPushButton::clicked,
this, &QgsRasterLayerSaveAsDialog::mLoadTransparentNoDataToolButton_clicked );
58 connect( mRemoveSelectedNoDataToolButton, &QPushButton::clicked,
this, &QgsRasterLayerSaveAsDialog::mRemoveSelectedNoDataToolButton_clicked );
59 connect( mRemoveAllNoDataToolButton, &QPushButton::clicked,
this, &QgsRasterLayerSaveAsDialog::mRemoveAllNoDataToolButton_clicked );
60 connect( mTileModeCheckBox, &QCheckBox::toggled,
this, &QgsRasterLayerSaveAsDialog::mTileModeCheckBox_toggled );
61 connect( mPyramidsGroupBox, &QgsCollapsibleGroupBox::toggled,
this, &QgsRasterLayerSaveAsDialog::mPyramidsGroupBox_toggled );
67 mNoDataTableWidget->setColumnCount( 2 );
68 mNoDataTableWidget->setHorizontalHeaderItem( 0,
new QTableWidgetItem( tr(
"From" ) ) );
69 mNoDataTableWidget->setHorizontalHeaderItem( 1,
new QTableWidgetItem( tr(
"To" ) ) );
71 mRawModeRadioButton_toggled(
true );
75 toggleResolutionSize();
77 insertAvailableOutputFormats();
84 setOriginalResolution();
85 int xSize = mDataProvider->
xSize();
86 int ySize = mDataProvider->
ySize();
87 mMaximumSizeXLineEdit->setText( QString::number( xSize ) );
88 mMaximumSizeYLineEdit->setText( QString::number( ySize ) );
92 mTileModeCheckBox->setChecked(
true );
93 mMaximumSizeXLineEdit->setText( QString::number( 2000 ) );
94 mMaximumSizeYLineEdit->setText( QString::number( 2000 ) );
98 mCreateOptionsWidget->setProvider( mDataProvider->
name() );
99 if ( mDataProvider->
name() == QLatin1String(
"gdal" ) )
101 mCreateOptionsWidget->setFormat( mFormatComboBox->currentData().toString() );
103 mCreateOptionsWidget->setRasterLayer( mRasterLayer );
104 mCreateOptionsWidget->update();
112 mPyramidsOptionsWidget->createOptionsWidget()->setRasterLayer( mRasterLayer );
117 mPyramidsUseExistingCheckBox->setEnabled(
false );
118 mPyramidsUseExistingCheckBox->setVisible(
false );
120 populatePyramidsLevels();
122 this, &QgsRasterLayerSaveAsDialog::populatePyramidsLevels );
126 mPyramidsGroupBox->setEnabled(
false );
131 mCreateOptionsGroupBox->setSaveCheckedState(
true );
136 mTilesGroupBox->hide();
138 mCrsSelector->setLayerCrs( mLayerCrs );
140 mCrsSelector->setCrs( mLayerCrs );
143 this, &QgsRasterLayerSaveAsDialog::crsChanged );
145 QPushButton *okButton = mButtonBox->button( QDialogButtonBox::Ok );
148 okButton->setEnabled(
false );
151 connect( mButtonBox, &QDialogButtonBox::helpRequested,
this, &QgsRasterLayerSaveAsDialog::showHelp );
153 mExtentGroupBox->setOutputCrs(
outputCrs() );
154 mExtentGroupBox->setOriginalExtent( mDataProvider->
extent(), mLayerCrs );
155 mExtentGroupBox->setCurrentExtent( mCurrentExtent, mCurrentCrs );
156 mExtentGroupBox->setOutputExtentFromOriginal();
159 recalcResolutionSize();
162 restoreGeometry( settings.
value( QStringLiteral(
"Windows/RasterLayerSaveAs/geometry" ) ).toByteArray() );
164 if ( mTileModeCheckBox->isChecked() )
167 mFilename->setDialogTitle( tr(
"Select output directory" ) );
172 mFilename->setDialogTitle( tr(
"Save Layer as…" ) );
174 mFilename->setDefaultRoot( settings.
value( QStringLiteral(
"UI/lastRasterFileDir" ), QDir::homePath() ).toString() );
178 QFileInfo tmplFileInfo( filePath );
179 settings.
setValue( QStringLiteral(
"UI/lastRasterFileDir" ), tmplFileInfo.absolutePath() );
181 if ( mTileModeCheckBox->isChecked() )
183 QString fileName = filePath;
188 if ( fileName.isEmpty() )
192 QDir dir( fileName );
193 QString baseName = QFileInfo( fileName ).baseName();
195 filters << QStringLiteral(
"%1.*" ).arg( baseName );
196 QStringList
files = dir.entryList( filters );
197 if ( files.isEmpty() )
200 if ( QMessageBox::warning(
this, tr(
"Save Raster Layer" ),
201 tr(
"The directory %1 contains files which will be overwritten: %2" ).arg( dir.absolutePath(), files.join( QStringLiteral(
", " ) ) ),
202 QMessageBox::Ok | QMessageBox::Cancel ) == QMessageBox::Ok )
205 fileName = QFileDialog::getExistingDirectory(
this, tr(
"Select output directory" ), tmplFileInfo.absolutePath() );
209 QPushButton *okButton = mButtonBox->button( QDialogButtonBox::Ok );
214 okButton->setEnabled( tmplFileInfo.absoluteDir().exists() );
224 void QgsRasterLayerSaveAsDialog::insertAvailableOutputFormats()
228 int nDrivers = GDALGetDriverCount();
229 QMap< int, QPair< QString, QString > > topPriorityDrivers;
230 QMap< QString, QString > lowPriorityDrivers;
232 for (
int i = 0; i < nDrivers; ++i )
234 GDALDriverH driver = GDALGetDriver( i );
237 char **driverMetadata = GDALGetMetadata( driver,
nullptr );
239 if ( CSLFetchBoolean( driverMetadata, GDAL_DCAP_CREATE,
false ) && CSLFetchBoolean( driverMetadata, GDAL_DCAP_RASTER,
false ) )
241 QString driverShortName = GDALGetDriverShortName( driver );
242 QString driverLongName = GDALGetDriverLongName( driver );
243 if ( driverShortName == QLatin1String(
"MEM" ) )
250 else if ( driverShortName == QLatin1String(
"VRT" ) )
255 else if ( driverShortName == QStringLiteral(
"GTiff" ) )
258 topPriorityDrivers.insert( 1, qMakePair( driverLongName, driverShortName ) );
260 else if ( driverShortName == QStringLiteral(
"GPKG" ) )
263 topPriorityDrivers.insert( 2, qMakePair( driverLongName, driverShortName ) );
267 lowPriorityDrivers.insert( driverLongName, driverShortName );
274 for (
auto priorityDriversIt = topPriorityDrivers.constBegin(); priorityDriversIt != topPriorityDrivers.constEnd(); ++priorityDriversIt )
276 mFormatComboBox->addItem( priorityDriversIt.value().first, priorityDriversIt.value().second );
279 for (
auto lowPriorityDriversIt = lowPriorityDrivers.constBegin(); lowPriorityDriversIt != lowPriorityDrivers.constEnd(); ++lowPriorityDriversIt )
281 mFormatComboBox->addItem( lowPriorityDriversIt.key(), lowPriorityDriversIt.value() );
286 void QgsRasterLayerSaveAsDialog::setValidators()
288 mXResolutionLineEdit->setValidator(
new QDoubleValidator(
this ) );
289 mYResolutionLineEdit->setValidator(
new QDoubleValidator(
this ) );
290 mColumnsLineEdit->setValidator(
new QIntValidator(
this ) );
291 mRowsLineEdit->setValidator(
new QIntValidator(
this ) );
292 mMaximumSizeXLineEdit->setValidator(
new QIntValidator(
this ) );
293 mMaximumSizeYLineEdit->setValidator(
new QIntValidator(
this ) );
296 void QgsRasterLayerSaveAsDialog::mFormatComboBox_currentIndexChanged(
const QString & )
299 if ( mDataProvider && mDataProvider->
name() == QLatin1String(
"gdal" ) )
302 mCreateOptionsWidget->update();
307 if ( extensions.empty() )
308 filter = tr(
"All files (*.*)" );
311 filter = QStringLiteral(
"%1 (*.%2);;%3" ).arg( mFormatComboBox->currentText(),
312 extensions.join( QStringLiteral(
" *." ) ),
313 tr(
"All files (*.*)" ) );
315 mFilename->setFilter( filter );
320 return mColumnsLineEdit->text().toInt();
325 return mRowsLineEdit->text().toInt();
330 return mXResolutionLineEdit->text().toDouble();
335 return mYResolutionLineEdit->text().toDouble();
340 return mMaximumSizeXLineEdit->text().toInt();
345 return mMaximumSizeYLineEdit->text().toInt();
350 return mTileModeCheckBox->isChecked();
355 return mAddToCanvas->isChecked();
362 if ( !extensions.empty() )
364 defaultExt = extensions.at( 0 );
368 QString fileName = mFilename->filePath();
369 QFileInfo fi( fileName );
370 if ( !fileName.isEmpty() && fi.suffix().isEmpty() )
372 fileName +=
'.' + defaultExt;
380 return mFormatComboBox->currentData().toString();
385 return mCreateOptionsGroupBox->isChecked() ? mCreateOptionsWidget->options() : QStringList();
390 return mExtentGroupBox->outputExtent();
395 mFormatLabel->hide();
396 mFormatComboBox->hide();
401 mSaveAsLabel->hide();
403 QPushButton *okButton = mButtonBox->button( QDialogButtonBox::Ok );
406 okButton->setEnabled(
true );
410 void QgsRasterLayerSaveAsDialog::toggleResolutionSize()
414 bool on = mResolutionRadioButton->isChecked();
415 mXResolutionLineEdit->setEnabled( on );
416 mYResolutionLineEdit->setEnabled( on );
417 mOriginalResolutionPushButton->setEnabled( on && hasResolution );
418 mColumnsLineEdit->setEnabled( !on );
419 mRowsLineEdit->setEnabled( !on );
420 mOriginalSizePushButton->setEnabled( !on && hasResolution );
423 void QgsRasterLayerSaveAsDialog::setOriginalResolution()
435 xRes = yRes = mDataProvider->
extent().
width() / 100;
437 setResolution( xRes, yRes, mLayerCrs );
455 QgsRectangle srcExtent( srsCenter.
x() - xRes / 2, srsCenter.
y() - yRes / 2, srsCenter.
x() + xRes / 2, srsCenter.
y() + yRes / 2 );
458 xRes = extent.width();
459 yRes = extent.height();
461 mXResolutionLineEdit->setText( QString::number( xRes ) );
462 mYResolutionLineEdit->setText( QString::number( yRes ) );
465 void QgsRasterLayerSaveAsDialog::recalcSize()
470 mColumnsLineEdit->setText( QString::number( xSize ) );
471 mRowsLineEdit->setText( QString::number( ySize ) );
472 updateResolutionStateMsg();
475 void QgsRasterLayerSaveAsDialog::setOriginalSize()
477 mColumnsLineEdit->setText( QString::number( mDataProvider->
xSize() ) );
478 mRowsLineEdit->setText( QString::number( mDataProvider->
ySize() ) );
482 void QgsRasterLayerSaveAsDialog::recalcResolution()
487 mXResolutionLineEdit->setText( QString::number( xRes ) );
488 mYResolutionLineEdit->setText( QString::number( yRes ) );
489 updateResolutionStateMsg();
492 void QgsRasterLayerSaveAsDialog::recalcResolutionSize()
494 if ( mResolutionRadioButton->isChecked() )
505 void QgsRasterLayerSaveAsDialog::updateResolutionStateMsg()
508 switch ( mResolutionState )
514 msg = tr(
"user defined" );
519 msg = tr(
"Resolution (current: %1)" ).arg( msg );
520 mResolutionGroupBox->setTitle( msg );
523 void QgsRasterLayerSaveAsDialog::extentChanged()
526 if ( mSizeRadioButton->isChecked() )
530 recalcResolutionSize();
533 void QgsRasterLayerSaveAsDialog::crsChanged()
537 mExtentGroupBox->setOutputCrs(
outputCrs() );
540 if ( mResolutionRadioButton->isChecked() )
544 setOriginalResolution();
563 return mCrsSelector->crs();
572 void QgsRasterLayerSaveAsDialog::mRawModeRadioButton_toggled(
bool checked )
574 mNoDataGroupBox->setEnabled( checked && mDataProvider->
bandCount() == 1 );
577 void QgsRasterLayerSaveAsDialog::mAddNoDataManuallyToolButton_clicked()
579 addNoDataRow( std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN() );
582 void QgsRasterLayerSaveAsDialog::mLoadTransparentNoDataToolButton_clicked()
584 if ( !mRasterLayer->
renderer() )
return;
586 if ( !rasterTransparency )
return;
592 addNoDataRow( transparencyPixel.
min, transparencyPixel.
max );
593 if ( transparencyPixel.
min != transparencyPixel.
max )
595 setNoDataToEdited( mNoDataTableWidget->rowCount() - 1 );
601 void QgsRasterLayerSaveAsDialog::mRemoveSelectedNoDataToolButton_clicked()
603 mNoDataTableWidget->removeRow( mNoDataTableWidget->currentRow() );
606 void QgsRasterLayerSaveAsDialog::mRemoveAllNoDataToolButton_clicked()
608 while ( mNoDataTableWidget->rowCount() > 0 )
610 mNoDataTableWidget->removeRow( 0 );
614 void QgsRasterLayerSaveAsDialog::addNoDataRow(
double min,
double max )
616 mNoDataTableWidget->insertRow( mNoDataTableWidget->rowCount() );
617 for (
int i = 0; i < 2; i++ )
619 double value = i == 0 ? min : max;
620 QLineEdit *lineEdit =
new QLineEdit();
621 lineEdit->setFrame(
false );
622 lineEdit->setContentsMargins( 1, 1, 1, 1 );
628 lineEdit->setValidator(
new QDoubleValidator(
nullptr ) );
629 if ( !std::isnan( value ) )
635 lineEdit->setValidator(
new QIntValidator(
nullptr ) );
636 if ( !std::isnan( value ) )
638 valueString = QString::number( static_cast<int>( value ) );
642 lineEdit->setText( valueString );
643 mNoDataTableWidget->setCellWidget( mNoDataTableWidget->rowCount() - 1, i, lineEdit );
645 adjustNoDataCellWidth( mNoDataTableWidget->rowCount() - 1, i );
647 connect( lineEdit, &QLineEdit::textEdited,
this, &QgsRasterLayerSaveAsDialog::noDataCellTextEdited );
649 mNoDataTableWidget->resizeColumnsToContents();
650 mNoDataTableWidget->resizeRowsToContents();
653 void QgsRasterLayerSaveAsDialog::noDataCellTextEdited(
const QString &text )
657 QLineEdit *lineEdit =
dynamic_cast<QLineEdit *
>( sender() );
658 if ( !lineEdit )
return;
661 for (
int r = 0; r < mNoDataTableWidget->rowCount(); r++ )
663 for (
int c = 0; c < mNoDataTableWidget->columnCount(); c++ )
665 if ( mNoDataTableWidget->cellWidget( r, c ) == sender() )
672 if ( row != -1 )
break;
674 QgsDebugMsg( QString(
"row = %1 column =%2" ).arg( row ).arg( column ) );
678 QLineEdit *toLineEdit =
dynamic_cast<QLineEdit *
>( mNoDataTableWidget->cellWidget( row, 1 ) );
679 if ( !toLineEdit )
return;
680 bool toChanged = mNoDataToEdited.value( row );
681 QgsDebugMsg( QString(
"toChanged = %1" ).arg( toChanged ) );
684 toLineEdit->setText( lineEdit->text() );
687 else if ( column == 1 )
689 setNoDataToEdited( row );
693 void QgsRasterLayerSaveAsDialog::mTileModeCheckBox_toggled(
bool toggled )
712 mTilesGroupBox->show();
714 mFilename->setDialogTitle( tr(
"Select output directory" ) );
718 mTilesGroupBox->hide();
720 mFilename->setDialogTitle( tr(
"Save Layer as…" ) );
724 void QgsRasterLayerSaveAsDialog::mPyramidsGroupBox_toggled(
bool toggled )
727 populatePyramidsLevels();
730 void QgsRasterLayerSaveAsDialog::populatePyramidsLevels()
734 if ( mPyramidsGroupBox->isChecked() )
736 QList<QgsRasterPyramid> myPyramidList;
739 if ( mPyramidsUseExistingCheckBox->isChecked() )
745 if ( ! mPyramidsOptionsWidget->overviewList().isEmpty() )
746 myPyramidList = mDataProvider->
buildPyramidList( mPyramidsOptionsWidget->overviewList() );
748 QList<QgsRasterPyramid>::iterator myRasterPyramidIterator;
749 for ( myRasterPyramidIterator = myPyramidList.begin();
750 myRasterPyramidIterator != myPyramidList.end();
751 ++myRasterPyramidIterator )
753 if ( ! mPyramidsUseExistingCheckBox->isChecked() || myRasterPyramidIterator->exists )
755 text += QString::number( myRasterPyramidIterator->xDim ) + QStringLiteral(
"x" ) +
756 QString::number( myRasterPyramidIterator->yDim ) +
' ';
761 mPyramidResolutionsLineEdit->setText( text.trimmed() );
764 void QgsRasterLayerSaveAsDialog::setNoDataToEdited(
int row )
766 if ( row >= mNoDataToEdited.size() )
768 mNoDataToEdited.resize( row + 1 );
770 mNoDataToEdited[row] =
true;
773 double QgsRasterLayerSaveAsDialog::noDataCellValue(
int row,
int column )
const 775 QLineEdit *lineEdit =
dynamic_cast<QLineEdit *
>( mNoDataTableWidget->cellWidget( row, column ) );
776 if ( !lineEdit || lineEdit->text().isEmpty() )
778 std::numeric_limits<double>::quiet_NaN();
780 return lineEdit->text().toDouble();
783 void QgsRasterLayerSaveAsDialog::adjustNoDataCellWidth(
int row,
int column )
785 QLineEdit *lineEdit =
dynamic_cast<QLineEdit *
>( mNoDataTableWidget->cellWidget( row, column ) );
786 if ( !lineEdit )
return;
788 int width = std::max( lineEdit->fontMetrics().width( lineEdit->text() ) + 10, 100 );
789 width = std::max( width, mNoDataTableWidget->columnWidth( column ) );
791 lineEdit->setFixedWidth( width );
797 if ( ! mNoDataGroupBox->isChecked() )
800 int rows = mNoDataTableWidget->rowCount();
801 noDataList.reserve( rows );
802 for (
int r = 0; r < rows; r++ )
805 noDataList.append( noData );
813 return mPyramidsGroupBox->isChecked() ? mPyramidsOptionsWidget->overviewList() : QList<int>();
818 if ( ! mPyramidsGroupBox->isChecked() )
820 else if ( mPyramidsUseExistingCheckBox->isChecked() )
826 bool QgsRasterLayerSaveAsDialog::validate()
const 828 if ( mCreateOptionsGroupBox->isChecked() )
830 QString message = mCreateOptionsWidget->validateOptions(
true,
false );
831 if ( !message.isNull() )
834 if ( mPyramidsGroupBox->isChecked() )
836 QString message = mPyramidsOptionsWidget->createOptionsWidget()->validateOptions(
true,
false );
837 if ( !message.isNull() )
843 void QgsRasterLayerSaveAsDialog::showHelp()
845 QgsHelp::openHelp( QStringLiteral(
"managing_data_source/create_layers.html#save-layer-from-an-existing-file" ) );
QList< int > pyramidsList() const
virtual int bandCount() const =0
Get number of bands.
A rectangle specified with double values.
static QString printValue(double value)
Print double value with all necessary significant digits.
QgsRaster::RasterBuildPyramids buildPyramidsFlag() const
void extentChanged(const QgsRectangle &r)
Emitted when the widget's extent is changed.
This class is a composition of two QSettings instances:
This class provides qgis with the ability to render raster datasets onto the mapcanvas.
A class to represent a 2D point.
virtual int ySize() const
double yResolution() const
static QStringList extensionsForFormat(const QString &format)
Returns a list of known file extensions for the given GDAL driver format.
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...
static QIcon getThemeIcon(const QString &name)
Helper to get a theme icon.
Raster values range container.
QgsCoordinateReferenceSystem outputCrs()
QgsRasterRenderer * renderer() const
Thirty two bit floating point (float)
QString outputFileName() const
int maximumTileSizeY() const
const QgsRasterTransparency * rasterTransparency() const
virtual QString name() const =0
Return a provider name.
Sixty four bit floating point (double)
void saveGeometry(QWidget *widget, const QString &keyName)
Save the wigget geometry into settings.
QgsRectangle outputRectangle() const
bool restoreGeometry(QWidget *widget, const QString &keyName)
Restore the wigget geometry from settings.
QgsRasterDataProvider * dataProvider() override
void setValue(const QString &key, const QVariant &value, const QgsSettings::Section section=QgsSettings::NoSection)
Sets the value of setting key to value.
virtual QList< QgsRasterPyramid > buildPyramidList(QList< int > overviewList=QList< int >())
Accessor for the raster layers pyramid list.
QStringList createOptions() const
virtual int capabilities() const
Returns a bitmask containing the supported capabilities.
QgsRectangle extent() const override=0
Returns the extent of the layer.
double percentTransparent
double width() const
Returns the width of the rectangle.
double xResolution() const
QList< QgsRasterTransparency::TransparentSingleValuePixel > transparentSingleValuePixelList() const
Accessor for transparentSingleValuePixelList.
int maximumTileSizeX() const
QgsRasterLayerSaveAsDialog(QgsRasterLayer *rasterLayer, QgsRasterDataProvider *sourceProvider, const QgsRectangle ¤tExtent, const QgsCoordinateReferenceSystem &layerCrs, const QgsCoordinateReferenceSystem ¤tCrs, QWidget *parent=nullptr, Qt::WindowFlags f=nullptr)
Constructor for QgsRasterLayerSaveAsDialog.
QList< QgsRasterRange > QgsRasterRangeList
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), const Section section=NoSection) const
Returns the value for setting key.
static QgsProject * instance()
Returns the QgsProject singleton instance.
This class represents a coordinate reference system (CRS).
static void openHelp(const QString &key)
Opens help topic for the given help key using default system web browser.
QString outputFormat() const
Defines the list of pixel values to be considered as transparent or semi transparent when rendering r...
QgsPointXY center() const
Returns the center point of the rectangle.
virtual int xSize() const
Get raster size.
QgsRasterRangeList noData() const
~QgsRasterLayerSaveAsDialog() override
double height() const
Returns the height of the rectangle.
Base class for raster data providers.