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 );
QList< int > pyramidsList() const
virtual int bandCount() const =0
Get number of bands.
A rectangle specified with double values.
QgsPoint center() const
Center point of the rectangle.
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.
QgsRaster::RasterBuildPyramids buildPyramidsFlag() const
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.
virtual int ySize() const
double yResolution() const
Thirty two bit floating point (float)
Raster values range container.
QgsCoordinateReferenceSystem outputCrs()
QgsRasterRenderer * renderer() const
QString join(const QString &separator) const
QString outputFileName() const
int maximumTileSizeY() const
QString tr(const char *sourceText, const char *disambiguation, int n)
const QgsRasterTransparency * rasterTransparency() const
virtual QString name() const =0
Return a provider name.
double y() const
Get the y value of the point.
QgsRectangle outputRectangle() 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)
Sixty four bit floating point (double)
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.
QStringList createOptions() const
virtual int capabilities() const
Returns a bitmask containing the supported capabilities.
double percentTransparent
double width() const
Width of the rectangle.
~QgsRasterLayerSaveAsDialog()
bool endsWith(const QString &s, Qt::CaseSensitivity cs) const
double xResolution() const
A class to represent a point.
QList< QgsRasterTransparency::TransparentSingleValuePixel > transparentSingleValuePixelList() const
Accessor for transparentSingleValuePixelList.
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)
int maximumTileSizeX() const
QVariant value(const QString &key, const QVariant &defaultValue) const
QString absolutePath() const
QStringList entryList(QFlags< QDir::Filter > filters, QFlags< QDir::SortFlag > sort) const
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)
QString outputFormat() const
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.
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)
virtual int xSize() const
Get raster size.
QgsRasterRangeList noData() const
double x() const
Get the x value of the point.
double height() const
Height of the rectangle.
void setContentsMargins(int left, int top, int right, int bottom)
Base class for raster data providers.