24 #include <QFileDialog>
25 #include <QMessageBox>
33 , mRasterLayer( rasterLayer ), mDataProvider( sourceProvider )
34 , mCurrentExtent( currentExtent ), mLayerCrs( layerCrs )
35 , mCurrentCrs( currentCrs )
36 , mResolutionState( OriginalResolution )
44 mNoDataTableWidget->setColumnCount( 2 );
45 mNoDataTableWidget->setHorizontalHeaderItem( 0,
new QTableWidgetItem(
tr(
"From" ) ) );
48 on_mRawModeRadioButton_toggled(
true );
52 toggleResolutionSize();
57 Q_FOREACH (
const QString& myFormat, myFormats )
59 mFormatComboBox->addItem( myFormat );
67 setOriginalResolution();
68 int xSize = mDataProvider->
xSize();
69 int ySize = mDataProvider->
ySize();
75 mTileModeCheckBox->setChecked(
true );
81 mCreateOptionsWidget->setProvider( mDataProvider->
name() );
82 if ( mDataProvider->
name() ==
"gdal" )
84 mCreateOptionsWidget->setFormat( myFormats[0] );
86 mCreateOptionsWidget->setRasterLayer( mRasterLayer );
87 mCreateOptionsWidget->update();
95 mPyramidsOptionsWidget->createOptionsWidget()->setRasterLayer( mRasterLayer );
100 mPyramidsUseExistingCheckBox->setEnabled(
false );
101 mPyramidsUseExistingCheckBox->setVisible(
false );
103 populatePyramidsLevels();
104 connect( mPyramidsOptionsWidget, SIGNAL( overviewListChanged() ),
105 this, SLOT( populatePyramidsLevels() ) );
109 mPyramidsGroupBox->setEnabled(
false );
114 mCreateOptionsGroupBox->setSaveCheckedState(
true );
119 mTilesGroupBox->hide();
121 mCrsSelector->setLayerCrs( mLayerCrs );
123 mCrsSelector->setCrs( mLayerCrs );
126 this, SLOT( crsChanged() ) );
128 QPushButton* okButton = mButtonBox->button( QDialogButtonBox::Ok );
134 mExtentGroupBox->setOutputCrs(
outputCrs() );
135 mExtentGroupBox->setOriginalExtent( mDataProvider->
extent(), mLayerCrs );
136 mExtentGroupBox->setCurrentExtent( mCurrentExtent, mCurrentCrs );
137 mExtentGroupBox->setOutputExtentFromOriginal();
138 connect( mExtentGroupBox, SIGNAL( extentChanged(
QgsRectangle ) ),
this, SLOT( extentChanged() ) );
140 recalcResolutionSize();
143 void QgsRasterLayerSaveAsDialog::setValidators()
149 mMaximumSizeXLineEdit->setValidator(
new QIntValidator(
this ) );
150 mMaximumSizeYLineEdit->setValidator(
new QIntValidator(
this ) );
157 void QgsRasterLayerSaveAsDialog::on_mBrowseButton_clicked()
164 if ( mTileModeCheckBox->isChecked() )
176 QDir dir( fileName );
185 tr(
"The directory %1 contains files which will be overwritten: %2" ).arg( dir.absolutePath(), files.
join(
", " ) ),
186 QMessageBox::Ok | QMessageBox::Cancel ) == QMessageBox::Ok )
197 if ( !fileName.
isEmpty() && !fileName.
endsWith(
".tif", Qt::CaseInsensitive ) && !fileName.
endsWith(
".tiff", Qt::CaseInsensitive ) )
205 mSaveAsLineEdit->setText( fileName );
209 void QgsRasterLayerSaveAsDialog::on_mSaveAsLineEdit_textChanged(
const QString& text )
211 QPushButton* okButton = mButtonBox->button( QDialogButtonBox::Ok );
221 void QgsRasterLayerSaveAsDialog::on_mFormatComboBox_currentIndexChanged(
const QString & text )
224 if ( mDataProvider && mDataProvider->
name() ==
"gdal" )
226 mCreateOptionsWidget->setFormat( text );
227 mCreateOptionsWidget->update();
233 return mColumnsLineEdit->text().toInt();
238 return mRowsLineEdit->text().toInt();
243 return mXResolutionLineEdit->text().toDouble();
248 return mYResolutionLineEdit->text().toDouble();
253 return mMaximumSizeXLineEdit->text().toInt();
258 return mMaximumSizeYLineEdit->text().toInt();
263 return mTileModeCheckBox->isChecked();
268 return mAddToCanvas->isChecked();
273 return mSaveAsLineEdit->text();
278 return mFormatComboBox->currentText();
283 return mCreateOptionsGroupBox->isChecked() ? mCreateOptionsWidget->options() :
QStringList();
288 return mExtentGroupBox->outputExtent();
293 mFormatLabel->hide();
294 mFormatComboBox->hide();
299 mSaveAsLabel->hide();
300 mSaveAsLineEdit->hide();
301 mBrowseButton->hide();
302 QPushButton* okButton = mButtonBox->button( QDialogButtonBox::Ok );
309 void QgsRasterLayerSaveAsDialog::toggleResolutionSize()
313 bool on = mResolutionRadioButton->isChecked();
314 mXResolutionLineEdit->setEnabled( on );
315 mYResolutionLineEdit->setEnabled( on );
316 mOriginalResolutionPushButton->setEnabled( on && hasResolution );
317 mColumnsLineEdit->setEnabled( !on );
318 mRowsLineEdit->setEnabled( !on );
319 mOriginalSizePushButton->setEnabled( !on && hasResolution );
322 void QgsRasterLayerSaveAsDialog::setOriginalResolution()
334 xRes = yRes = mDataProvider->
extent().
width() / 100;
336 setResolution( xRes, yRes, mLayerCrs );
354 QgsRectangle srcExtent( srsCenter.
x() - xRes / 2, srsCenter.
y() - yRes / 2, srsCenter.
x() + xRes / 2, srsCenter.
y() + yRes / 2 );
357 xRes = extent.
width();
358 yRes = extent.height();
364 void QgsRasterLayerSaveAsDialog::recalcSize()
372 updateResolutionStateMsg();
375 void QgsRasterLayerSaveAsDialog::setOriginalSize()
382 void QgsRasterLayerSaveAsDialog::recalcResolution()
390 updateResolutionStateMsg();
393 void QgsRasterLayerSaveAsDialog::recalcResolutionSize()
396 if ( mResolutionRadioButton->isChecked() )
407 void QgsRasterLayerSaveAsDialog::updateResolutionStateMsg()
410 switch ( mResolutionState )
416 msg =
tr(
"user defined" );
421 msg =
tr(
"Resolution (current: %1)" ).
arg( msg );
422 mResolutionGroupBox->setTitle( msg );
425 void QgsRasterLayerSaveAsDialog::extentChanged()
428 if ( mSizeRadioButton->isChecked() )
432 recalcResolutionSize();
435 void QgsRasterLayerSaveAsDialog::crsChanged()
439 mExtentGroupBox->setOutputCrs(
outputCrs() );
447 mExtentGroupBox->setOutputExtentFromOriginal();
451 mExtentGroupBox->setOutputExtentFromCurrent();
455 mExtentGroupBox->setOutputExtentFromUser( mExtentGroupBox->outputExtent(), mPreviousCrs );
459 if ( mResolutionRadioButton->isChecked() )
463 setOriginalResolution();
482 return mCrsSelector->crs();
491 void QgsRasterLayerSaveAsDialog::on_mRawModeRadioButton_toggled(
bool checked )
493 mNoDataGroupBox->setEnabled( checked && mDataProvider->
bandCount() == 1 );
496 void QgsRasterLayerSaveAsDialog::on_mAddNoDataManuallyToolButton_clicked()
498 addNoDataRow( std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN() );
501 void QgsRasterLayerSaveAsDialog::on_mLoadTransparentNoDataToolButton_clicked()
503 if ( !mRasterLayer->
renderer() )
return;
505 if ( !rasterTransparency )
return;
511 addNoDataRow( transparencyPixel.
min, transparencyPixel.
max );
512 if ( transparencyPixel.
min != transparencyPixel.
max )
514 setNoDataToEdited( mNoDataTableWidget->rowCount() - 1 );
520 void QgsRasterLayerSaveAsDialog::on_mRemoveSelectedNoDataToolButton_clicked()
522 mNoDataTableWidget->removeRow( mNoDataTableWidget->currentRow() );
525 void QgsRasterLayerSaveAsDialog::on_mRemoveAllNoDataToolButton_clicked()
527 while ( mNoDataTableWidget->rowCount() > 0 )
529 mNoDataTableWidget->removeRow( 0 );
533 void QgsRasterLayerSaveAsDialog::addNoDataRow(
double min,
double max )
535 mNoDataTableWidget->insertRow( mNoDataTableWidget->rowCount() );
536 for (
int i = 0; i < 2; i++ )
538 double value = i == 0 ? min :
max;
548 if ( !qIsNaN( value ) )
555 if ( !qIsNaN( value ) )
561 lineEdit->
setText( valueString );
562 mNoDataTableWidget->setCellWidget( mNoDataTableWidget->rowCount() - 1, i, lineEdit );
564 adjustNoDataCellWidth( mNoDataTableWidget->rowCount() - 1, i );
566 connect( lineEdit, SIGNAL( textEdited(
const QString & ) ),
this, SLOT( noDataCellTextEdited(
const QString & ) ) );
568 mNoDataTableWidget->resizeColumnsToContents();
569 mNoDataTableWidget->resizeRowsToContents();
572 void QgsRasterLayerSaveAsDialog::noDataCellTextEdited(
const QString & text )
577 if ( !lineEdit )
return;
580 for (
int r = 0 ; r < mNoDataTableWidget->rowCount(); r++ )
582 for (
int c = 0 ; c < mNoDataTableWidget->columnCount(); c++ )
584 if ( mNoDataTableWidget->cellWidget( r, c ) ==
sender() )
591 if ( row != -1 )
break;
597 QLineEdit *toLineEdit =
dynamic_cast<QLineEdit *
>( mNoDataTableWidget->cellWidget( row, 1 ) );
598 if ( !toLineEdit )
return;
599 bool toChanged = mNoDataToEdited.
value( row );
606 else if ( column == 1 )
608 setNoDataToEdited( row );
612 void QgsRasterLayerSaveAsDialog::on_mTileModeCheckBox_toggled(
bool toggled )
631 mTilesGroupBox->show();
635 mTilesGroupBox->hide();
639 void QgsRasterLayerSaveAsDialog::on_mPyramidsGroupBox_toggled(
bool toggled )
642 populatePyramidsLevels();
645 void QgsRasterLayerSaveAsDialog::populatePyramidsLevels()
649 if ( mPyramidsGroupBox->isChecked() )
654 if ( mPyramidsUseExistingCheckBox->isChecked() )
660 if ( ! mPyramidsOptionsWidget->overviewList().isEmpty() )
661 myPyramidList = mDataProvider->
buildPyramidList( mPyramidsOptionsWidget->overviewList() );
664 for ( myRasterPyramidIterator = myPyramidList.
begin();
665 myRasterPyramidIterator != myPyramidList.
end();
666 ++myRasterPyramidIterator )
668 if ( ! mPyramidsUseExistingCheckBox->isChecked() || myRasterPyramidIterator->exists )
676 mPyramidResolutionsLineEdit->setText( text.
trimmed() );
679 void QgsRasterLayerSaveAsDialog::setNoDataToEdited(
int row )
681 if ( row >= mNoDataToEdited.
size() )
683 mNoDataToEdited.
resize( row + 1 );
685 mNoDataToEdited[row] =
true;
688 double QgsRasterLayerSaveAsDialog::noDataCellValue(
int row,
int column )
const
690 QLineEdit *lineEdit =
dynamic_cast<QLineEdit *
>( mNoDataTableWidget->cellWidget( row, column ) );
691 if ( !lineEdit || lineEdit->
text().isEmpty() )
693 std::numeric_limits<double>::quiet_NaN();
695 return lineEdit->
text().toDouble();
698 void QgsRasterLayerSaveAsDialog::adjustNoDataCellWidth(
int row,
int column )
700 QLineEdit *lineEdit =
dynamic_cast<QLineEdit *
>( mNoDataTableWidget->cellWidget( row, column ) );
701 if ( !lineEdit )
return;
704 width = qMax( width, mNoDataTableWidget->columnWidth( column ) );
712 if ( ! mNoDataGroupBox->isChecked() )
715 int rows = mNoDataTableWidget->rowCount();
717 for (
int r = 0 ; r < rows; r++ )
720 noDataList.
append( noData );
728 return mPyramidsGroupBox->isChecked() ? mPyramidsOptionsWidget->overviewList() :
QList<int>();
733 if ( ! mPyramidsGroupBox->isChecked() )
735 else if ( mPyramidsUseExistingCheckBox->isChecked() )
741 bool QgsRasterLayerSaveAsDialog::validate()
const
743 if ( mCreateOptionsGroupBox->isChecked() )
745 QString message = mCreateOptionsWidget->validateOptions(
true,
false );
749 if ( mPyramidsGroupBox->isChecked() )
751 QString message = mPyramidsOptionsWidget->createOptionsWidget()->validateOptions(
true,
false );
virtual int bandCount() const =0
Get number of bands.
Sixty four bit floating point (double)
QList< QgsRasterTransparency::TransparentSingleValuePixel > transparentSingleValuePixelList() const
Accessor for transparentSingleValuePixelList.
A rectangle specified with double values.
QString getExistingDirectory(QWidget *parent, const QString &caption, const QString &dir, QFlags< QFileDialog::Option > options)
static QString printValue(double value)
Print double value with all necessary significant digits.
void setText(const QString &)
This class provides qgis with the ability to render raster datasets onto the mapcanvas.
static QIcon getThemeIcon(const QString &theName)
Helper to get a theme icon.
Raster values range container.
QgsCoordinateReferenceSystem outputCrs()
QString join(const QString &separator) const
QList< int > pyramidsList() const
QString tr(const char *sourceText, const char *disambiguation, int n)
double x() const
Get the x value of the point.
virtual QString name() const =0
Return a provider name.
virtual int ySize() const
const QgsRasterTransparency * rasterTransparency() const
double ANALYSIS_EXPORT max(double x, double y)
Returns the maximum of two doubles or the first argument if both are equal.
QString number(int n, int base)
void append(const T &value)
Thirty two bit floating point (float)
QgsRasterRenderer * renderer() const
virtual QGis::DataType srcDataType(int bandNo) const override=0
Returns source data type for the band specified by number, source data type may be shorter than dataT...
virtual QList< QgsRasterPyramid > buildPyramidList(QList< int > overviewList=QList< int >())
Accessor for ths raster layers pyramid list.
double percentTransparent
QgsRaster::RasterBuildPyramids buildPyramidsFlag() const
QgsRectangle outputRectangle() const
double xResolution() const
~QgsRasterLayerSaveAsDialog()
bool endsWith(const QString &s, Qt::CaseSensitivity cs) const
A class to represent a point.
double yResolution() const
virtual int capabilities() const
Returns a bitmask containing the supported capabilities.
int width(const QString &text, int len) const
virtual QgsRectangle extent() override=0
Get the extent of the data source.
QgsRasterLayerSaveAsDialog(QgsRasterLayer *rasterLayer, QgsRasterDataProvider *sourceProvider, const QgsRectangle ¤tExtent, const QgsCoordinateReferenceSystem &layerCrs, const QgsCoordinateReferenceSystem ¤tCrs, QWidget *parent=nullptr, const Qt::WindowFlags &f=nullptr)
QgsRasterRangeList noData() const
int maximumTileSizeX() const
QVariant value(const QString &key, const QVariant &defaultValue) const
virtual int xSize() const
Get raster size.
Class for storing a coordinate reference system (CRS)
QString getSaveFileName(QWidget *parent, const QString &caption, const QString &dir, const QString &filter, QString *selectedFilter, QFlags< QFileDialog::Option > options)
double y() const
Get the y value of the point.
StandardButton warning(QWidget *parent, const QString &title, const QString &text, QFlags< QMessageBox::StandardButton > buttons, StandardButton defaultButton)
QgsRasterDataProvider * dataProvider()
Returns the data provider.
Defines the list of pixel values to be considered as transparent or semi transparent when rendering r...
double ANALYSIS_EXPORT min(double x, double y)
Returns the minimum of two doubles or the first argument if both are equal.
QStringList createOptions() const
double width() const
Width of the rectangle.
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QString arg(qlonglong a, int fieldWidth, int base, const QChar &fillChar) const
void setValidator(const QValidator *v)
QgsPoint center() const
Center point of the rectangle.
int maximumTileSizeY() const
double height() const
Height of the rectangle.
void setContentsMargins(int left, int top, int right, int bottom)
QString outputFormat() const
Base class for raster data providers.
QString outputFileName() const