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 );
122 mCrsSelector->setCrs( mCurrentCrs );
124 this, SLOT( crsChanged() ) );
126 QPushButton* okButton = mButtonBox->button( QDialogButtonBox::Ok );
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()
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() )
170 if ( fileName.
isEmpty() )
break;
173 QDir dir( fileName );
181 tr(
"The directory %1 contains files which will be overwritten: %2" ).arg( dir.absolutePath(), files.
join(
", " ) ),
182 QMessageBox::Ok | QMessageBox::Cancel );
184 if ( button == QMessageBox::Ok )
211 mSaveAsLineEdit->setText( fileName );
215 void QgsRasterLayerSaveAsDialog::on_mSaveAsLineEdit_textChanged(
const QString& text )
217 QPushButton* okButton = mButtonBox->button( QDialogButtonBox::Ok );
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 mAddToCanvas->isChecked();
279 return mSaveAsLineEdit->text();
284 return mFormatComboBox->currentText();
289 return mCreateOptionsGroupBox->isChecked() ? mCreateOptionsWidget->options() :
QStringList();
294 return mExtentGroupBox->outputExtent();
299 mFormatLabel->hide();
300 mFormatComboBox->hide();
305 mSaveAsLabel->hide();
306 mSaveAsLineEdit->hide();
307 mBrowseButton->hide();
308 QPushButton* okButton = mButtonBox->button( QDialogButtonBox::Ok );
315 void QgsRasterLayerSaveAsDialog::toggleResolutionSize()
319 bool on = mResolutionRadioButton->isChecked();
320 mXResolutionLineEdit->setEnabled( on );
321 mYResolutionLineEdit->setEnabled( on );
322 mOriginalResolutionPushButton->setEnabled( on && hasResolution );
323 mColumnsLineEdit->setEnabled( !on );
324 mRowsLineEdit->setEnabled( !on );
325 mOriginalSizePushButton->setEnabled( !on && hasResolution );
328 void QgsRasterLayerSaveAsDialog::setOriginalResolution()
340 xRes = yRes = mDataProvider->
extent().
width() / 100;
342 setResolution( xRes, yRes, mLayerCrs );
360 QgsRectangle srcExtent( srsCenter.
x() - xRes / 2, srsCenter.
y() - yRes / 2, srsCenter.
x() + xRes / 2, srsCenter.
y() + yRes / 2 );
363 xRes = extent.
width();
364 yRes = extent.height();
370 void QgsRasterLayerSaveAsDialog::recalcSize()
378 updateResolutionStateMsg();
381 void QgsRasterLayerSaveAsDialog::setOriginalSize()
388 void QgsRasterLayerSaveAsDialog::recalcResolution()
396 updateResolutionStateMsg();
399 void QgsRasterLayerSaveAsDialog::recalcResolutionSize()
402 if ( mResolutionRadioButton->isChecked() )
413 void QgsRasterLayerSaveAsDialog::updateResolutionStateMsg()
416 switch ( mResolutionState )
422 msg =
tr(
"user defined" );
427 msg =
tr(
"Resolution (current: %1)" ).
arg( msg );
428 mResolutionGroupBox->setTitle( msg );
431 void QgsRasterLayerSaveAsDialog::extentChanged()
434 if ( mSizeRadioButton->isChecked() )
438 recalcResolutionSize();
441 void QgsRasterLayerSaveAsDialog::crsChanged()
445 mExtentGroupBox->setOutputCrs(
outputCrs() );
453 mExtentGroupBox->setOutputExtentFromOriginal();
457 mExtentGroupBox->setOutputExtentFromCurrent();
461 mExtentGroupBox->setOutputExtentFromUser( mExtentGroupBox->outputExtent(), mPreviousCrs );
465 if ( mResolutionRadioButton->isChecked() )
469 setOriginalResolution();
488 return mCrsSelector->crs();
497 void QgsRasterLayerSaveAsDialog::on_mRawModeRadioButton_toggled(
bool checked )
499 mNoDataGroupBox->setEnabled( checked && mDataProvider->
bandCount() == 1 );
502 void QgsRasterLayerSaveAsDialog::on_mAddNoDataManuallyToolButton_clicked()
504 addNoDataRow( std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN() );
507 void QgsRasterLayerSaveAsDialog::on_mLoadTransparentNoDataToolButton_clicked()
509 if ( !mRasterLayer->
renderer() )
return;
511 if ( !rasterTransparency )
return;
517 addNoDataRow( transparencyPixel.
min, transparencyPixel.
max );
518 if ( transparencyPixel.
min != transparencyPixel.
max )
520 setNoDataToEdited( mNoDataTableWidget->rowCount() - 1 );
526 void QgsRasterLayerSaveAsDialog::on_mRemoveSelectedNoDataToolButton_clicked()
528 mNoDataTableWidget->removeRow( mNoDataTableWidget->currentRow() );
531 void QgsRasterLayerSaveAsDialog::on_mRemoveAllNoDataToolButton_clicked()
533 while ( mNoDataTableWidget->rowCount() > 0 )
535 mNoDataTableWidget->removeRow( 0 );
539 void QgsRasterLayerSaveAsDialog::addNoDataRow(
double min,
double max )
541 mNoDataTableWidget->insertRow( mNoDataTableWidget->rowCount() );
542 for (
int i = 0; i < 2; i++ )
544 double value = i == 0 ? min :
max;
554 if ( !qIsNaN( value ) )
561 if ( !qIsNaN( value ) )
567 lineEdit->
setText( valueString );
568 mNoDataTableWidget->setCellWidget( mNoDataTableWidget->rowCount() - 1, i, lineEdit );
570 adjustNoDataCellWidth( mNoDataTableWidget->rowCount() - 1, i );
572 connect( lineEdit, SIGNAL( textEdited(
const QString & ) ),
this, SLOT( noDataCellTextEdited(
const QString & ) ) );
574 mNoDataTableWidget->resizeColumnsToContents();
575 mNoDataTableWidget->resizeRowsToContents();
578 void QgsRasterLayerSaveAsDialog::noDataCellTextEdited(
const QString & text )
583 if ( !lineEdit )
return;
586 for (
int r = 0 ; r < mNoDataTableWidget->rowCount(); r++ )
588 for (
int c = 0 ; c < mNoDataTableWidget->columnCount(); c++ )
590 if ( mNoDataTableWidget->cellWidget( r, c ) ==
sender() )
597 if ( row != -1 )
break;
603 QLineEdit *toLineEdit =
dynamic_cast<QLineEdit *
>( mNoDataTableWidget->cellWidget( row, 1 ) );
604 if ( !toLineEdit )
return;
605 bool toChanged = mNoDataToEdited.
value( row );
612 else if ( column == 1 )
614 setNoDataToEdited( row );
618 void QgsRasterLayerSaveAsDialog::on_mTileModeCheckBox_toggled(
bool toggled )
637 mTilesGroupBox->show();
641 mTilesGroupBox->hide();
645 void QgsRasterLayerSaveAsDialog::on_mPyramidsGroupBox_toggled(
bool toggled )
648 populatePyramidsLevels();
651 void QgsRasterLayerSaveAsDialog::populatePyramidsLevels()
655 if ( mPyramidsGroupBox->isChecked() )
660 if ( mPyramidsUseExistingCheckBox->isChecked() )
666 if ( ! mPyramidsOptionsWidget->overviewList().isEmpty() )
667 myPyramidList = mDataProvider->
buildPyramidList( mPyramidsOptionsWidget->overviewList() );
670 for ( myRasterPyramidIterator = myPyramidList.
begin();
671 myRasterPyramidIterator != myPyramidList.
end();
672 ++myRasterPyramidIterator )
674 if ( ! mPyramidsUseExistingCheckBox->isChecked() || myRasterPyramidIterator->exists )
682 mPyramidResolutionsLineEdit->setText( text.
trimmed() );
685 void QgsRasterLayerSaveAsDialog::setNoDataToEdited(
int row )
687 if ( row >= mNoDataToEdited.
size() )
689 mNoDataToEdited.
resize( row + 1 );
691 mNoDataToEdited[row] =
true;
694 double QgsRasterLayerSaveAsDialog::noDataCellValue(
int row,
int column )
const
696 QLineEdit *lineEdit =
dynamic_cast<QLineEdit *
>( mNoDataTableWidget->cellWidget( row, column ) );
697 if ( !lineEdit || lineEdit->
text().isEmpty() )
699 std::numeric_limits<double>::quiet_NaN();
701 return lineEdit->
text().toDouble();
704 void QgsRasterLayerSaveAsDialog::adjustNoDataCellWidth(
int row,
int column )
706 QLineEdit *lineEdit =
dynamic_cast<QLineEdit *
>( mNoDataTableWidget->cellWidget( row, column ) );
707 if ( !lineEdit )
return;
710 width = qMax( width, mNoDataTableWidget->columnWidth( column ) );
718 if ( ! mNoDataGroupBox->isChecked() )
721 int rows = mNoDataTableWidget->rowCount();
723 for (
int r = 0 ; r < rows; r++ )
726 noDataList.
append( noData );
734 return mPyramidsGroupBox->isChecked() ? mPyramidsOptionsWidget->overviewList() :
QList<int>();
739 if ( ! mPyramidsGroupBox->isChecked() )
741 else if ( mPyramidsUseExistingCheckBox->isChecked() )
747 bool QgsRasterLayerSaveAsDialog::validate()
const
749 if ( mCreateOptionsGroupBox->isChecked() )
751 QString message = mCreateOptionsWidget->validateOptions(
true,
false );
755 if ( mPyramidsGroupBox->isChecked() )
757 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.
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.
QgsRasterLayerSaveAsDialog(QgsRasterLayer *rasterLayer, QgsRasterDataProvider *sourceProvider, const QgsRectangle ¤tExtent, const QgsCoordinateReferenceSystem &layerCrs, const QgsCoordinateReferenceSystem ¤tCrs, QWidget *parent=0, const Qt::WindowFlags &f=0)
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