26 #include "qgssettings.h"
29 #include "cpl_string.h"
37 #include <QFileDialog>
38 #include <QMessageBox>
39 #include <QRegularExpression>
44 QWidget *parent, Qt::WindowFlags f )
45 : QDialog( parent, f )
46 , mRasterLayer( rasterLayer )
47 , mDataProvider( sourceProvider )
48 , mCurrentExtent( currentExtent )
49 , mLayerCrs( layerCrs )
50 , mCurrentCrs( currentCrs )
51 , mResolutionState( OriginalResolution )
55 connect( mRawModeRadioButton, &QRadioButton::toggled,
this, &QgsRasterLayerSaveAsDialog::mRawModeRadioButton_toggled );
56 connect( mFormatComboBox, &QComboBox::currentTextChanged,
this, &QgsRasterLayerSaveAsDialog::mFormatComboBox_currentIndexChanged );
57 connect( mResolutionRadioButton, &QRadioButton::toggled,
this, &QgsRasterLayerSaveAsDialog::mResolutionRadioButton_toggled );
58 connect( mOriginalResolutionPushButton, &QPushButton::clicked,
this, &QgsRasterLayerSaveAsDialog::mOriginalResolutionPushButton_clicked );
59 connect( mXResolutionLineEdit, &QLineEdit::textEdited,
this, &QgsRasterLayerSaveAsDialog::mXResolutionLineEdit_textEdited );
60 connect( mYResolutionLineEdit, &QLineEdit::textEdited,
this, &QgsRasterLayerSaveAsDialog::mYResolutionLineEdit_textEdited );
61 connect( mOriginalSizePushButton, &QPushButton::clicked,
this, &QgsRasterLayerSaveAsDialog::mOriginalSizePushButton_clicked );
62 connect( mColumnsLineEdit, &QLineEdit::textEdited,
this, &QgsRasterLayerSaveAsDialog::mColumnsLineEdit_textEdited );
63 connect( mRowsLineEdit, &QLineEdit::textEdited,
this, &QgsRasterLayerSaveAsDialog::mRowsLineEdit_textEdited );
64 connect( mAddNoDataManuallyToolButton, &QPushButton::clicked,
this, &QgsRasterLayerSaveAsDialog::mAddNoDataManuallyToolButton_clicked );
65 connect( mLoadTransparentNoDataToolButton, &QPushButton::clicked,
this, &QgsRasterLayerSaveAsDialog::mLoadTransparentNoDataToolButton_clicked );
66 connect( mRemoveSelectedNoDataToolButton, &QPushButton::clicked,
this, &QgsRasterLayerSaveAsDialog::mRemoveSelectedNoDataToolButton_clicked );
67 connect( mRemoveAllNoDataToolButton, &QPushButton::clicked,
this, &QgsRasterLayerSaveAsDialog::mRemoveAllNoDataToolButton_clicked );
68 connect( mTileModeCheckBox, &QCheckBox::toggled,
this, &QgsRasterLayerSaveAsDialog::mTileModeCheckBox_toggled );
69 connect( mPyramidsGroupBox, &QgsCollapsibleGroupBox::toggled,
this, &QgsRasterLayerSaveAsDialog::mPyramidsGroupBox_toggled );
75 mNoDataTableWidget->setColumnCount( 2 );
76 mNoDataTableWidget->setHorizontalHeaderItem( 0,
new QTableWidgetItem( tr(
"From" ) ) );
77 mNoDataTableWidget->setHorizontalHeaderItem( 1,
new QTableWidgetItem( tr(
"To" ) ) );
79 mRawModeRadioButton_toggled(
true );
83 toggleResolutionSize();
85 insertAvailableOutputFormats();
92 setOriginalResolution();
93 int xSize = mDataProvider->
xSize();
94 int ySize = mDataProvider->
ySize();
95 mMaximumSizeXLineEdit->setText( QString::number( xSize ) );
96 mMaximumSizeYLineEdit->setText( QString::number( ySize ) );
100 mTileModeCheckBox->setChecked(
true );
101 mMaximumSizeXLineEdit->setText( QString::number( 2000 ) );
102 mMaximumSizeYLineEdit->setText( QString::number( 2000 ) );
106 mCreateOptionsWidget->setProvider( mDataProvider->
name() );
107 if ( mDataProvider->
name() == QLatin1String(
"gdal" ) )
109 mCreateOptionsWidget->setFormat( mFormatComboBox->currentData().toString() );
111 mCreateOptionsWidget->setRasterLayer( mRasterLayer );
112 mCreateOptionsWidget->update();
120 mPyramidsOptionsWidget->createOptionsWidget()->setRasterLayer( mRasterLayer );
125 mPyramidsUseExistingCheckBox->setEnabled(
false );
126 mPyramidsUseExistingCheckBox->setVisible(
false );
128 populatePyramidsLevels();
130 this, &QgsRasterLayerSaveAsDialog::populatePyramidsLevels );
134 mPyramidsGroupBox->setEnabled(
false );
139 mCreateOptionsGroupBox->setSaveCheckedState(
true );
149 mCrsSelector->setSourceEnsemble( ensemble.
name() );
155 mCrsSelector->setShowAccuracyWarnings(
true );
157 mCrsSelector->setLayerCrs( mLayerCrs );
159 mCrsSelector->setCrs( mLayerCrs );
162 this, &QgsRasterLayerSaveAsDialog::crsChanged );
164 QPushButton *okButton = mButtonBox->button( QDialogButtonBox::Ok );
167 okButton->setEnabled(
false );
171 mHelpButtonBox->setVisible(
false );
172 mButtonBox->addButton( QDialogButtonBox::Help );
173 connect( mButtonBox, &QDialogButtonBox::helpRequested,
this, &QgsRasterLayerSaveAsDialog::showHelp );
175 connect( mHelpButtonBox, &QDialogButtonBox::helpRequested,
this, &QgsRasterLayerSaveAsDialog::showHelp );
178 connect( mButtonBox, &QDialogButtonBox::rejected,
this, &QgsRasterLayerSaveAsDialog::reject );
180 mExtentGroupBox->setOutputCrs(
outputCrs() );
181 mExtentGroupBox->setOriginalExtent( mDataProvider->
extent(), mLayerCrs );
182 mExtentGroupBox->setCurrentExtent( mCurrentExtent, mCurrentCrs );
183 mExtentGroupBox->setOutputExtentFromOriginal();
186 recalcResolutionSize();
188 QgsSettings settings;
190 if ( mTileModeCheckBox->isChecked() )
192 mTilesGroupBox->show();
194 mFilename->setDialogTitle( tr(
"Select Output Directory" ) );
198 mTilesGroupBox->hide();
200 mFilename->setDialogTitle( tr(
"Save Layer As" ) );
203 mFilename->setDefaultRoot( settings.value( QStringLiteral(
"UI/lastRasterFileDir" ), QDir::homePath() ).toString() );
206 QgsSettings settings;
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" ),
236 tr(
"The directory %1 contains files which will be overwritten: %2" ).arg( dir.absolutePath(), files.join( QLatin1String(
", " ) ) ),
237 QMessageBox::Ok | QMessageBox::Cancel ) == QMessageBox::Ok )
240 fileName = QFileDialog::getExistingDirectory(
this, tr(
"Select output directory" ), tmplFileInfo.absolutePath() );
244 QPushButton *okButton = mButtonBox->button( QDialogButtonBox::Ok );
249 okButton->setEnabled( tmplFileInfo.absoluteDir().exists() );
253 void QgsRasterLayerSaveAsDialog::insertAvailableOutputFormats()
257 int nDrivers = GDALGetDriverCount();
258 QMap< int, QPair< QString, QString > > topPriorityDrivers;
259 QMap< QString, QString > lowPriorityDrivers;
261 for (
int i = 0; i < nDrivers; ++i )
263 GDALDriverH driver = GDALGetDriver( i );
268 QString driverShortName = GDALGetDriverShortName( driver );
269 QString driverLongName = GDALGetDriverLongName( driver );
270 if ( driverShortName == QLatin1String(
"MEM" ) )
277 else if ( driverShortName == QLatin1String(
"VRT" ) )
282 else if ( driverShortName == QLatin1String(
"GTiff" ) )
285 topPriorityDrivers.insert( 1, qMakePair( driverLongName, driverShortName ) );
287 else if ( driverShortName == QLatin1String(
"GPKG" ) )
290 topPriorityDrivers.insert( 2, qMakePair( driverLongName, driverShortName ) );
294 lowPriorityDrivers.insert( driverLongName, driverShortName );
301 for (
auto priorityDriversIt = topPriorityDrivers.constBegin(); priorityDriversIt != topPriorityDrivers.constEnd(); ++priorityDriversIt )
303 mFormatComboBox->addItem( priorityDriversIt.value().first, priorityDriversIt.value().second );
306 for (
auto lowPriorityDriversIt = lowPriorityDrivers.constBegin(); lowPriorityDriversIt != lowPriorityDrivers.constEnd(); ++lowPriorityDriversIt )
308 mFormatComboBox->addItem( lowPriorityDriversIt.key(), lowPriorityDriversIt.value() );
313 void QgsRasterLayerSaveAsDialog::setValidators()
317 mColumnsLineEdit->setValidator(
new QIntValidator(
this ) );
318 mRowsLineEdit->setValidator(
new QIntValidator(
this ) );
319 mMaximumSizeXLineEdit->setValidator(
new QIntValidator(
this ) );
320 mMaximumSizeYLineEdit->setValidator(
new QIntValidator(
this ) );
323 void QgsRasterLayerSaveAsDialog::mFormatComboBox_currentIndexChanged(
const QString & )
326 if ( mDataProvider && mDataProvider->
name() == QLatin1String(
"gdal" ) )
329 mCreateOptionsWidget->update();
334 if ( extensions.empty() )
335 filter = tr(
"All files (*.*)" );
338 filter = QStringLiteral(
"%1 (*.%2);;%3" ).arg( mFormatComboBox->currentText(),
339 extensions.join( QLatin1String(
" *." ) ),
340 tr(
"All files (*.*)" ) );
342 mFilename->setFilter( filter );
345 mTileModeCheckBox->setEnabled(
outputFormat() != QLatin1String(
"GPKG" ) );
346 mFilename->setConfirmOverwrite(
outputFormat() != QLatin1String(
"GPKG" ) );
347 mLayerName->setEnabled(
outputFormat() == QLatin1String(
"GPKG" ) );
348 if ( mLayerName->isEnabled() )
350 QString layerName = QFileInfo( mFilename->filePath() ).baseName();
351 mLayerName->setText( layerName );
352 mTileModeCheckBox->setChecked(
false );
356 mLayerName->setText( QString() );
362 return mColumnsLineEdit->text().toInt();
367 return mRowsLineEdit->text().toInt();
382 return mMaximumSizeXLineEdit->text().toInt();
387 return mMaximumSizeYLineEdit->text().toInt();
392 return mTileModeCheckBox->isChecked();
397 return mAddToCanvas->isChecked();
402 mAddToCanvas->setChecked( checked );
407 QString fileName = mFilename->filePath();
413 if ( !extensions.empty() )
415 defaultExt = extensions.at( 0 );
419 QFileInfo fi( fileName );
420 if ( !fileName.isEmpty() && fi.suffix().isEmpty() )
422 fileName +=
'.' + defaultExt;
431 if ( mLayerName->text().isEmpty() &&
outputFormat() == QLatin1String(
"GPKG" ) && !mTileModeCheckBox->isChecked() )
434 return QFileInfo( mFilename->filePath() ).baseName();
438 return mLayerName->text();
444 return mFormatComboBox->currentData().toString();
449 QStringList options = mCreateOptionsGroupBox->isChecked() ? mCreateOptionsWidget->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 );
502 void 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 );
515 void QgsRasterLayerSaveAsDialog::setOriginalResolution()
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 );
550 xRes = extent.
width();
553 mXResolutionLineEdit->setText( QLocale().toString( xRes ) );
554 mYResolutionLineEdit->setText( QLocale().toString( yRes ) );
557 void QgsRasterLayerSaveAsDialog::recalcSize()
562 mColumnsLineEdit->setText( QString::number( xSize ) );
563 mRowsLineEdit->setText( QString::number( ySize ) );
564 updateResolutionStateMsg();
567 void QgsRasterLayerSaveAsDialog::setOriginalSize()
569 mColumnsLineEdit->setText( QString::number( mDataProvider->
xSize() ) );
570 mRowsLineEdit->setText( QString::number( mDataProvider->
ySize() ) );
574 void QgsRasterLayerSaveAsDialog::recalcResolution()
579 mXResolutionLineEdit->setText( QLocale().toString( xRes ) );
580 mYResolutionLineEdit->setText( QLocale().toString( yRes ) );
581 updateResolutionStateMsg();
584 void QgsRasterLayerSaveAsDialog::recalcResolutionSize()
586 if ( mResolutionRadioButton->isChecked() )
597 void QgsRasterLayerSaveAsDialog::updateResolutionStateMsg()
600 switch ( mResolutionState )
606 msg = tr(
"user defined" );
611 msg = tr(
"Resolution (current: %1)" ).arg( msg );
612 mResolutionGroupBox->setTitle( msg );
615 void QgsRasterLayerSaveAsDialog::extentChanged()
618 if ( mSizeRadioButton->isChecked() )
622 recalcResolutionSize();
625 void QgsRasterLayerSaveAsDialog::crsChanged()
629 mExtentGroupBox->setOutputCrs(
outputCrs() );
632 if ( mResolutionRadioButton->isChecked() )
636 setOriginalResolution();
655 return mCrsSelector->crs();
664 void QgsRasterLayerSaveAsDialog::mRawModeRadioButton_toggled(
bool checked )
666 mNoDataGroupBox->setEnabled( checked && mDataProvider->
bandCount() == 1 );
669 void QgsRasterLayerSaveAsDialog::mAddNoDataManuallyToolButton_clicked()
671 addNoDataRow( std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN() );
674 void QgsRasterLayerSaveAsDialog::mLoadTransparentNoDataToolButton_clicked()
676 if ( !mRasterLayer->
renderer() )
return;
678 if ( !rasterTransparency )
return;
683 if ( transparencyPixel.percentTransparent == 100 )
685 addNoDataRow( transparencyPixel.min, transparencyPixel.max );
686 if ( transparencyPixel.min != transparencyPixel.max )
688 setNoDataToEdited( mNoDataTableWidget->rowCount() - 1 );
694 void QgsRasterLayerSaveAsDialog::mRemoveSelectedNoDataToolButton_clicked()
696 mNoDataTableWidget->removeRow( mNoDataTableWidget->currentRow() );
699 void QgsRasterLayerSaveAsDialog::mRemoveAllNoDataToolButton_clicked()
701 while ( mNoDataTableWidget->rowCount() > 0 )
703 mNoDataTableWidget->removeRow( 0 );
707 void QgsRasterLayerSaveAsDialog::addNoDataRow(
double min,
double max )
709 mNoDataTableWidget->insertRow( mNoDataTableWidget->rowCount() );
710 for (
int i = 0; i < 2; i++ )
712 double value = i == 0 ? min : max;
713 QLineEdit *lineEdit =
new QLineEdit();
714 lineEdit->setFrame(
false );
715 lineEdit->setContentsMargins( 1, 1, 1, 1 );
722 if ( !std::isnan( value ) )
728 lineEdit->setValidator(
new QIntValidator(
nullptr ) );
729 if ( !std::isnan( value ) )
731 valueString = QLocale().toString(
static_cast<int>( value ) );
735 lineEdit->setText( valueString );
736 mNoDataTableWidget->setCellWidget( mNoDataTableWidget->rowCount() - 1, i, lineEdit );
738 adjustNoDataCellWidth( mNoDataTableWidget->rowCount() - 1, i );
740 connect( lineEdit, &QLineEdit::textEdited,
this, &QgsRasterLayerSaveAsDialog::noDataCellTextEdited );
742 mNoDataTableWidget->resizeColumnsToContents();
743 mNoDataTableWidget->resizeRowsToContents();
746 void QgsRasterLayerSaveAsDialog::noDataCellTextEdited(
const QString &text )
750 QLineEdit *lineEdit = qobject_cast<QLineEdit *>( sender() );
751 if ( !lineEdit )
return;
754 for (
int r = 0; r < mNoDataTableWidget->rowCount(); r++ )
756 for (
int c = 0;
c < mNoDataTableWidget->columnCount();
c++ )
758 if ( mNoDataTableWidget->cellWidget( r,
c ) == sender() )
765 if ( row != -1 )
break;
767 QgsDebugMsg( QStringLiteral(
"row = %1 column =%2" ).arg( row ).arg( column ) );
771 QLineEdit *toLineEdit =
dynamic_cast<QLineEdit *
>( mNoDataTableWidget->cellWidget( row, 1 ) );
772 if ( !toLineEdit )
return;
773 bool toChanged = mNoDataToEdited.value( row );
774 QgsDebugMsg( QStringLiteral(
"toChanged = %1" ).arg( toChanged ) );
777 toLineEdit->setText( lineEdit->text() );
780 else if ( column == 1 )
782 setNoDataToEdited( row );
786 void QgsRasterLayerSaveAsDialog::mTileModeCheckBox_toggled(
bool toggled )
805 mTilesGroupBox->show();
807 mFilename->setDialogTitle( tr(
"Select Output Directory" ) );
811 mTilesGroupBox->hide();
813 mFilename->setDialogTitle( tr(
"Save Layer As" ) );
817 void QgsRasterLayerSaveAsDialog::mPyramidsGroupBox_toggled(
bool toggled )
820 populatePyramidsLevels();
823 void QgsRasterLayerSaveAsDialog::populatePyramidsLevels()
827 if ( mPyramidsGroupBox->isChecked() )
829 QList<QgsRasterPyramid> myPyramidList;
832 if ( mPyramidsUseExistingCheckBox->isChecked() )
838 if ( ! mPyramidsOptionsWidget->overviewList().isEmpty() )
839 myPyramidList = mDataProvider->
buildPyramidList( mPyramidsOptionsWidget->overviewList() );
843 if ( ! mPyramidsUseExistingCheckBox->isChecked() || pyramid.getExists() )
845 text += QString::number( pyramid.getXDim() ) + QStringLiteral(
"x" ) +
846 QString::number( pyramid.getYDim() ) +
' ';
851 mPyramidResolutionsLineEdit->setText( text.trimmed() );
854 void QgsRasterLayerSaveAsDialog::setNoDataToEdited(
int row )
856 if ( row >= mNoDataToEdited.size() )
858 mNoDataToEdited.resize( row + 1 );
860 mNoDataToEdited[row] =
true;
863 double QgsRasterLayerSaveAsDialog::noDataCellValue(
int row,
int column )
const
865 QLineEdit *lineEdit =
dynamic_cast<QLineEdit *
>( mNoDataTableWidget->cellWidget( row, column ) );
866 if ( !lineEdit || lineEdit->text().isEmpty() )
868 return std::numeric_limits<double>::quiet_NaN();
873 void QgsRasterLayerSaveAsDialog::adjustNoDataCellWidth(
int row,
int column )
875 QLineEdit *lineEdit =
dynamic_cast<QLineEdit *
>( mNoDataTableWidget->cellWidget( row, column ) );
876 if ( !lineEdit )
return;
878 int width = std::max( lineEdit->fontMetrics().boundingRect( lineEdit->text() ).width() + 10, 100 );
879 width = std::max( width, mNoDataTableWidget->columnWidth( column ) );
881 lineEdit->setFixedWidth( width );
887 if ( ! mNoDataGroupBox->isChecked() )
890 int rows = mNoDataTableWidget->rowCount();
891 noDataList.reserve( rows );
892 for (
int r = 0; r < rows; r++ )
895 noDataList.append(
noData );
903 return mPyramidsGroupBox->isChecked() ? mPyramidsOptionsWidget->overviewList() : QList<int>();
908 if ( ! mPyramidsGroupBox->isChecked() )
910 else if ( mPyramidsUseExistingCheckBox->isChecked() )
916 bool QgsRasterLayerSaveAsDialog::validate()
const
918 if ( mCreateOptionsGroupBox->isChecked() )
920 QString message = mCreateOptionsWidget->validateOptions(
true,
false );
921 if ( !message.isNull() )
924 if ( mPyramidsGroupBox->isChecked() )
926 QString message = mPyramidsOptionsWidget->createOptionsWidget()->validateOptions(
true,
false );
927 if ( !message.isNull() )
933 bool QgsRasterLayerSaveAsDialog::outputLayerExists()
const
947 QgsRasterLayer rasterLayer( rasterUri, QString( ), QStringLiteral(
"gdal" ) );
948 if ( !vectorUri.isEmpty() )
950 QgsVectorLayer vectorLayer( vectorUri, QString( ), QStringLiteral(
"ogr" ) );
951 return rasterLayer.isValid() || vectorLayer.isValid();
955 return rasterLayer.isValid();
966 if (
outputFormat() == QLatin1String(
"GPKG" ) && outputLayerExists() &&
967 QMessageBox::warning(
this, tr(
"Save Raster Layer" ),
968 tr(
"The layer %1 already exists in the target file, and overwriting layers in GeoPackage is not supported. "
970 QMessageBox::Yes | QMessageBox::No ) == QMessageBox::No )
978 void QgsRasterLayerSaveAsDialog::showHelp()
980 QgsHelp::openHelp( QStringLiteral(
"managing_data_source/create_layers.html#creating-new-layers-from-an-existing-layer" ) );
@ Float32
Thirty two bit floating point (float)
@ Float64
Sixty four bit floating point (double)
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
This class represents a coordinate reference system (CRS).
QgsDatumEnsemble datumEnsemble() const SIP_THROW(QgsNotSupportedException)
Attempts to retrieve datum ensemble details from the CRS.
virtual QString name() const =0
Returns a provider name.
Contains information about a datum ensemble.
bool isValid() const
Returns true if the datum ensemble is a valid object, or false if it is a null/invalid object.
QString name() const
Display name of datum ensemble.
QgsDoubleValidator is a QLineEdit Validator that combines QDoubleValidator and QRegularExpressionVali...
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 QgsGui * instance()
Returns a pointer to the singleton instance.
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.
Custom exception class which is raised when an operation is not supported.
A class to represent a 2D point.
static QgsProject * instance()
Returns the QgsProject singleton instance.
static QString printValue(double value)
Print double value with all necessary significant digits.
Base class for raster data providers.
virtual QList< QgsRasterPyramid > buildPyramidList(const QList< int > &overviewList=QList< int >())
Returns the raster layers pyramid list.
Qgis::DataType sourceDataType(int bandNo) const override=0
Returns source data type for the band specified by number, source data type may be shorter than dataT...
QgsRectangle extent() const override=0
Returns the extent of the layer.
static QStringList extensionsForFormat(const QString &format)
Returns a list of known file extensions for the given GDAL driver format.
@ BuildPyramids
Supports building of pyramids (overviews)
@ Size
Original data source size (and thus resolution) is known, it is not always available,...
virtual int xSize() const
Gets raster size.
virtual int bandCount() const =0
Gets number of bands.
virtual int capabilities() const
Returns a bitmask containing the supported capabilities.
virtual int ySize() const
double xResolution() const
double yResolution() const
QgsRasterRangeList noData() const
int maximumTileSizeX() const
QString outputLayerName() const
Name of the output layer within GeoPackage file.
QList< int > pyramidsList() const
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.
QgsRaster::RasterBuildPyramids buildPyramidsFlag() const
bool addToCanvas() const
Returns true if the "add to canvas" checkbox is checked.
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.
QgsRasterDataProvider * dataProvider() override
Returns the source data provider.
QgsRasterRenderer * renderer() const
Returns the raster's renderer.
This struct is used to store pyramid info for the raster layer.
Raster values range container.
const QgsRasterTransparency * rasterTransparency() const
Defines the list of pixel values to be considered as transparent or semi transparent when rendering r...
QList< QgsRasterTransparency::TransparentSingleValuePixel > transparentSingleValuePixelList() const
Returns the transparent single value pixel list.
A rectangle specified with double values.
double height() const SIP_HOLDGIL
Returns the height of the rectangle.
double width() const SIP_HOLDGIL
Returns the width of the rectangle.
QgsPointXY center() const SIP_HOLDGIL
Returns the center point of the rectangle.
Represents a vector layer which manages a vector based data sets.
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
QList< QgsRasterRange > QgsRasterRangeList