24 #include <QFileDialog> 25 #include <QMessageBox> 31 QWidget* parent, Qt::WindowFlags f ) :
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" ) ) );
46 mNoDataTableWidget->setHorizontalHeaderItem( 1,
new QTableWidgetItem(
tr(
"To" ) ) );
48 on_mRawModeRadioButton_toggled(
true );
52 toggleResolutionSize();
55 QStringList myFormats;
57 foreach ( QString myFormat, myFormats )
59 mFormatComboBox->addItem( myFormat );
67 setOriginalResolution();
68 int xSize = mDataProvider->
xSize();
69 int ySize = mDataProvider->
ySize();
70 mMaximumSizeXLineEdit->setText( QString::number( xSize ) );
71 mMaximumSizeYLineEdit->setText( QString::number( ySize ) );
75 mTileModeCheckBox->setChecked(
true );
76 mMaximumSizeXLineEdit->setText( QString::number( 2000 ) );
77 mMaximumSizeYLineEdit->setText( QString::number( 2000 ) );
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 );
122 mCrsSelector->setCrs( mCurrentCrs );
124 this, SLOT( crsChanged() ) );
126 QPushButton* okButton = mButtonBox->button( QDialogButtonBox::Ok );
129 okButton->setEnabled(
false );
132 mExtentGroupBox->setOutputCrs(
outputCrs() );
133 mExtentGroupBox->setOriginalExtent( mDataProvider->
extent(), mLayerCrs );
134 mExtentGroupBox->setCurrentExtent( mCurrentExtent, mCurrentCrs );
135 mExtentGroupBox->setOutputExtentFromOriginal();
136 connect( mExtentGroupBox, SIGNAL( extentChanged(
QgsRectangle ) ),
this, SLOT( extentChanged() ) );
138 recalcResolutionSize();
141 void QgsRasterLayerSaveAsDialog::setValidators()
143 mXResolutionLineEdit->setValidator(
new QDoubleValidator(
this ) );
144 mYResolutionLineEdit->setValidator(
new QDoubleValidator(
this ) );
145 mColumnsLineEdit->setValidator(
new QIntValidator(
this ) );
146 mRowsLineEdit->setValidator(
new QIntValidator(
this ) );
147 mMaximumSizeXLineEdit->setValidator(
new QIntValidator(
this ) );
148 mMaximumSizeYLineEdit->setValidator(
new QIntValidator(
this ) );
155 void QgsRasterLayerSaveAsDialog::on_mBrowseButton_clicked()
160 QString dirName = mSaveAsLineEdit->text().isEmpty() ? settings.value(
"/UI/lastRasterFileDir",
"." ).toString() : mSaveAsLineEdit->text();
162 if ( mTileModeCheckBox->isChecked() )
167 fileName = QFileDialog::getExistingDirectory(
this,
tr(
"Select output directory" ), dirName );
170 if ( fileName.isEmpty() )
break;
173 QDir dir( fileName );
174 QString baseName = QFileInfo( fileName ).baseName();
176 filters << QString(
"%1.*" ).arg( baseName );
177 QStringList files = dir.entryList( filters );
178 if ( !files.isEmpty() )
180 QMessageBox::StandardButton button = QMessageBox::warning(
this,
tr(
"Warning" ),
181 tr(
"The directory %1 contains files which will be overwritten: %2" ).arg( dir.absolutePath() ).arg( files.join(
", " ) ),
182 QMessageBox::Ok | QMessageBox::Cancel );
184 if ( button == QMessageBox::Ok )
201 fileName = QFileDialog::getSaveFileName(
this,
tr(
"Select output file" ), dirName,
tr(
"GeoTIFF" ) +
" (*.tif *.tiff *.TIF *.TIFF)" );
204 if ( !fileName.isEmpty() )
207 if ( !fileName.toLower().endsWith(
".tif" ) && !fileName.toLower().endsWith(
".tiff" ) )
211 mSaveAsLineEdit->setText( fileName );
215 void QgsRasterLayerSaveAsDialog::on_mSaveAsLineEdit_textChanged(
const QString& text )
217 QPushButton* okButton = mButtonBox->button( QDialogButtonBox::Ok );
223 okButton->setEnabled( QFileInfo( text ).absoluteDir().exists() );
227 void QgsRasterLayerSaveAsDialog::on_mFormatComboBox_currentIndexChanged(
const QString & text )
230 if ( mDataProvider && mDataProvider->
name() ==
"gdal" )
232 mCreateOptionsWidget->setFormat( text );
233 mCreateOptionsWidget->update();
239 return mColumnsLineEdit->text().toInt();
244 return mRowsLineEdit->text().toInt();
249 return mXResolutionLineEdit->text().toDouble();
254 return mYResolutionLineEdit->text().toDouble();
259 return mMaximumSizeXLineEdit->text().toInt();
264 return mMaximumSizeYLineEdit->text().toInt();
269 return mTileModeCheckBox->isChecked();
274 return mSaveAsLineEdit->text();
279 return mFormatComboBox->currentText();
284 return mCreateOptionsGroupBox->isChecked() ? mCreateOptionsWidget->options() : QStringList();
289 return mExtentGroupBox->outputExtent();
294 mFormatLabel->hide();
295 mFormatComboBox->hide();
300 mSaveAsLabel->hide();
301 mSaveAsLineEdit->hide();
302 mBrowseButton->hide();
303 QPushButton* okButton = mButtonBox->button( QDialogButtonBox::Ok );
306 okButton->setEnabled(
true );
310 void QgsRasterLayerSaveAsDialog::toggleResolutionSize()
314 bool on = mResolutionRadioButton->isChecked();
315 mXResolutionLineEdit->setEnabled( on );
316 mYResolutionLineEdit->setEnabled( on );
317 mOriginalResolutionPushButton->setEnabled( on && hasResolution );
318 mColumnsLineEdit->setEnabled( !on );
319 mRowsLineEdit->setEnabled( !on );
320 mOriginalSizePushButton->setEnabled( !on && hasResolution );
323 void QgsRasterLayerSaveAsDialog::setOriginalResolution()
335 xRes = yRes = mDataProvider->
extent().
width() / 100;
337 setResolution( xRes, yRes, mLayerCrs );
355 QgsRectangle srcExtent( srsCenter.
x() - xRes / 2, srsCenter.
y() - yRes / 2, srsCenter.
x() + xRes / 2, srsCenter.
y() + yRes / 2 );
358 xRes = extent.width();
359 yRes = extent.height();
361 mXResolutionLineEdit->setText( QString::number( xRes ) );
362 mYResolutionLineEdit->setText( QString::number( yRes ) );
365 void QgsRasterLayerSaveAsDialog::recalcSize()
371 mColumnsLineEdit->setText( QString::number( xSize ) );
372 mRowsLineEdit->setText( QString::number( ySize ) );
373 updateResolutionStateMsg();
376 void QgsRasterLayerSaveAsDialog::setOriginalSize()
378 mColumnsLineEdit->setText( QString::number( mDataProvider->
xSize() ) );
379 mRowsLineEdit->setText( QString::number( mDataProvider->
ySize() ) );
383 void QgsRasterLayerSaveAsDialog::recalcResolution()
389 mXResolutionLineEdit->setText( QString::number( xRes ) );
390 mYResolutionLineEdit->setText( QString::number( yRes ) );
391 updateResolutionStateMsg();
394 void QgsRasterLayerSaveAsDialog::recalcResolutionSize()
397 if ( mResolutionRadioButton->isChecked() )
408 void QgsRasterLayerSaveAsDialog::updateResolutionStateMsg()
411 switch ( mResolutionState )
417 msg =
tr(
"user defined" );
422 msg =
tr(
"Resolution (current: %1)" ).arg( msg );
423 mResolutionGroupBox->setTitle( msg );
426 void QgsRasterLayerSaveAsDialog::extentChanged()
429 if ( mSizeRadioButton->isChecked() )
433 recalcResolutionSize();
436 void QgsRasterLayerSaveAsDialog::crsChanged()
440 mExtentGroupBox->setOutputCrs(
outputCrs() );
448 mExtentGroupBox->setOutputExtentFromOriginal();
452 mExtentGroupBox->setOutputExtentFromCurrent();
456 mExtentGroupBox->setOutputExtentFromUser( mExtentGroupBox->outputExtent(), mPreviousCrs );
460 if ( mResolutionRadioButton->isChecked() )
464 setOriginalResolution();
483 return mCrsSelector->crs();
492 void QgsRasterLayerSaveAsDialog::on_mRawModeRadioButton_toggled(
bool checked )
494 mNoDataGroupBox->setEnabled( checked && mDataProvider->
bandCount() == 1 );
497 void QgsRasterLayerSaveAsDialog::on_mAddNoDataManuallyToolButton_clicked()
499 addNoDataRow( std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN() );
502 void QgsRasterLayerSaveAsDialog::on_mLoadTransparentNoDataToolButton_clicked()
504 if ( !mRasterLayer->
renderer() )
return;
506 if ( !rasterTransparency )
return;
512 addNoDataRow( transparencyPixel.
min, transparencyPixel.
max );
513 if ( transparencyPixel.
min != transparencyPixel.
max )
515 setNoDataToEdited( mNoDataTableWidget->rowCount() - 1 );
521 void QgsRasterLayerSaveAsDialog::on_mRemoveSelectedNoDataToolButton_clicked()
523 mNoDataTableWidget->removeRow( mNoDataTableWidget->currentRow() );
526 void QgsRasterLayerSaveAsDialog::on_mRemoveAllNoDataToolButton_clicked()
528 while ( mNoDataTableWidget->rowCount() > 0 )
530 mNoDataTableWidget->removeRow( 0 );
534 void QgsRasterLayerSaveAsDialog::addNoDataRow(
double min,
double max )
536 mNoDataTableWidget->insertRow( mNoDataTableWidget->rowCount() );
537 for (
int i = 0; i < 2; i++ )
539 double value = i == 0 ?
min :
max;
540 QLineEdit *lineEdit =
new QLineEdit();
541 lineEdit->setFrame(
false );
542 lineEdit->setContentsMargins( 1, 1, 1, 1 );
548 lineEdit->setValidator(
new QDoubleValidator( 0 ) );
549 if ( !qIsNaN( value ) )
555 lineEdit->setValidator(
new QIntValidator( 0 ) );
556 if ( !qIsNaN( value ) )
558 valueString = QString::number( static_cast<int>( value ) );
562 lineEdit->setText( valueString );
563 mNoDataTableWidget->setCellWidget( mNoDataTableWidget->rowCount() - 1, i, lineEdit );
565 adjustNoDataCellWidth( mNoDataTableWidget->rowCount() - 1, i );
567 connect( lineEdit, SIGNAL( textEdited(
const QString & ) ),
this, SLOT( noDataCellTextEdited(
const QString & ) ) );
569 mNoDataTableWidget->resizeColumnsToContents();
570 mNoDataTableWidget->resizeRowsToContents();
573 void QgsRasterLayerSaveAsDialog::noDataCellTextEdited(
const QString & text )
577 QLineEdit *lineEdit =
dynamic_cast<QLineEdit *
>( sender() );
578 if ( !lineEdit )
return;
581 for (
int r = 0 ; r < mNoDataTableWidget->rowCount(); r++ )
583 for (
int c = 0 ; c < mNoDataTableWidget->columnCount(); c++ )
585 if ( mNoDataTableWidget->cellWidget( r, c ) == sender() )
592 if ( row != -1 )
break;
594 QgsDebugMsg( QString(
"row = %1 column =%2" ).arg( row ).arg( column ) );
598 QLineEdit *toLineEdit =
dynamic_cast<QLineEdit *
>( mNoDataTableWidget->cellWidget( row, 1 ) );
599 if ( !toLineEdit )
return;
600 bool toChanged = mNoDataToEdited.value( row );
601 QgsDebugMsg( QString(
"toChanged = %1" ).arg( toChanged ) );
604 toLineEdit->setText( lineEdit->text() );
607 else if ( column == 1 )
609 setNoDataToEdited( row );
613 void QgsRasterLayerSaveAsDialog::on_mTileModeCheckBox_toggled(
bool toggled )
632 mTilesGroupBox->show();
636 mTilesGroupBox->hide();
640 void QgsRasterLayerSaveAsDialog::on_mPyramidsGroupBox_toggled(
bool toggled )
643 populatePyramidsLevels();
646 void QgsRasterLayerSaveAsDialog::populatePyramidsLevels()
650 if ( mPyramidsGroupBox->isChecked() )
652 QList<QgsRasterPyramid> myPyramidList;
655 if ( mPyramidsUseExistingCheckBox->isChecked() )
661 if ( ! mPyramidsOptionsWidget->overviewList().isEmpty() )
662 myPyramidList = mDataProvider->
buildPyramidList( mPyramidsOptionsWidget->overviewList() );
664 QList<QgsRasterPyramid>::iterator myRasterPyramidIterator;
665 for ( myRasterPyramidIterator = myPyramidList.begin();
666 myRasterPyramidIterator != myPyramidList.end();
667 ++myRasterPyramidIterator )
669 if ( ! mPyramidsUseExistingCheckBox->isChecked() || myRasterPyramidIterator->exists )
671 text += QString::number( myRasterPyramidIterator->xDim ) + QString(
"x" ) +
672 QString::number( myRasterPyramidIterator->yDim ) +
" ";
677 mPyramidResolutionsLineEdit->setText( text.trimmed() );
680 void QgsRasterLayerSaveAsDialog::setNoDataToEdited(
int row )
682 if ( row >= mNoDataToEdited.size() )
684 mNoDataToEdited.resize( row + 1 );
686 mNoDataToEdited[row] =
true;
689 double QgsRasterLayerSaveAsDialog::noDataCellValue(
int row,
int column )
const 691 QLineEdit *lineEdit =
dynamic_cast<QLineEdit *
>( mNoDataTableWidget->cellWidget( row, column ) );
692 if ( !lineEdit || lineEdit->text().isEmpty() )
694 std::numeric_limits<double>::quiet_NaN();
696 return lineEdit->text().toDouble();
699 void QgsRasterLayerSaveAsDialog::adjustNoDataCellWidth(
int row,
int column )
701 QLineEdit *lineEdit =
dynamic_cast<QLineEdit *
>( mNoDataTableWidget->cellWidget( row, column ) );
702 if ( !lineEdit )
return;
704 int width = qMax( lineEdit->fontMetrics().width( lineEdit->text() ) + 10, 100 );
705 width = qMax( width, mNoDataTableWidget->columnWidth( column ) );
707 lineEdit->setFixedWidth( width );
713 if ( ! mNoDataGroupBox->isChecked() )
716 for (
int r = 0 ; r < mNoDataTableWidget->rowCount(); r++ )
719 noDataList.append( noData );
727 return mPyramidsGroupBox->isChecked() ? mPyramidsOptionsWidget->overviewList() : QList<int>();
732 if ( ! mPyramidsGroupBox->isChecked() )
734 else if ( mPyramidsUseExistingCheckBox->isChecked() )
740 bool QgsRasterLayerSaveAsDialog::validate()
const 742 if ( mCreateOptionsGroupBox->isChecked() )
744 QString message = mCreateOptionsWidget->validateOptions(
true,
false );
745 if ( !message.isNull() )
748 if ( mPyramidsGroupBox->isChecked() )
750 QString message = mPyramidsOptionsWidget->createOptionsWidget()->validateOptions(
true,
false );
751 if ( !message.isNull() )
virtual int bandCount() const =0
Get number of bands.
QList< QgsRasterTransparency::TransparentSingleValuePixel > transparentSingleValuePixelList() const
Accessor for transparentSingleValuePixelList.
A rectangle specified with double values.
static QString printValue(double value)
Print double value with all necessary significant digits.
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()
QList< int > pyramidsList() const
virtual QString name() const =0
return a provider name
virtual int ySize() const
const QgsRasterTransparency * rasterTransparency() const
QgsRasterLayerSaveAsDialog(QgsRasterLayer *rasterLayer, QgsRasterDataProvider *sourceProvider, const QgsRectangle ¤tExtent, const QgsCoordinateReferenceSystem &layerCrs, const QgsCoordinateReferenceSystem ¤tCrs, QWidget *parent=0, Qt::WindowFlags f=0)
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()
A class to represent a point.
double yResolution() const
virtual int capabilities() const
Returns a bitmask containing the supported capabilities.
virtual QgsRectangle extent() override=0
Get the extent of the data source.
QgsRasterRangeList noData() const
int maximumTileSizeX() const
QList< QgsRasterRange > QgsRasterRangeList
virtual int xSize() const
Get raster size.
Class for storing a coordinate reference system (CRS)
QgsRasterDataProvider * dataProvider()
Returns the data provider.
Defines the list of pixel values to be considered as transparent or semi transparent when rendering r...
QStringList createOptions() const
double width() const
Width of the rectangle.
QgsPoint center() const
Center point of the rectangle.
int maximumTileSizeY() const
double height() const
Height of the rectangle.
QString outputFormat() const
Base class for raster data providers.
QString outputFileName() const