QgsRasterRenderer* QgsSingleBandGrayRendererWidget::renderer() { if ( !mRasterLayer ) { return 0; } QgsRasterDataProvider* provider = mRasterLayer->dataProvider(); if ( !provider ) { return 0; } int band = mGrayBandComboBox->itemData( mGrayBandComboBox->currentIndex() ).toInt(); QgsContrastEnhancement* e = new QgsContrastEnhancement(( QgsContrastEnhancement::QgsRasterDataType )( provider->dataType( band ) ) ); e->setMinimumValue( mMinLineEdit->text().toDouble() ); e->setMaximumValue( mMaxLineEdit->text().toDouble() ); e->setContrastEnhancementAlgorithm(( QgsContrastEnhancement::ContrastEnhancementAlgorithm )( mContrastEnhancementComboBox->itemData( mContrastEnhancementComboBox->currentIndex() ).toInt() ) ); QgsSingleBandGrayRenderer* renderer = new QgsSingleBandGrayRenderer( provider, band ); renderer->setContrastEnhancement( e ); return renderer; }
void QgsZonalStatisticsDialog::insertAvailableLayers() { //insert available raster layers //enter available layers into the combo box QMap<QString, QgsMapLayer*> mapLayers = QgsMapLayerRegistry::instance()->mapLayers(); QMap<QString, QgsMapLayer*>::iterator layer_it = mapLayers.begin(); for ( ; layer_it != mapLayers.end(); ++layer_it ) { QgsRasterLayer* rl = dynamic_cast<QgsRasterLayer*>( layer_it.value() ); if ( rl ) { QgsRasterDataProvider* rp = rl->dataProvider(); if ( rp && rp->name() == "gdal" ) { mRasterLayerComboBox->addItem( rl->name(), QVariant( rl->id() ) ); } } else { QgsVectorLayer* vl = dynamic_cast<QgsVectorLayer*>( layer_it.value() ); if ( vl && vl->geometryType() == QGis::Polygon ) { QgsVectorDataProvider* provider = vl->dataProvider(); if ( provider->capabilities() & QgsVectorDataProvider::AddAttributes ) { mPolygonLayerComboBox->addItem( vl->name(), QVariant( vl->id() ) ); } } } } }
QgsSingleBandPseudoColorRendererWidget::QgsSingleBandPseudoColorRendererWidget( QgsRasterLayer* layer, const QgsRectangle &extent ): QgsRasterRendererWidget( layer, extent ) { setupUi( this ); mColorRampComboBox->populate( QgsStyleV2::defaultStyle() ); if ( !mRasterLayer ) { return; } QgsRasterDataProvider* provider = mRasterLayer->dataProvider(); if ( !provider ) { return; } //fill available bands into combo box int nBands = provider->bandCount(); for ( int i = 1; i <= nBands; ++i ) //band numbering seem to start at 1 { mBandComboBox->addItem( displayBandName( i ), i ); } mColorInterpolationComboBox->addItem( tr( "Discrete" ), 0 ); mColorInterpolationComboBox->addItem( tr( "Linear" ), 1 ); mColorInterpolationComboBox->addItem( tr( "Exact" ), 2 ); mClassificationModeComboBox->addItem( tr( "Equal interval" ) ); //quantile would be nice as well setFromRenderer( layer->renderer() ); }
QgsMultiBandColorRendererWidget::QgsMultiBandColorRendererWidget( QgsRasterLayer* layer, const QgsRectangle &extent ) : QgsRasterRendererWidget( layer, extent ) , mMinMaxWidget( nullptr ) { setupUi( this ); createValidators(); if ( mRasterLayer ) { QgsRasterDataProvider* provider = mRasterLayer->dataProvider(); if ( !provider ) { return; } mMinMaxWidget = new QgsRasterMinMaxWidget( layer, this ); mMinMaxWidget->setExtent( extent ); layout()->addWidget( mMinMaxWidget ); connect( mMinMaxWidget, SIGNAL( load( int, double, double, int ) ), this, SLOT( loadMinMax( int, double, double, int ) ) ); connect( mRedBandComboBox, SIGNAL( currentIndexChanged( int ) ), this, SLOT( onBandChanged( int ) ) ); connect( mGreenBandComboBox, SIGNAL( currentIndexChanged( int ) ), this, SLOT( onBandChanged( int ) ) ); connect( mBlueBandComboBox, SIGNAL( currentIndexChanged( int ) ), this, SLOT( onBandChanged( int ) ) ); //fill available bands into combo boxes mRedBandComboBox->addItem( tr( "Not set" ), -1 ); mGreenBandComboBox->addItem( tr( "Not set" ), -1 ); mBlueBandComboBox->addItem( tr( "Not set" ), -1 ); //contrast enhancement algorithms mContrastEnhancementAlgorithmComboBox->addItem( tr( "No enhancement" ), 0 ); mContrastEnhancementAlgorithmComboBox->addItem( tr( "Stretch to MinMax" ), 1 ); mContrastEnhancementAlgorithmComboBox->addItem( tr( "Stretch and clip to MinMax" ), 2 ); mContrastEnhancementAlgorithmComboBox->addItem( tr( "Clip to MinMax" ), 3 ); int nBands = provider->bandCount(); for ( int i = 1; i <= nBands; ++i ) //band numbering seem to start at 1 { QString bandName = displayBandName( i ); mRedBandComboBox->addItem( bandName, i ); mGreenBandComboBox->addItem( bandName, i ); mBlueBandComboBox->addItem( bandName, i ); } setFromRenderer( mRasterLayer->renderer() ); onBandChanged( 0 ); // reset mMinMaxWidget bands connect( mRedMinLineEdit, SIGNAL( textChanged( QString ) ), this, SIGNAL( widgetChanged() ) ); connect( mRedMaxLineEdit, SIGNAL( textChanged( QString ) ), this, SIGNAL( widgetChanged() ) ); connect( mGreenMaxLineEdit, SIGNAL( textChanged( QString ) ), this, SIGNAL( widgetChanged() ) ); connect( mGreenMinLineEdit, SIGNAL( textChanged( QString ) ), this, SIGNAL( widgetChanged() ) ); connect( mBlueMaxLineEdit, SIGNAL( textChanged( QString ) ), this, SIGNAL( widgetChanged() ) ); connect( mBlueMinLineEdit, SIGNAL( textChanged( QString ) ), this, SIGNAL( widgetChanged() ) ); } }
QImage QgsWmsLegendNode::getLegendGraphic() const { if ( ! mValid && ! mFetcher ) { // or maybe in presence of a downloader we should just delete it // and start a new one ? QgsRasterLayer *layer = qobject_cast<QgsRasterLayer *>( mLayerNode->layer() ); const QgsLayerTreeModel *mod = model(); if ( ! mod ) return mImage; const QgsMapSettings *ms = mod->legendFilterMapSettings(); QgsRasterDataProvider *prov = layer->dataProvider(); if ( ! prov ) return mImage; Q_ASSERT( ! mFetcher ); mFetcher.reset( prov->getLegendGraphicFetcher( ms ) ); if ( mFetcher ) { connect( mFetcher.get(), &QgsImageFetcher::finish, this, &QgsWmsLegendNode::getLegendGraphicFinished ); connect( mFetcher.get(), &QgsImageFetcher::error, this, &QgsWmsLegendNode::getLegendGraphicErrored ); connect( mFetcher.get(), &QgsImageFetcher::progress, this, &QgsWmsLegendNode::getLegendGraphicProgress ); mFetcher->start(); } // else QgsDebugMsg("XXX No legend supported?"); } return mImage; }
QgsRasterRenderer *QgsSingleBandGrayRendererWidget::renderer() { if ( !mRasterLayer ) { return nullptr; } QgsRasterDataProvider *provider = mRasterLayer->dataProvider(); if ( !provider ) { return nullptr; } int band = mGrayBandComboBox->currentBand(); QgsContrastEnhancement *e = new QgsContrastEnhancement( ( Qgis::DataType )( provider->dataType( band ) ) ); e->setMinimumValue( mMinLineEdit->text().toDouble() ); e->setMaximumValue( mMaxLineEdit->text().toDouble() ); e->setContrastEnhancementAlgorithm( ( QgsContrastEnhancement::ContrastEnhancementAlgorithm )( mContrastEnhancementComboBox->currentData().toInt() ) ); QgsSingleBandGrayRenderer *renderer = new QgsSingleBandGrayRenderer( provider, band ); renderer->setContrastEnhancement( e ); renderer->setGradient( ( QgsSingleBandGrayRenderer::Gradient ) mGradientComboBox->currentData().toInt() ); renderer->setMinMaxOrigin( mMinMaxWidget->minMaxOrigin() ); return renderer; }
QgsSingleBandGrayRendererWidget::QgsSingleBandGrayRendererWidget( QgsRasterLayer* layer ): QgsRasterRendererWidget( layer ) { setupUi( this ); mMinLineEdit->setValidator( new QDoubleValidator( mMinLineEdit ) ); mMaxLineEdit->setValidator( new QDoubleValidator( mMaxLineEdit ) ); if ( mRasterLayer ) { QgsRasterDataProvider* provider = mRasterLayer->dataProvider(); if ( !provider ) { return; } //fill available bands into combo box int nBands = provider->bandCount(); for ( int i = 1; i <= nBands; ++i ) //band numbering seem to start at 1 { mGrayBandComboBox->addItem( displayBandName( i ), i ); } //contrast enhancement algorithms mContrastEnhancementComboBox->addItem( tr( "No enhancement" ), 0 ); mContrastEnhancementComboBox->addItem( tr( "Stretch to MinMax" ), 1 ); mContrastEnhancementComboBox->addItem( tr( "Stretch and clip to MinMax" ), 2 ); mContrastEnhancementComboBox->addItem( tr( "Clip to MinMax" ), 3 ); setFromRenderer( layer->renderer() ); } }
const QImage& QgsWMSLegendNode::getLegendGraphic() const { if ( ! mValid && ! mFetcher ) { // or maybe in presence of a downloader we should just delete it // and start a new one ? QgsRasterLayer* layer = qobject_cast<QgsRasterLayer*>( mLayerNode->layer() ); const QgsLayerTreeModel* mod = model(); if ( ! mod ) return mImage; const QgsMapSettings* ms = mod->legendFilterByMap(); QgsRasterDataProvider* prov = layer->dataProvider(); Q_ASSERT( ! mFetcher ); mFetcher.reset( prov->getLegendGraphicFetcher( ms ) ); if ( mFetcher ) { connect( mFetcher.data(), SIGNAL( finish( const QImage& ) ), this, SLOT( getLegendGraphicFinished( const QImage& ) ) ); connect( mFetcher.data(), SIGNAL( error( const QString& ) ), this, SLOT( getLegendGraphicErrored( const QString& ) ) ); connect( mFetcher.data(), SIGNAL( progress( qint64, qint64 ) ), this, SLOT( getLegendGraphicProgress( qint64, qint64 ) ) ); mFetcher->start(); } // else QgsDebugMsg("XXX No legend supported ?"); }
bool QgsMapToolIdentify::identifyRasterLayer( QgsRasterLayer *layer, int x, int y ) { bool res = true; if ( !layer ) return false; QgsRasterDataProvider *dprovider = layer->dataProvider(); if ( dprovider && ( dprovider->capabilities() & QgsRasterDataProvider::Identify ) == 0 ) return false; QMap< QString, QString > attributes, derivedAttributes; QgsPoint idPoint = mCanvas->getCoordinateTransform()->toMapCoordinates( x, y ); idPoint = toLayerCoordinates( layer, idPoint ); QString type; if ( layer->providerType() == "wms" ) { type = tr( "WMS layer" ); //if WMS layer does not cover the view origin, //we need to map the view pixel coordinates //to WMS layer pixel coordinates QgsRectangle viewExtent = mCanvas->extent(); QgsRectangle layerExtent = layer->extent(); double mapUnitsPerPixel = mCanvas->mapUnitsPerPixel(); if ( mapUnitsPerPixel > 0 && viewExtent.intersects( layerExtent ) ) { double xMinView = viewExtent.xMinimum(); double yMaxView = viewExtent.yMaximum(); double xMinLayer = layerExtent.xMinimum(); double yMaxLayer = layerExtent.yMaximum(); idPoint.set( xMinView < xMinLayer ? floor( x - ( xMinLayer - xMinView ) / mapUnitsPerPixel ) : x, yMaxView > yMaxLayer ? floor( y - ( yMaxView - yMaxLayer ) / mapUnitsPerPixel ) : y ); attributes.insert( tr( "Feature info" ), layer->identifyAsHtml( idPoint ) ); } else { res = false; } } else { type = tr( "Raster" ); res = layer->extent().contains( idPoint ) && layer->identify( idPoint, attributes ); } if ( res ) { derivedAttributes.insert( tr( "(clicked coordinate)" ), idPoint.toString() ); results()->addFeature( layer, type, attributes, derivedAttributes ); } return res; }
void QgsRasterTransparencyWidget::setTransparencyCell( int row, int column, double value ) { QgsDebugMsg( QStringLiteral( "value = %1" ).arg( value, 0, 'g', 17 ) ); QgsRasterDataProvider *provider = mRasterLayer->dataProvider(); if ( !provider ) return; QgsRasterRenderer *renderer = mRasterLayer->renderer(); if ( !renderer ) return; int nBands = renderer->usesBands().size(); QLineEdit *lineEdit = new QLineEdit(); lineEdit->setFrame( false ); // frame looks bad in table // Without margins row selection is not displayed (important for delete row) lineEdit->setContentsMargins( 1, 1, 1, 1 ); if ( column == tableTransparency->columnCount() - 1 ) { // transparency // Who needs transparency as floating point? lineEdit->setValidator( new QIntValidator( nullptr ) ); lineEdit->setText( QString::number( static_cast<int>( value ) ) ); } else { // value QString valueString; switch ( provider->sourceDataType( 1 ) ) { case Qgis::Float32: case Qgis::Float64: lineEdit->setValidator( new QDoubleValidator( nullptr ) ); if ( !std::isnan( value ) ) { valueString = QgsRasterBlock::printValue( value ); } break; default: lineEdit->setValidator( new QIntValidator( nullptr ) ); if ( !std::isnan( value ) ) { valueString = QString::number( static_cast<int>( value ) ); } break; } lineEdit->setText( valueString ); connect( lineEdit, &QLineEdit::textEdited, this, &QgsPanelWidget::widgetChanged ); } tableTransparency->setCellWidget( row, column, lineEdit ); adjustTransparencyCellWidth( row, column ); if ( nBands == 1 && ( column == 0 || column == 1 ) ) { connect( lineEdit, &QLineEdit::textEdited, this, &QgsRasterTransparencyWidget::transparencyCellTextEdited ); } tableTransparency->resizeColumnsToContents(); emit widgetChanged(); }
QgsSingleBandGrayRendererWidget::QgsSingleBandGrayRendererWidget( QgsRasterLayer* layer, const QgsRectangle &extent ) : QgsRasterRendererWidget( layer, extent ) , mMinMaxWidget( nullptr ) , mDisableMinMaxWidgetRefresh( false ) { setupUi( this ); mGradientComboBox->insertItem( 0, tr( "Black to white" ), QgsSingleBandGrayRenderer::BlackToWhite ); mGradientComboBox->insertItem( 1, tr( "White to black" ), QgsSingleBandGrayRenderer::WhiteToBlack ); mMinLineEdit->setValidator( new QDoubleValidator( mMinLineEdit ) ); mMaxLineEdit->setValidator( new QDoubleValidator( mMaxLineEdit ) ); if ( mRasterLayer ) { QgsRasterDataProvider* provider = mRasterLayer->dataProvider(); if ( !provider ) { return; } mMinMaxWidget = new QgsRasterMinMaxWidget( layer, this ); mMinMaxWidget->setExtent( extent ); mMinMaxWidget->setMapCanvas( mCanvas ); QHBoxLayout *layout = new QHBoxLayout(); layout->setContentsMargins( 0, 0, 0, 0 ); mMinMaxContainerWidget->setLayout( layout ); layout->addWidget( mMinMaxWidget ); connect( mMinMaxWidget, &QgsRasterMinMaxWidget::widgetChanged, this, &QgsSingleBandGrayRendererWidget::widgetChanged ); connect( mMinMaxWidget, &QgsRasterMinMaxWidget::load, this, &QgsSingleBandGrayRendererWidget::loadMinMax ); //fill available bands into combo box int nBands = provider->bandCount(); for ( int i = 1; i <= nBands; ++i ) //band numbering seem to start at 1 { mGrayBandComboBox->addItem( displayBandName( i ), i ); } //contrast enhancement algorithms mContrastEnhancementComboBox->addItem( tr( "No enhancement" ), QgsContrastEnhancement::NoEnhancement ); mContrastEnhancementComboBox->addItem( tr( "Stretch to MinMax" ), QgsContrastEnhancement::StretchToMinimumMaximum ); mContrastEnhancementComboBox->addItem( tr( "Stretch and clip to MinMax" ), QgsContrastEnhancement::StretchAndClipToMinimumMaximum ); mContrastEnhancementComboBox->addItem( tr( "Clip to MinMax" ), QgsContrastEnhancement::ClipToMinimumMaximum ); setFromRenderer( layer->renderer() ); connect( mGradientComboBox, SIGNAL( currentIndexChanged( int ) ), this, SIGNAL( widgetChanged() ) ); connect( mContrastEnhancementComboBox, SIGNAL( currentIndexChanged( int ) ), this, SIGNAL( widgetChanged() ) ); } }
QgsSingleBandPseudoColorRendererWidget::QgsSingleBandPseudoColorRendererWidget( QgsRasterLayer* layer, const QgsRectangle &extent ): QgsRasterRendererWidget( layer, extent ) { setupUi( this ); mColormapTreeWidget->setColumnWidth( 1, 50 ); mColorRampComboBox->populate( QgsStyleV2::defaultStyle() ); if ( !mRasterLayer ) { return; } QgsRasterDataProvider* provider = mRasterLayer->dataProvider(); if ( !provider ) { return; } // Must be before adding items to mBandComboBox (signal) mMinLineEdit->setValidator( new QDoubleValidator( mMinLineEdit ) ); mMaxLineEdit->setValidator( new QDoubleValidator( mMaxLineEdit ) ); mMinMaxWidget = new QgsRasterMinMaxWidget( layer, this ); mMinMaxWidget->setExtent( extent ); QHBoxLayout *layout = new QHBoxLayout(); layout->setContentsMargins( 0, 0, 0, 0 ); mMinMaxContainerWidget->setLayout( layout ); layout->addWidget( mMinMaxWidget ); connect( mMinMaxWidget, SIGNAL( load( int, double, double, int ) ), this, SLOT( loadMinMax( int, double, double, int ) ) ); //fill available bands into combo box int nBands = provider->bandCount(); for ( int i = 1; i <= nBands; ++i ) //band numbering seem to start at 1 { mBandComboBox->addItem( displayBandName( i ), i ); } mColorInterpolationComboBox->addItem( tr( "Discrete" ), 0 ); mColorInterpolationComboBox->addItem( tr( "Linear" ), 1 ); mColorInterpolationComboBox->addItem( tr( "Exact" ), 2 ); mColorInterpolationComboBox->setCurrentIndex( 1 ); mClassificationModeComboBox->addItem( tr( "Equal interval" ) ); //quantile would be nice as well mNumberOfEntriesSpinBox->setValue( 5 ); // some default setFromRenderer( layer->renderer() ); }
void QgsRasterTransparencyWidget::syncToLayer() { if ( ! mRasterLayer->isValid() ) return; QgsRasterDataProvider *provider = mRasterLayer->dataProvider(); QgsRasterRenderer *renderer = mRasterLayer->renderer(); if ( provider ) { if ( provider->dataType( 1 ) == Qgis::ARGB32 || provider->dataType( 1 ) == Qgis::ARGB32_Premultiplied ) { gboxNoDataValue->setEnabled( false ); gboxCustomTransparency->setEnabled( false ); } cboxTransparencyBand->setShowNotSetOption( true, tr( "None" ) ); cboxTransparencyBand->setLayer( mRasterLayer ); mOpacityWidget->setOpacity( renderer->opacity() ); cboxTransparencyBand->setBand( renderer->alphaBand() ); } if ( mRasterLayer->dataProvider()->sourceHasNoDataValue( 1 ) ) { lblSrcNoDataValue->setText( QgsRasterBlock::printValue( mRasterLayer->dataProvider()->sourceNoDataValue( 1 ) ) ); } else { lblSrcNoDataValue->setText( tr( "not defined" ) ); } mSrcNoDataValueCheckBox->setChecked( mRasterLayer->dataProvider()->useSourceNoDataValue( 1 ) ); bool enableSrcNoData = mRasterLayer->dataProvider()->sourceHasNoDataValue( 1 ) && !std::isnan( mRasterLayer->dataProvider()->sourceNoDataValue( 1 ) ); mSrcNoDataValueCheckBox->setEnabled( enableSrcNoData ); lblSrcNoDataValue->setEnabled( enableSrcNoData ); QgsRasterRangeList noDataRangeList = mRasterLayer->dataProvider()->userNoDataValues( 1 ); QgsDebugMsg( QStringLiteral( "noDataRangeList.size = %1" ).arg( noDataRangeList.size() ) ); if ( !noDataRangeList.isEmpty() ) { leNoDataValue->insert( QgsRasterBlock::printValue( noDataRangeList.value( 0 ).min() ) ); } else { leNoDataValue->insert( QString() ); } populateTransparencyTable( mRasterLayer->renderer() ); }
void QgsPalettedRendererWidget::loadFromLayer() { //read default palette settings from layer QgsRasterDataProvider *provider = mRasterLayer->dataProvider(); if ( provider ) { QList<QgsColorRampShader::ColorRampItem> table = provider->colorTable( mBandComboBox->currentBand() ); if ( !table.isEmpty() ) { QgsPalettedRasterRenderer::ClassData classes = QgsPalettedRasterRenderer::colorTableToClassData( provider->colorTable( mBandComboBox->currentBand() ) ); mModel->setClassData( classes ); emit widgetChanged(); } } }
void QgsSingleBandGrayRendererWidget::on_mLoadPushButton_clicked() { if ( !mRasterLayer ) { return; } QgsRasterDataProvider* provider = mRasterLayer->dataProvider(); if ( !provider ) { return; } int band = mGrayBandComboBox->itemData( mGrayBandComboBox->currentIndex() ).toInt(); double minVal = 0; double maxVal = 0; if ( mEstimateRadioButton->isChecked() ) { minVal = provider->minimumValue( band ); maxVal = provider->maximumValue( band ); } else if ( mActualRadioButton->isChecked() ) { QgsRasterBandStats rasterBandStats = mRasterLayer->bandStatistics( band ); minVal = rasterBandStats.minimumValue; maxVal = rasterBandStats.maximumValue; } else if ( mCurrentExtentRadioButton->isChecked() ) { double minMax[2]; mRasterLayer->computeMinimumMaximumFromLastExtent( band, minMax ); minVal = minMax[0]; maxVal = minMax[1]; } else if ( mUseStdDevRadioButton->isChecked() ) { QgsRasterBandStats rasterBandStats = mRasterLayer->bandStatistics( band ); double diff = mStdDevSpinBox->value() * rasterBandStats.stdDev; minVal = rasterBandStats.mean - diff; maxVal = rasterBandStats.mean + diff; } else { return; } mMinLineEdit->setText( QString::number( minVal ) ); mMaxLineEdit->setText( QString::number( maxVal ) ); }
QgsRasterIterator::QgsRasterIterator( QgsRasterInterface *input ) : mInput( input ) , mFeedback( nullptr ) , mMaximumTileWidth( DEFAULT_MAXIMUM_TILE_WIDTH ) , mMaximumTileHeight( DEFAULT_MAXIMUM_TILE_HEIGHT ) { for ( QgsRasterInterface *ri = input; ri; ri = ri->input() ) { QgsRasterDataProvider *rdp = dynamic_cast<QgsRasterDataProvider *>( ri ); if ( rdp ) { mMaximumTileWidth = rdp->stepWidth(); mMaximumTileHeight = rdp->stepHeight(); break; } } }
QgsHillshadeRendererWidget::QgsHillshadeRendererWidget( QgsRasterLayer *layer, const QgsRectangle &extent ) : QgsRasterRendererWidget( layer, extent ) { setupUi( this ); mLightAngle->setMaximum( 90 ); mLightAzimuth->setMaximum( 360.00 ); mLightAngle->setValue( 45.00 ); mLightAngle->setClearValue( 45.0 ); mLightAzimuth->setValue( 315.00 ); mLightAzimuth->setClearValue( 315.00 ); // Update the dial correctly on_mLightAzimuth_updated( 315.00 ); mZFactor->setValue( 1 ); mZFactor->setClearValue( 1 ); mMultiDirection->setChecked( false ); if ( mRasterLayer ) { QgsRasterDataProvider* provider = mRasterLayer->dataProvider(); if ( !provider ) { return; } //fill available bands into combo box int nBands = provider->bandCount(); for ( int i = 1; i <= nBands; ++i ) //band numbering seem to start at 1 { mBandsCombo->addItem( displayBandName( i ), i ); } } setFromRenderer( layer->renderer() ); connect( mLightAngle, SIGNAL( valueChanged( double ) ), this, SIGNAL( widgetChanged() ) ); connect( mLightAzimuth, SIGNAL( valueChanged( double ) ), this, SLOT( on_mLightAzimuth_updated( double ) ) ); connect( mLightAzimuthDial, SIGNAL( valueChanged( int ) ), this, SLOT( on_mLightAzimuthDail_updated( int ) ) ); connect( mZFactor, SIGNAL( valueChanged( double ) ), this, SIGNAL( widgetChanged() ) ); connect( mMultiDirection, SIGNAL( toggled( bool ) ), this, SIGNAL( widgetChanged() ) ); }
void QgsMultiBandColorRendererWidget::loadMinMaxValueForBand( int band, QLineEdit* minEdit, QLineEdit* maxEdit ) { if ( !minEdit || !maxEdit || !mRasterLayer ) { return; } QgsRasterDataProvider* provider = mRasterLayer->dataProvider(); if ( !provider ) { return; } if ( band < 0 ) { minEdit->clear(); maxEdit->clear(); return; } double minVal = 0; double maxVal = 0; if ( mEstimateRadioButton->isChecked() ) { minVal = provider->minimumValue( band ); maxVal = provider->maximumValue( band ); } else if ( mActualRadioButton->isChecked() ) { QgsRasterBandStats rasterBandStats = mRasterLayer->bandStatistics( band ); minVal = rasterBandStats.minimumValue; maxVal = rasterBandStats.maximumValue; } else if ( mCurrentExtentRadioButton->isChecked() ) { double minMax[2]; mRasterLayer->computeMinimumMaximumFromLastExtent( band, minMax ); minVal = minMax[0]; maxVal = minMax[1]; } minEdit->setText( QString::number( minVal ) ); maxEdit->setText( QString::number( maxVal ) ); }
int QgsGrassGisLib::G_get_cellhd( const char *name, const char *mapset, struct Cell_head *cellhd ) { Q_UNUSED( mapset ); initCellHead( cellhd ); Raster rast = raster( name ); QgsRasterDataProvider *provider = rast.provider; cellhd->rows = provider->ySize(); cellhd->cols = provider->xSize(); cellhd->ew_res = provider->extent().width() / provider->xSize(); cellhd->ns_res = provider->extent().height() / provider->ySize(); cellhd->north = provider->extent().yMaximum(); cellhd->south = provider->extent().yMinimum(); cellhd->east = provider->extent().yMaximum(); cellhd->west = provider->extent().xMinimum(); return 0; }
QgsPalettedRendererWidget::QgsPalettedRendererWidget( QgsRasterLayer* layer, const QgsRectangle &extent ): QgsRasterRendererWidget( layer, extent ) { setupUi( this ); if ( mRasterLayer ) { QgsRasterDataProvider* provider = mRasterLayer->dataProvider(); if ( !provider ) { return; } //fill available bands into combo box int nBands = provider->bandCount(); for ( int i = 1; i <= nBands; ++i ) //band numbering seem to start at 1 { mBandComboBox->addItem( displayBandName( i ), i ); } setFromRenderer( mRasterLayer->renderer() ); connect( mBandComboBox, SIGNAL( currentIndexChanged( int ) ), this, SIGNAL( widgetChanged() ) ); } }
QgsSingleBandGrayRendererWidget::QgsSingleBandGrayRendererWidget( QgsRasterLayer* layer, const QgsRectangle &extent ): QgsRasterRendererWidget( layer, extent ) { setupUi( this ); mMinLineEdit->setValidator( new QDoubleValidator( mMinLineEdit ) ); mMaxLineEdit->setValidator( new QDoubleValidator( mMaxLineEdit ) ); if ( mRasterLayer ) { QgsRasterDataProvider* provider = mRasterLayer->dataProvider(); if ( !provider ) { return; } mMinMaxWidget = new QgsRasterMinMaxWidget( layer, this ); mMinMaxWidget->setExtent( extent ); layout()->addWidget( mMinMaxWidget ); connect( mMinMaxWidget, SIGNAL( load( int, double, double ) ), this, SLOT( loadMinMax( int, double, double ) ) ); //fill available bands into combo box int nBands = provider->bandCount(); for ( int i = 1; i <= nBands; ++i ) //band numbering seem to start at 1 { mGrayBandComboBox->addItem( displayBandName( i ), i ); } //contrast enhancement algorithms mContrastEnhancementComboBox->addItem( tr( "No enhancement" ), 0 ); mContrastEnhancementComboBox->addItem( tr( "Stretch to MinMax" ), 1 ); mContrastEnhancementComboBox->addItem( tr( "Stretch and clip to MinMax" ), 2 ); mContrastEnhancementComboBox->addItem( tr( "Clip to MinMax" ), 3 ); setFromRenderer( layer->renderer() ); } }
void QgsPalettedRendererWidget::setFromRenderer( const QgsRasterRenderer* r ) { const QgsPalettedRasterRenderer* pr = dynamic_cast<const QgsPalettedRasterRenderer*>( r ); if ( pr ) { //read values and colors and fill into tree widget int nColors = pr->nColors(); QColor* colors = pr->colors(); for ( int i = 0; i < nColors; ++i ) { QTreeWidgetItem* item = new QTreeWidgetItem( mTreeWidget ); item->setText( 0, QString::number( i ) ); item->setBackground( 1, QBrush( colors[i] ) ); item->setText( 2, pr->label( i ) ); } delete[] colors; } else { //read default palette settings from layer QgsRasterDataProvider *provider = mRasterLayer->dataProvider(); if ( provider ) { QList<QgsColorRampShader::ColorRampItem> itemList = provider->colorTable( mBandComboBox->itemData( mBandComboBox->currentIndex() ).toInt() ); QList<QgsColorRampShader::ColorRampItem>::const_iterator itemIt = itemList.constBegin(); int index = 0; for ( ; itemIt != itemList.constEnd(); ++itemIt ) { QTreeWidgetItem* item = new QTreeWidgetItem( mTreeWidget ); item->setText( 0, QString::number( index ) ); item->setBackground( 1, QBrush( itemIt->color ) ); item->setText( 2, itemIt->label ); ++index; } } } }
QgsMultiBandColorRendererWidget::QgsMultiBandColorRendererWidget( QgsRasterLayer* layer ): QgsRasterRendererWidget( layer ) { setupUi( this ); createValidators(); if ( mRasterLayer ) { QgsRasterDataProvider* provider = mRasterLayer->dataProvider(); if ( !provider ) { return; } //fill available bands into combo boxes mRedBandComboBox->addItem( tr( "Not set" ), -1 ); mGreenBandComboBox->addItem( tr( "Not set" ), -1 ); mBlueBandComboBox->addItem( tr( "Not set" ), -1 ); //contrast enhancement algorithms mContrastEnhancementAlgorithmComboBox->addItem( tr( "No enhancement" ), 0 ); mContrastEnhancementAlgorithmComboBox->addItem( tr( "Stretch to MinMax" ), 1 ); mContrastEnhancementAlgorithmComboBox->addItem( tr( "Stretch and clip to MinMax" ), 2 ); mContrastEnhancementAlgorithmComboBox->addItem( tr( "Clip to MinMax" ), 3 ); int nBands = provider->bandCount(); for ( int i = 1; i <= nBands; ++i ) //band numbering seem to start at 1 { QString bandName = displayBandName( i ); mRedBandComboBox->addItem( bandName, i ); mGreenBandComboBox->addItem( bandName, i ); mBlueBandComboBox->addItem( bandName, i ); } setFromRenderer( mRasterLayer->renderer() ); } }
ProjectorData::ProjectorData( const QgsRectangle &extent, int width, int height, QgsRasterInterface *input, const QgsCoordinateTransform &inverseCt, QgsRasterProjector::Precision precision ) : mApproximate( false ) , mInverseCt( inverseCt ) , mDestExtent( extent ) , mDestRows( height ) , mDestCols( width ) , mDestXRes( 0.0 ) , mDestYRes( 0.0 ) , mSrcRows( 0 ) , mSrcCols( 0 ) , mSrcXRes( 0.0 ) , mSrcYRes( 0.0 ) , mDestRowsPerMatrixRow( 0.0 ) , mDestColsPerMatrixCol( 0.0 ) , mHelperTopRow( 0 ) , mCPCols( 0 ) , mCPRows( 0 ) , mSqrTolerance( 0.0 ) , mMaxSrcXRes( 0 ) , mMaxSrcYRes( 0 ) { QgsDebugMsgLevel( QStringLiteral( "Entered" ), 4 ); // Get max source resolution and extent if possible if ( input ) { QgsRasterDataProvider *provider = dynamic_cast<QgsRasterDataProvider *>( input->sourceInput() ); if ( provider ) { if ( provider->capabilities() & QgsRasterDataProvider::Size ) { mMaxSrcXRes = provider->extent().width() / provider->xSize(); mMaxSrcYRes = provider->extent().height() / provider->ySize(); } // Get source extent if ( mExtent.isEmpty() ) { mExtent = provider->extent(); } } } mDestXRes = mDestExtent.width() / ( mDestCols ); mDestYRes = mDestExtent.height() / ( mDestRows ); // Calculate tolerance // TODO: Think it over better // Note: we are checking on matrix each even point, that means that the real error // in that moment is approximately half size double myDestRes = mDestXRes < mDestYRes ? mDestXRes : mDestYRes; mSqrTolerance = myDestRes * myDestRes; if ( precision == QgsRasterProjector::Approximate ) { mApproximate = true; } else { mApproximate = false; } // Always try to calculate mCPMatrix, it is used in calcSrcExtent() for both Approximate and Exact // Initialize the matrix by corners and middle points mCPCols = mCPRows = 3; for ( int i = 0; i < mCPRows; i++ ) { QList<QgsPointXY> myRow; myRow.append( QgsPointXY() ); myRow.append( QgsPointXY() ); myRow.append( QgsPointXY() ); mCPMatrix.insert( i, myRow ); // And the legal points QList<bool> myLegalRow; myLegalRow.append( bool( false ) ); myLegalRow.append( bool( false ) ); myLegalRow.append( bool( false ) ); mCPLegalMatrix.insert( i, myLegalRow ); } for ( int i = 0; i < mCPRows; i++ ) { calcRow( i, inverseCt ); } while ( true ) { bool myColsOK = checkCols( inverseCt ); if ( !myColsOK ) { insertRows( inverseCt ); } bool myRowsOK = checkRows( inverseCt ); if ( !myRowsOK ) { insertCols( inverseCt ); } if ( myColsOK && myRowsOK ) { QgsDebugMsgLevel( QStringLiteral( "CP matrix within tolerance" ), 4 ); break; } // What is the maximum reasonable size of transformatio matrix? // TODO: consider better when to break - ratio if ( mCPRows * mCPCols > 0.25 * mDestRows * mDestCols ) //if ( mCPRows * mCPCols > mDestRows * mDestCols ) { QgsDebugMsgLevel( QStringLiteral( "Too large CP matrix" ), 4 ); mApproximate = false; break; } } QgsDebugMsgLevel( QStringLiteral( "CPMatrix size: mCPRows = %1 mCPCols = %2" ).arg( mCPRows ).arg( mCPCols ), 4 ); mDestRowsPerMatrixRow = static_cast< float >( mDestRows ) / ( mCPRows - 1 ); mDestColsPerMatrixCol = static_cast< float >( mDestCols ) / ( mCPCols - 1 ); QgsDebugMsgLevel( QStringLiteral( "CPMatrix:" ), 5 ); QgsDebugMsgLevel( cpToString(), 5 ); // init helper points pHelperTop = new QgsPointXY[mDestCols]; pHelperBottom = new QgsPointXY[mDestCols]; calcHelper( 0, pHelperTop ); calcHelper( 1, pHelperBottom ); mHelperTopRow = 0; // Calculate source dimensions calcSrcExtent(); calcSrcRowsCols(); mSrcYRes = mSrcExtent.height() / mSrcRows; mSrcXRes = mSrcExtent.width() / mSrcCols; }
QgsRasterBlock* QgsRasterResampleFilter::block2( int bandNo, QgsRectangle const & extent, int width, int height, QgsRasterBlockFeedback *feedback ) { Q_UNUSED( bandNo ); QgsDebugMsg( QString( "width = %1 height = %2 extent = %3" ).arg( width ).arg( height ).arg( extent.toString() ) ); QgsRasterBlock *outputBlock = new QgsRasterBlock(); if ( !mInput ) return outputBlock; double oversampling = 1.0; // approximate global oversampling factor if ( mZoomedInResampler || mZoomedOutResampler ) { QgsRasterDataProvider *provider = dynamic_cast<QgsRasterDataProvider*>( mInput->srcInput() ); if ( provider && ( provider->capabilities() & QgsRasterDataProvider::Size ) ) { double xRes = extent.width() / width; double providerXRes = provider->extent().width() / provider->xSize(); double pixelRatio = xRes / providerXRes; oversampling = ( pixelRatio > mMaxOversampling ) ? mMaxOversampling : pixelRatio; QgsDebugMsg( QString( "xRes = %1 providerXRes = %2 pixelRatio = %3 oversampling = %4" ).arg( xRes ).arg( providerXRes ).arg( pixelRatio ).arg( oversampling ) ); } else { // We don't know exact data source resolution (WMS) so we expect that // server data have higher resolution (which is not always true) and use // mMaxOversampling oversampling = mMaxOversampling; } } QgsDebugMsg( QString( "oversampling %1" ).arg( oversampling ) ); int bandNumber = 1; // Do no oversampling if no resampler for zoomed in / zoomed out (nearest neighbour) // We do mZoomedInResampler if oversampling == 1 (otherwise for example reprojected // zoom in rasters are never resampled because projector limits resolution. if ((( oversampling < 1.0 || qgsDoubleNear( oversampling, 1.0 ) ) && !mZoomedInResampler ) || ( oversampling > 1.0 && !mZoomedOutResampler ) ) { QgsDebugMsg( "No oversampling." ); delete outputBlock; return mInput->block2( bandNumber, extent, width, height, feedback ); } //effective oversampling factors are different to global one because of rounding double oversamplingX = (( double )width * oversampling ) / width; double oversamplingY = (( double )height * oversampling ) / height; // TODO: we must also increase the extent to get correct result on borders of parts int resWidth = width * oversamplingX; int resHeight = height * oversamplingY; QgsRasterBlock *inputBlock = mInput->block2( bandNumber, extent, resWidth, resHeight, feedback ); if ( !inputBlock || inputBlock->isEmpty() ) { QgsDebugMsg( "No raster data!" ); delete inputBlock; return outputBlock; } if ( !outputBlock->reset( QGis::ARGB32_Premultiplied, width, height ) ) { delete inputBlock; return outputBlock; } //resample image QImage img = inputBlock->image(); QImage dstImg = QImage( width, height, QImage::Format_ARGB32_Premultiplied ); if ( mZoomedInResampler && ( oversamplingX < 1.0 || qgsDoubleNear( oversampling, 1.0 ) ) ) { QgsDebugMsg( "zoomed in resampling" ); mZoomedInResampler->resample( img, dstImg ); } else if ( mZoomedOutResampler && oversamplingX > 1.0 ) { QgsDebugMsg( "zoomed out resampling" ); mZoomedOutResampler->resample( img, dstImg ); } else { // Should not happen QgsDebugMsg( "Unexpected resampling" ); dstImg = img.scaled( width, height ); } outputBlock->setImage( &dstImg ); delete inputBlock; return outputBlock; // No resampling }
QgsRasterBlock * QgsRasterResampleFilter::block( int bandNo, QgsRectangle const & extent, int width, int height ) { Q_UNUSED( bandNo ); QgsDebugMsg( "Entered" ); QgsRasterBlock *outputBlock = new QgsRasterBlock(); if ( !mInput ) return outputBlock; double oversampling = 1.0; // approximate global oversampling factor if ( mZoomedInResampler || mZoomedOutResampler ) { QgsRasterDataProvider *provider = dynamic_cast<QgsRasterDataProvider*>( mInput->srcInput() ); // Do not oversample if data source does not have fixed resolution (WMS) if ( provider && ( provider->capabilities() & QgsRasterDataProvider::ExactResolution ) ) { double xRes = extent.width() / width; double providerXRes = provider->extent().width() / provider->xSize(); double pixelRatio = xRes / providerXRes; oversampling = ( pixelRatio > mMaxOversampling ) ? mMaxOversampling : pixelRatio; QgsDebugMsg( QString( "xRes = %1 providerXRes = %2 pixelRatio = %3 oversampling = %4" ).arg( xRes ).arg( providerXRes ).arg( pixelRatio ).arg( oversampling ) ); } } //set oversampling back to 1.0 if no resampler for zoomed in / zoomed out (nearest neighbour) if (( oversampling < 1.0 && !mZoomedInResampler ) || ( oversampling > 1.0 && !mZoomedOutResampler ) ) { oversampling = 1.0; } QgsDebugMsg( QString( "oversampling %1" ).arg( oversampling ) ); //effective oversampling factors are different to global one because of rounding double oversamplingX = (( double )width * oversampling ) / width; double oversamplingY = (( double )height * oversampling ) / height; // TODO: we must also increase the extent to get correct result on borders of parts int resWidth = width * oversamplingX; int resHeight = height * oversamplingY; // At moment we know that we read rendered image int bandNumber = 1; //void *rasterData = mInput->block( bandNumber, extent, resWidth, resHeight ); QgsRasterBlock *inputBlock = mInput->block( bandNumber, extent, resWidth, resHeight ); if ( !inputBlock || inputBlock->isEmpty() ) { QgsDebugMsg( "No raster data!" ); delete inputBlock; return outputBlock; } if ( doubleNear( oversamplingX, 1.0 ) || doubleNear( oversamplingY, 1.0 ) ) { QgsDebugMsg( "No oversampling." ); delete outputBlock; return inputBlock; } if ( !outputBlock->reset( QgsRasterBlock::ARGB32_Premultiplied, width, height ) ) { delete inputBlock; return outputBlock; } //resample image QImage img = inputBlock->image(); QImage dstImg = QImage( width, height, QImage::Format_ARGB32_Premultiplied ); if ( mZoomedInResampler && oversamplingX < 1.0 ) { QgsDebugMsg( "zoomed in resampling" ); mZoomedInResampler->resample( img, dstImg ); } else if ( mZoomedOutResampler && oversamplingX > 1.0 ) { QgsDebugMsg( "zoomed out resampling" ); mZoomedOutResampler->resample( img, dstImg ); } else { // Should not happen QgsDebugMsg( "Unexpected resampling" ); dstImg = img.scaled( width, height ); } outputBlock->setImage( &dstImg ); delete inputBlock; return outputBlock; // No resampling }
QgsSingleBandPseudoColorRendererWidget::QgsSingleBandPseudoColorRendererWidget( QgsRasterLayer* layer, const QgsRectangle &extent ) : QgsRasterRendererWidget( layer, extent ) , mMinMaxWidget( nullptr ) , mMinMaxOrigin( 0 ) { QSettings settings; setupUi( this ); mColormapTreeWidget->setColumnWidth( ColorColumn, 50 ); QString defaultPalette = settings.value( "/Raster/defaultPalette", "Spectral" ).toString(); mColorRampComboBox->populate( QgsStyle::defaultStyle() ); QgsDebugMsg( "defaultPalette = " + defaultPalette ); mColorRampComboBox->setCurrentIndex( mColorRampComboBox->findText( defaultPalette ) ); connect( mButtonEditRamp, SIGNAL( clicked() ), mColorRampComboBox, SLOT( editSourceRamp() ) ); if ( !mRasterLayer ) { return; } QgsRasterDataProvider* provider = mRasterLayer->dataProvider(); if ( !provider ) { return; } // Must be before adding items to mBandComboBox (signal) mMinLineEdit->setValidator( new QDoubleValidator( mMinLineEdit ) ); mMaxLineEdit->setValidator( new QDoubleValidator( mMaxLineEdit ) ); mMinMaxWidget = new QgsRasterMinMaxWidget( layer, this ); mMinMaxWidget->setExtent( extent ); mMinMaxWidget->setMapCanvas( mCanvas ); QHBoxLayout *layout = new QHBoxLayout(); layout->setContentsMargins( 0, 0, 0, 0 ); mMinMaxContainerWidget->setLayout( layout ); layout->addWidget( mMinMaxWidget ); connect( mMinMaxWidget, SIGNAL( load( int, double, double, int ) ), this, SLOT( loadMinMax( int, double, double, int ) ) ); //fill available bands into combo box int nBands = provider->bandCount(); for ( int i = 1; i <= nBands; ++i ) //band numbering seem to start at 1 { mBandComboBox->addItem( displayBandName( i ), i ); } mColorInterpolationComboBox->addItem( tr( "Discrete" ), QgsColorRampShader::DISCRETE ); mColorInterpolationComboBox->addItem( tr( "Linear" ), QgsColorRampShader::INTERPOLATED ); mColorInterpolationComboBox->addItem( tr( "Exact" ), QgsColorRampShader::EXACT ); mColorInterpolationComboBox->setCurrentIndex( mColorInterpolationComboBox->findData( QgsColorRampShader::INTERPOLATED ) ); mClassificationModeComboBox->addItem( tr( "Continuous" ), Continuous ); mClassificationModeComboBox->addItem( tr( "Equal interval" ), EqualInterval ); mClassificationModeComboBox->addItem( tr( "Quantile" ), Quantile ); mNumberOfEntriesSpinBox->setValue( 5 ); // some default setFromRenderer( layer->renderer() ); // If there is currently no min/max, load default with user current default options if ( mMinLineEdit->text().isEmpty() || mMaxLineEdit->text().isEmpty() ) { mMinMaxWidget->load(); } on_mClassificationModeComboBox_currentIndexChanged( 0 ); resetClassifyButton(); connect( mClassificationModeComboBox, SIGNAL( currentIndexChanged( int ) ), this, SLOT( on_mClassifyButton_clicked() ) ); connect( mMinLineEdit, SIGNAL( textChanged( QString ) ), this, SLOT( on_mClassifyButton_clicked() ) ); connect( mMaxLineEdit, SIGNAL( textChanged( QString ) ), this, SLOT( on_mClassifyButton_clicked() ) ); connect( mColorRampComboBox, SIGNAL( sourceRampEdited() ), this, SLOT( on_mClassifyButton_clicked() ) ); connect( mColorRampComboBox, SIGNAL( currentIndexChanged( int ) ), this, SLOT( on_mClassifyButton_clicked() ) ); connect( mInvertCheckBox, SIGNAL( stateChanged( int ) ), this, SLOT( on_mClassifyButton_clicked() ) ); connect( mNumberOfEntriesSpinBox, SIGNAL( valueChanged( int ) ), this, SLOT( on_mClassifyButton_clicked() ) ); connect( mBandComboBox, SIGNAL( currentIndexChanged( int ) ), this, SLOT( on_mClassifyButton_clicked() ) ); connect( mClipCheckBox, SIGNAL( toggled( bool ) ), this, SIGNAL( widgetChanged() ) ); }
bool QgsRasterChecker::runTest( QString theVerifiedKey, QString theVerifiedUri, QString theExpectedKey, QString theExpectedUri ) { bool ok = true; mReport += "\n\n"; //QgsRasterDataProvider* verifiedProvider = QgsRasterLayer::loadProvider( theVerifiedKey, theVerifiedUri ); QgsRasterDataProvider* verifiedProvider = ( QgsRasterDataProvider* ) QgsProviderRegistry::instance()->provider( theVerifiedKey, theVerifiedUri ); if ( !verifiedProvider || !verifiedProvider->isValid() ) { error( QString( "Cannot load provider %1 with URI: %2" ).arg( theVerifiedKey ).arg( theVerifiedUri ), mReport ); ok = false; } //QgsRasterDataProvider* expectedProvider = QgsRasterLayer::loadProvider( theExpectedKey, theExpectedUri ); QgsRasterDataProvider* expectedProvider = ( QgsRasterDataProvider* ) QgsProviderRegistry::instance()->provider( theExpectedKey, theExpectedUri ); if ( !expectedProvider || !expectedProvider->isValid() ) { error( QString( "Cannot load provider %1 with URI: %2" ).arg( theExpectedKey ).arg( theExpectedUri ), mReport ); ok = false; } if ( !ok ) return false; mReport += QString( "Verified URI: %1<br>" ).arg( theVerifiedUri.replace( "&", "&" ) ); mReport += QString( "Expected URI: %1<br>" ).arg( theExpectedUri.replace( "&", "&" ) ); mReport += "<br>"; mReport += QString( "<table style='%1'>\n" ).arg( mTabStyle ); mReport += compareHead(); compare( "Band count", verifiedProvider->bandCount(), expectedProvider->bandCount(), mReport, ok ); compare( "Width", verifiedProvider->xSize(), expectedProvider->xSize(), mReport, ok ); compare( "Height", verifiedProvider->ySize(), expectedProvider->ySize(), mReport, ok ); compareRow( "Extent", verifiedProvider->extent().toString(), expectedProvider->extent().toString(), mReport, verifiedProvider->extent() == expectedProvider->extent() ); if ( verifiedProvider->extent() != expectedProvider->extent() ) ok = false; mReport += "</table>\n"; if ( !ok ) return false; bool allOk = true; for ( int band = 1; band <= expectedProvider->bandCount(); band++ ) { bool bandOk = true; mReport += QString( "<h3>Band %1</h3>\n" ).arg( band ); mReport += QString( "<table style='%1'>\n" ).arg( mTabStyle ); mReport += compareHead(); // Data types may differ (?) bool typesOk = true; compare( "Source data type", verifiedProvider->srcDataType( band ), expectedProvider->srcDataType( band ), mReport, typesOk ); compare( "Data type", verifiedProvider->dataType( band ), expectedProvider->dataType( band ), mReport, typesOk ) ; // TODO: not yet sure if noDataValue() should exist at all //compare( "No data (NULL) value", verifiedProvider->noDataValue( band ), expectedProvider->noDataValue( band ), mReport, typesOk ); bool statsOk = true; QgsRasterBandStats verifiedStats = verifiedProvider->bandStatistics( band ); QgsRasterBandStats expectedStats = expectedProvider->bandStatistics( band ); // Min/max may 'slightly' differ, for big numbers however, the difference may // be quite big, for example for Float32 with max -3.332e+38, the difference is 1.47338e+24 double tol = tolerance( expectedStats.minimumValue ); compare( "Minimum value", verifiedStats.minimumValue, expectedStats.minimumValue, mReport, statsOk, tol ); tol = tolerance( expectedStats.maximumValue ); compare( "Maximum value", verifiedStats.maximumValue, expectedStats.maximumValue, mReport, statsOk, tol ); // TODO: enable once fixed (WCS excludes nulls but GDAL does not) //compare( "Cells count", verifiedStats.elementCount, expectedStats.elementCount, mReport, statsOk ); tol = tolerance( expectedStats.mean ); compare( "Mean", verifiedStats.mean, expectedStats.mean, mReport, statsOk, tol ); // stdDev usually differ significantly tol = tolerance( expectedStats.stdDev, 1 ); compare( "Standard deviation", verifiedStats.stdDev, expectedStats.stdDev, mReport, statsOk, tol ); mReport += "</table>"; mReport += "<br>"; if ( !bandOk ) { allOk = false; continue; } if ( !statsOk || !typesOk ) { allOk = false; // create values table anyway so that values are available } mReport += "<table><tr>"; mReport += "<td>Data comparison</td>"; mReport += QString( "<td style='%1 %2 border: 1px solid'>correct value</td>" ).arg( mCellStyle ).arg( mOkStyle ); mReport += "<td></td>"; mReport += QString( "<td style='%1 %2 border: 1px solid'>wrong value<br>expected value</td></tr>" ).arg( mCellStyle ).arg( mErrStyle ); mReport += "</tr></table>"; mReport += "<br>"; int width = expectedProvider->xSize(); int height = expectedProvider->ySize(); QgsRasterBlock *expectedBlock = expectedProvider->block( band, expectedProvider->extent(), width, height ); QgsRasterBlock *verifiedBlock = verifiedProvider->block( band, expectedProvider->extent(), width, height ); if ( !expectedBlock || !expectedBlock->isValid() || !verifiedBlock || !verifiedBlock->isValid() ) { allOk = false; mReport += "cannot read raster block"; continue; } // compare data values QString htmlTable = QString( "<table style='%1'>" ).arg( mTabStyle ); for ( int row = 0; row < height; row ++ ) { htmlTable += "<tr>"; for ( int col = 0; col < width; col ++ ) { bool cellOk = true; double verifiedVal = verifiedBlock->value( row, col ); double expectedVal = expectedBlock->value( row, col ); QString valStr; if ( compare( verifiedVal, expectedVal, 0 ) ) { valStr = QString( "%1" ).arg( verifiedVal ); } else { cellOk = false; allOk = false; valStr = QString( "%1<br>%2" ).arg( verifiedVal ).arg( expectedVal ); } htmlTable += QString( "<td style='%1 %2'>%3</td>" ).arg( mCellStyle ).arg( cellOk ? mOkStyle : mErrStyle ).arg( valStr ); } htmlTable += "</tr>"; } htmlTable += "</table>"; mReport += htmlTable; delete expectedBlock; delete verifiedBlock; } delete verifiedProvider; delete expectedProvider; return allOk; }
bool QgsMapToolIdentify::identifyRasterLayer( QList<IdentifyResult> *results, QgsRasterLayer *layer, QgsPoint point, const QgsRectangle& viewExtent, double mapUnitsPerPixel ) { QgsDebugMsg( "point = " + point.toString() ); if ( !layer ) return false; QgsRasterDataProvider *dprovider = layer->dataProvider(); if ( !dprovider ) return false; int capabilities = dprovider->capabilities(); if ( !( capabilities & QgsRasterDataProvider::Identify ) ) return false; QgsPoint pointInCanvasCrs = point; try { point = toLayerCoordinates( layer, point ); } catch ( QgsCsException &cse ) { Q_UNUSED( cse ); QgsDebugMsg( QString( "coordinate not reprojectable: %1" ).arg( cse.what() ) ); return false; } QgsDebugMsg( QString( "point = %1 %2" ).arg( point.x() ).arg( point.y() ) ); if ( !layer->extent().contains( point ) ) return false; QMap< QString, QString > attributes, derivedAttributes; QgsRaster::IdentifyFormat format = QgsRasterDataProvider::identifyFormatFromName( layer->customProperty( "identify/format" ).toString() ); // check if the format is really supported otherwise use first supported format if ( !( QgsRasterDataProvider::identifyFormatToCapability( format ) & capabilities ) ) { if ( capabilities & QgsRasterInterface::IdentifyFeature ) format = QgsRaster::IdentifyFormatFeature; else if ( capabilities & QgsRasterInterface::IdentifyValue ) format = QgsRaster::IdentifyFormatValue; else if ( capabilities & QgsRasterInterface::IdentifyHtml ) format = QgsRaster::IdentifyFormatHtml; else if ( capabilities & QgsRasterInterface::IdentifyText ) format = QgsRaster::IdentifyFormatText; else return false; } QgsRasterIdentifyResult identifyResult; // We can only use current map canvas context (extent, width, height) if layer is not reprojected, if ( mCanvas->hasCrsTransformEnabled() && dprovider->crs() != mCanvas->mapSettings().destinationCrs() ) { // To get some reasonable response for point/line WMS vector layers we must // use a context with approximately a resolution in layer CRS units // corresponding to current map canvas resolution (for examplei UMN Mapserver // in msWMSFeatureInfo() -> msQueryByRect() is using requested pixel // + TOLERANCE (layer param) for feature selection) // QgsRectangle r; r.setXMinimum( pointInCanvasCrs.x() - mapUnitsPerPixel / 2. ); r.setXMaximum( pointInCanvasCrs.x() + mapUnitsPerPixel / 2. ); r.setYMinimum( pointInCanvasCrs.y() - mapUnitsPerPixel / 2. ); r.setYMaximum( pointInCanvasCrs.y() + mapUnitsPerPixel / 2. ); r = toLayerCoordinates( layer, r ); // will be a bit larger // Mapserver (6.0.3, for example) does not work with 1x1 pixel box // but that is fixed (the rect is enlarged) in the WMS provider identifyResult = dprovider->identify( point, format, r, 1, 1 ); } else { // It would be nice to use the same extent and size which was used for drawing, // so that WCS can use cache from last draw, unfortunately QgsRasterLayer::draw() // is doing some tricks with extent and size to allign raster to output which // would be difficult to replicate here. // Note: cutting the extent may result in slightly different x and y resolutions // and thus shifted point calculated back in QGIS WMS (using average resolution) //viewExtent = dprovider->extent().intersect( &viewExtent ); // Width and height are calculated from not projected extent and we hope that // are similar to source width and height used to reproject layer for drawing. // TODO: may be very dangerous, because it may result in different resolutions // in source CRS, and WMS server (QGIS server) calcs wrong coor using average resolution. int width = qRound( viewExtent.width() / mapUnitsPerPixel ); int height = qRound( viewExtent.height() / mapUnitsPerPixel ); QgsDebugMsg( QString( "viewExtent.width = %1 viewExtent.height = %2" ).arg( viewExtent.width() ).arg( viewExtent.height() ) ); QgsDebugMsg( QString( "width = %1 height = %2" ).arg( width ).arg( height ) ); QgsDebugMsg( QString( "xRes = %1 yRes = %2 mapUnitsPerPixel = %3" ).arg( viewExtent.width() / width ).arg( viewExtent.height() / height ).arg( mapUnitsPerPixel ) ); identifyResult = dprovider->identify( point, format, viewExtent, width, height ); } derivedAttributes.insert( tr( "(clicked coordinate)" ), point.toString() ); if ( identifyResult.isValid() ) { QMap<int, QVariant> values = identifyResult.results(); QgsGeometry geometry; if ( format == QgsRaster::IdentifyFormatValue ) { Q_FOREACH ( int bandNo, values.keys() ) { QString valueString; if ( values.value( bandNo ).isNull() ) { valueString = tr( "no data" ); } else { double value = values.value( bandNo ).toDouble(); valueString = QgsRasterBlock::printValue( value ); } attributes.insert( dprovider->generateBandName( bandNo ), valueString ); } QString label = layer->name(); results->append( IdentifyResult( qobject_cast<QgsMapLayer *>( layer ), label, attributes, derivedAttributes ) ); }
void QgsRasterProjector::calc() { QgsDebugMsg( "Entered" ); mCPMatrix.clear(); mCPLegalMatrix.clear(); delete[] pHelperTop; pHelperTop = 0; delete[] pHelperBottom; pHelperBottom = 0; // Get max source resolution and extent if possible mMaxSrcXRes = 0; mMaxSrcYRes = 0; if ( mInput ) { QgsRasterDataProvider *provider = dynamic_cast<QgsRasterDataProvider*>( mInput->srcInput() ); if ( provider && ( provider->capabilities() & QgsRasterDataProvider::Size ) ) { mMaxSrcXRes = provider->extent().width() / provider->xSize(); mMaxSrcYRes = provider->extent().height() / provider->ySize(); } // Get source extent if ( mExtent.isEmpty() ) { mExtent = provider->extent(); } } mDestXRes = mDestExtent.width() / ( mDestCols ); mDestYRes = mDestExtent.height() / ( mDestRows ); // Calculate tolerance // TODO: Think it over better // Note: we are checking on matrix each even point, that means that the real error // in that moment is approximately half size double myDestRes = mDestXRes < mDestYRes ? mDestXRes : mDestYRes; mSqrTolerance = myDestRes * myDestRes; const QgsCoordinateTransform* ct = QgsCoordinateTransformCache::instance()->transform( mDestCRS.authid(), mSrcCRS.authid(), mDestDatumTransform, mSrcDatumTransform ); // Initialize the matrix by corners and middle points mCPCols = mCPRows = 3; for ( int i = 0; i < mCPRows; i++ ) { QList<QgsPoint> myRow; myRow.append( QgsPoint() ); myRow.append( QgsPoint() ); myRow.append( QgsPoint() ); mCPMatrix.insert( i, myRow ); // And the legal points QList<bool> myLegalRow; myLegalRow.append( bool( false ) ); myLegalRow.append( bool( false ) ); myLegalRow.append( bool( false ) ); mCPLegalMatrix.insert( i, myLegalRow ); } for ( int i = 0; i < mCPRows; i++ ) { calcRow( i, ct ); } while ( true ) { bool myColsOK = checkCols( ct ); if ( !myColsOK ) { insertRows( ct ); } bool myRowsOK = checkRows( ct ); if ( !myRowsOK ) { insertCols( ct ); } if ( myColsOK && myRowsOK ) { QgsDebugMsg( "CP matrix within tolerance" ); mApproximate = true; break; } // What is the maximum reasonable size of transformatio matrix? // TODO: consider better when to break - ratio if ( mCPRows * mCPCols > 0.25 * mDestRows * mDestCols ) { QgsDebugMsg( "Too large CP matrix" ); mApproximate = false; break; } } QgsDebugMsg( QString( "CPMatrix size: mCPRows = %1 mCPCols = %2" ).arg( mCPRows ).arg( mCPCols ) ); mDestRowsPerMatrixRow = ( float )mDestRows / ( mCPRows - 1 ); mDestColsPerMatrixCol = ( float )mDestCols / ( mCPCols - 1 ); QgsDebugMsgLevel( "CPMatrix:", 5 ); QgsDebugMsgLevel( cpToString(), 5 ); // Calculate source dimensions calcSrcExtent(); calcSrcRowsCols(); mSrcYRes = mSrcExtent.height() / mSrcRows; mSrcXRes = mSrcExtent.width() / mSrcCols; // init helper points pHelperTop = new QgsPoint[mDestCols]; pHelperBottom = new QgsPoint[mDestCols]; calcHelper( 0, pHelperTop ); calcHelper( 1, pHelperBottom ); mHelperTopRow = 0; }