void QgsRasterCalcDialog::insertAvailableRasterBands() { const QMap<QString, QgsMapLayer*>& layers = QgsMapLayerRegistry::instance()->mapLayers(); QMap<QString, QgsMapLayer*>::const_iterator layerIt = layers.constBegin(); bool firstLayer = true; for ( ; layerIt != layers.constEnd(); ++layerIt ) { QgsRasterLayer* rlayer = dynamic_cast<QgsRasterLayer*>( layerIt.value() ); if ( rlayer && rlayer->dataProvider() && rlayer->dataProvider()->name() == "gdal" ) { if ( firstLayer ) //set bounding box / resolution of output to the values of the first possible input layer { mNColumnsSpinBox->setValue( rlayer->width() ); mNRowsSpinBox->setValue( rlayer->height() ); QgsRectangle bbox = rlayer->extent(); mXMinSpinBox->setValue( bbox.xMinimum() ); mXMaxSpinBox->setValue( bbox.xMaximum() ); mYMinSpinBox->setValue( bbox.yMinimum() ); mYMaxSpinBox->setValue( bbox.yMaximum() ); firstLayer = false; } //get number of bands for ( int i = 0; i < rlayer->bandCount(); ++i ) { QgsRasterCalculatorEntry entry; entry.raster = rlayer; entry.bandNumber = i + 1; entry.ref = rlayer->name() + '@' + QString::number( i + 1 ); mAvailableRasterBands.push_back( entry ); mRasterBandsListWidget->addItem( entry.ref ); } } } }
void QgsRasterCalcDialog::on_mCurrentLayerExtentButton_clicked() { QListWidgetItem* currentLayerItem = mRasterBandsListWidget->currentItem(); if ( currentLayerItem ) { QgsRasterLayer* rlayer = nullptr; QList<QgsRasterCalculatorEntry>::const_iterator rasterIt = mAvailableRasterBands.constBegin(); for ( ; rasterIt != mAvailableRasterBands.constEnd(); ++rasterIt ) { if ( rasterIt->ref == currentLayerItem->text() ) { rlayer = rasterIt->raster; } } if ( !rlayer ) { return; } QgsRectangle layerExtent = rlayer->extent(); mXMinSpinBox->setValue( layerExtent.xMinimum() ); mXMaxSpinBox->setValue( layerExtent.xMaximum() ); mYMinSpinBox->setValue( layerExtent.yMinimum() ); mYMaxSpinBox->setValue( layerExtent.yMaximum() ); mNColumnsSpinBox->setValue( rlayer->width() ); mNRowsSpinBox->setValue( rlayer->height() ); mCrsSelector->setCrs( rlayer->crs() ); } }
void QgsRasterCalcDialog::insertAvailableRasterBands() { const QMap<QString, QgsMapLayer *> &layers = QgsProject::instance()->mapLayers(); QMap<QString, QgsMapLayer *>::const_iterator layerIt = layers.constBegin(); for ( ; layerIt != layers.constEnd(); ++layerIt ) { QgsRasterLayer *rlayer = dynamic_cast<QgsRasterLayer *>( layerIt.value() ); if ( rlayer && rlayer->dataProvider() && rlayer->dataProvider()->name() == QLatin1String( "gdal" ) ) { if ( !mExtentSizeSet ) //set bounding box / resolution of output to the values of the first possible input layer { setExtentSize( rlayer->width(), rlayer->height(), rlayer->extent() ); mCrsSelector->setCrs( rlayer->crs() ); } //get number of bands for ( int i = 0; i < rlayer->bandCount(); ++i ) { QgsRasterCalculatorEntry entry; entry.raster = rlayer; entry.bandNumber = i + 1; entry.ref = rlayer->name() + '@' + QString::number( i + 1 ); mAvailableRasterBands.push_back( entry ); mRasterBandsListWidget->addItem( entry.ref ); } } } }
bool QgsDecorationGrid::getIntervalFromCurrentLayer( double* values ) { // get current layer and make sure it is a raster layer and CRSs match QgsMapLayer* layer = QgisApp::instance()->mapCanvas()->currentLayer(); if ( ! layer ) { QMessageBox::warning( nullptr, tr( "Error" ), tr( "No active layer" ) ); return false; } if ( layer->type() != QgsMapLayer::RasterLayer ) { QMessageBox::warning( nullptr, tr( "Error" ), tr( "Please select a raster layer" ) ); return false; } QgsRasterLayer* rlayer = dynamic_cast<QgsRasterLayer*>( layer ); if ( !rlayer || rlayer->width() == 0 || rlayer->height() == 0 ) { QMessageBox::warning( nullptr, tr( "Error" ), tr( "Invalid raster layer" ) ); return false; } QgsCoordinateReferenceSystem layerCRS = layer->crs(); const QgsCoordinateReferenceSystem& mapCRS = QgisApp::instance()->mapCanvas()->mapSettings().destinationCrs(); // is this the best way to compare CRS? should we also make sure map has OTF enabled? // TODO calculate transformed values if necessary if ( layerCRS != mapCRS ) { QMessageBox::warning( nullptr, tr( "Error" ), tr( "Layer CRS must be equal to project CRS" ) ); return false; } // calculate interval // TODO add a function in QgsRasterLayer to get x/y resolution from provider, // because this might not be 100% accurate QgsRectangle extent = rlayer->extent(); values[0] = fabs( extent.xMaximum() - extent.xMinimum() ) / rlayer->width(); values[1] = fabs( extent.yMaximum() - extent.yMinimum() ) / rlayer->height(); // calculate offset - when using very high resolution rasters in geographic CRS // there seems to be a small shift, but this may be due to rendering issues and depends on zoom double ratio = extent.xMinimum() / values[0]; values[2] = ( ratio - floor( ratio ) ) * values[0]; ratio = extent.yMinimum() / values[1]; values[3] = ( ratio - floor( ratio ) ) * values[1]; QgsDebugMsg( QString( "xmax: %1 xmin: %2 width: %3 xInterval: %4 xOffset: %5" ).arg( extent.xMaximum() ).arg( extent.xMinimum() ).arg( rlayer->width() ).arg( values[0] ).arg( values[2] ) ); QgsDebugMsg( QString( "ymax: %1 ymin: %2 height: %3 yInterval: %4 yOffset: %5" ).arg( extent.yMaximum() ).arg( extent.yMinimum() ).arg( rlayer->height() ).arg( values[1] ).arg( values[3] ) ); return true; }
bool QgsReclassifyAlgorithmBase::prepareAlgorithm( const QVariantMap ¶meters, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) { mDataType = QgsRasterAnalysisUtils::rasterTypeChoiceToDataType( parameterAsEnum( parameters, QStringLiteral( "DATA_TYPE" ), context ) ); QgsRasterLayer *layer = parameterAsRasterLayer( parameters, QStringLiteral( "INPUT_RASTER" ), context ); if ( !layer ) throw QgsProcessingException( invalidRasterError( parameters, QStringLiteral( "INPUT_RASTER" ) ) ); mBand = parameterAsInt( parameters, QStringLiteral( "RASTER_BAND" ), context ); if ( mBand < 1 || mBand > layer->bandCount() ) throw QgsProcessingException( QObject::tr( "Invalid band number for RASTER_BAND (%1): Valid values for input raster are 1 to %2" ).arg( mBand ) .arg( layer->bandCount() ) ); mInterface.reset( layer->dataProvider()->clone() ); mExtent = layer->extent(); mCrs = layer->crs(); mRasterUnitsPerPixelX = std::abs( layer->rasterUnitsPerPixelX() ); mRasterUnitsPerPixelY = std::abs( layer->rasterUnitsPerPixelY() ); mNbCellsXProvider = mInterface->xSize(); mNbCellsYProvider = mInterface->ySize(); mNoDataValue = parameterAsDouble( parameters, QStringLiteral( "NO_DATA" ), context ); mUseNoDataForMissingValues = parameterAsBool( parameters, QStringLiteral( "NODATA_FOR_MISSING" ), context ); int boundsType = parameterAsEnum( parameters, QStringLiteral( "RANGE_BOUNDARIES" ), context ); switch ( boundsType ) { case 0: mBoundsType = QgsReclassifyUtils::RasterClass::IncludeMax; break; case 1: mBoundsType = QgsReclassifyUtils::RasterClass::IncludeMin; break; case 2: mBoundsType = QgsReclassifyUtils::RasterClass::IncludeMinAndMax; break; case 3: mBoundsType = QgsReclassifyUtils::RasterClass::Exclusive; break; } return _prepareAlgorithm( parameters, context, feedback ); }
bool QgsZonalHistogramAlgorithm::prepareAlgorithm( const QVariantMap ¶meters, QgsProcessingContext &context, QgsProcessingFeedback * ) { QgsRasterLayer *layer = parameterAsRasterLayer( parameters, QStringLiteral( "INPUT_RASTER" ), context ); if ( !layer ) throw QgsProcessingException( invalidRasterError( parameters, QStringLiteral( "INPUT_RASTER" ) ) ); mRasterBand = parameterAsInt( parameters, QStringLiteral( "RASTER_BAND" ), context ); mHasNoDataValue = layer->dataProvider()->sourceHasNoDataValue( mRasterBand ); mNodataValue = layer->dataProvider()->sourceNoDataValue( mRasterBand ); mRasterInterface.reset( layer->dataProvider()->clone() ); mRasterExtent = layer->extent(); mCrs = layer->crs(); mCellSizeX = std::abs( layer->rasterUnitsPerPixelX() ); mCellSizeY = std::abs( layer->rasterUnitsPerPixelX() ); mNbCellsXProvider = mRasterInterface->xSize(); mNbCellsYProvider = mRasterInterface->ySize(); return true; }
void QgsRasterCalcDialog::insertAvailableRasterBands() { mAvailableRasterBands = QgsRasterCalculatorEntry::rasterEntries().toList(); mRasterBandsListWidget->clear(); for ( const auto &entry : qgis::as_const( mAvailableRasterBands ) ) { QgsRasterLayer *rlayer = entry.raster; if ( rlayer && rlayer->dataProvider() && rlayer->dataProvider()->name() == QLatin1String( "gdal" ) ) { if ( !mExtentSizeSet ) //set bounding box / resolution of output to the values of the first possible input layer { setExtentSize( rlayer->width(), rlayer->height(), rlayer->extent() ); mCrsSelector->setCrs( rlayer->crs() ); } QListWidgetItem *item = new QListWidgetItem( entry.ref, mRasterBandsListWidget ); item->setData( Qt::ToolTipRole, rlayer->publicSource() ); mRasterBandsListWidget->addItem( item ); } } }
void MainWindow::addLayer() { QString myFileName = QFileDialog::getOpenFileName(this, tr("Open File"), QCoreApplication::applicationDirPath () + "/data", tr("GeoTiff (*.tif)")); QFileInfo myRasterFileInfo(myFileName); QgsRasterLayer * mypLayer = new QgsRasterLayer(myRasterFileInfo.filePath(), myRasterFileInfo.completeBaseName()); if (mypLayer->isValid()) { qDebug("Layer is valid"); } else { qDebug("Layer is NOT valid"); return; } // render strategy for grayscale image (will be rendered as pseudocolor) mypLayer->setDrawingStyle( QgsRasterLayer::SingleBandPseudoColor ); mypLayer->setColorShadingAlgorithm( QgsRasterLayer::PseudoColorShader ); mypLayer->setContrastEnhancementAlgorithm( QgsContrastEnhancement::StretchToMinimumMaximum, false ); mypLayer->setMinimumValue( mypLayer->grayBandName(), 0.0, false ); mypLayer->setMaximumValue( mypLayer->grayBandName(), 10.0 ); // Add the Vector Layer to the Layer Registry QgsMapLayerRegistry::instance()->addMapLayer(mypLayer, TRUE); //create a layerset QList<QgsMapCanvasLayer> myList; // Add the layers to the Layer Set myList.append(QgsMapCanvasLayer(mypLayer, TRUE));//bool visibility // set the canvas to the extent of our layer mpMapCanvas->setExtent(mypLayer->extent()); // Set the Map Canvas Layer Set mpMapCanvas->setLayerSet(myList); }
void TestQgsWcsPublicServers::test( ) { QStringList versions; // It may happen that server supports 1.1.1, but does not accept 1.1 (http://zeus.pin.unifi.it/gi-wcs/http) versions << "" << "1.0.0" << "1.1.0"; // empty for default QStringList servers; // Some (first) coverages do not advertize any supportedCRS and sever gives // error both with native CRS (EPSG::561005) and EPSG:4326 // MOD* coverages work OK servers << "http://argon.geogr.uni-jena.de:8080/geoserver/ows"; servers << "http://demo.geonode.org/geoserver/wcs"; servers << "http://demo.mapserver.org/cgi-bin/wcs"; servers << "http://demo.opengeo.org/geoserver/wcs"; // geobrain.laits.gmu.edu servers are quite slow servers << "http://geobrain.laits.gmu.edu/cgi-bin/gbwcs-dem"; servers << "http://geobrain.laits.gmu.edu/cgi-bin/ows8/wcseo"; servers << "http://geobrain.laits.gmu.edu/cgi-bin/wcs110"; servers << "http://geobrain.laits.gmu.edu/cgi-bin/wcs-all"; servers << "http://iceds.ge.ucl.ac.uk/cgi-bin/icedswcs"; servers << "http://motherlode.ucar.edu:8080/thredds/wcs/fmrc/NCEP/DGEX/Alaska_12km/NCEP-DGEX-Alaska_12km_best.ncd"; servers << "http://navigator.state.or.us/ArcGIS/services/Framework/Imagery_Mosaic2009/ImageServer/WCSServer"; servers << "http://nsidc.org/cgi-bin/atlas_north"; servers << "http://sedac.ciesin.columbia.edu/geoserver/wcs"; // Big and slow //servers << "http://webmap.ornl.gov/ogcbroker/wcs"; servers << "http://ws.csiss.gmu.edu/cgi-bin/wcs-t"; // Big and slow //servers << "http://ws.laits.gmu.edu/cgi-bin/wcs-all"; // Currently very slow or down //servers << "http://www.sogeo.ch/geoserver/wcs"; // Slow and erroneous //servers << "http://zeus.pin.unifi.it/gi-wcs/http"; foreach ( QString server, servers ) { QStringList myServerLog; myServerLog << "server:" + server; QString myServerDirName = server; myServerDirName.replace( QRegExp( "[:/]+" ), "." ); myServerDirName.replace( QRegExp( "\\.$" ), "" ); QgsDebugMsg( "myServerDirName = " + myServerDirName ); QDir myServerDir( mCacheDir.absolutePath() + QDir::separator() + myServerDirName ); QString myServerLogPath = myServerDir.absolutePath() + QDir::separator() + "server.log"; if ( QFileInfo( myServerLogPath ).exists() ) { QgsDebugMsg( "cache exists " + myServerDir.absolutePath() ); continue; } if ( !myServerDir.exists() ) { mCacheDir.mkdir( myServerDirName ); } foreach ( QString version, versions ) { QgsDebugMsg( "server: " + server + " version: " + version ); QgsDataSourceURI myServerUri; myServerUri.setParam( "url", server ); if ( !version.isEmpty() ) { myServerUri.setParam( "version", version ); } QgsWcsCapabilities myCapabilities; myCapabilities.setUri( myServerUri ); if ( !myCapabilities.lastError().isEmpty() ) { QgsDebugMsg( myCapabilities.lastError() ); myServerLog << "error: (version: " + version + ") " + myCapabilities.lastError().replace( "\n", " " ); continue; } QVector<QgsWcsCoverageSummary> myCoverages; if ( !myCapabilities.supportedCoverages( myCoverages ) ) { QgsDebugMsg( "Cannot get list of coverages" ); myServerLog << "error: (version: " + version + ") Cannot get list of coverages"; continue; } int myCoverageCount = 0; int myStep = myCoverages.size() / mMaxCoverages; int myStepCount = -1; foreach ( QgsWcsCoverageSummary myCoverage, myCoverages ) { QgsDebugMsg( "coverage: " + myCoverage.identifier ); // Go in steps to get more success/errors if ( myStepCount == -1 || myStepCount > myStep ) { myStepCount = 0; } else { myStepCount++; continue; } myCoverageCount++; if ( myCoverageCount > mMaxCoverages ) break; QString myPath = myServerDir.absolutePath() + QDir::separator() + myCoverage.identifier; if ( !version.isEmpty() ) { myPath += "-" + version; } QString myLogPath = myPath + ".log"; if ( QFileInfo( myLogPath ).exists() ) { QMap<QString, QString> log = readLog( myLogPath ); if ( !log.value( "identifier" ).isEmpty() && log.value( "error" ).isEmpty() ) continue; } QStringList myLog; myLog << "identifier:" + myCoverage.identifier; myCapabilities.describeCoverage( myCoverage.identifier ); myCoverage = myCapabilities.coverage( myCoverage.identifier ); // get described QgsDataSourceURI myUri = myServerUri; myUri.setParam( "identifier", myCoverage.identifier ); if ( myCoverage.times.size() > 0 ) { myUri.setParam( "time", myCoverage.times.value( 0 ) ); } myLog << "version:" + version; myLog << "uri:" + myUri.encodedUri(); int myWidth = 100; int myHeight = 100; if ( myCoverage.hasSize ) { myHeight = static_cast<int>( qRound( 1.0 * myWidth * myCoverage.height / myCoverage.width ) ); } myLog << QString( "hasSize:%1" ).arg( myCoverage.hasSize ); QgsRasterLayer * myLayer = new QgsRasterLayer( myUri.encodedUri(), myCoverage.identifier, "wcs", true ); if ( myLayer->isValid() ) { int myBandCount = myLayer->dataProvider()->bandCount(); myLog << "bandCount:" + QString::number( myBandCount ); if ( myBandCount > 0 ) { myLog << "srcType:" + QString::number( myLayer->dataProvider()->srcDataType( 1 ) ); QgsRasterBandStats myStats = myLayer->dataProvider()->bandStatistics( 1, QgsRasterBandStats::All, QgsRectangle(), myWidth * myHeight ); myLog << "min:" + QString::number( myStats.minimumValue ); myLog << "max:" + QString::number( myStats.maximumValue ); } QgsMapRenderer myMapRenderer; QList<QgsMapLayer *> myLayersList; myLayersList.append( myLayer ); QgsMapLayerRegistry::instance()->addMapLayers( myLayersList, false ); QMap<QString, QgsMapLayer*> myLayersMap = QgsMapLayerRegistry::instance()->mapLayers(); myMapRenderer.setLayerSet( myLayersMap.keys() ); myMapRenderer.setExtent( myLayer->extent() ); QImage myImage( myWidth, myHeight, QImage::Format_ARGB32_Premultiplied ); myImage.fill( 0 ); myMapRenderer.setOutputSize( QSize( myWidth, myHeight ), myImage.logicalDpiX() ); QPainter myPainter( &myImage ); myMapRenderer.render( &myPainter ); // Save rendered image QString myPngPath = myPath + ".png"; QgsDebugMsg( "myPngPath = " + myPngPath ); myImage.save( myPngPath ); // Verify data QSet<QString> myValues; // cannot be QSet<double> void *myData = myLayer->dataProvider()->readBlock( 1, myLayer->extent(), myWidth, myHeight ); if ( myData ) { int myType = myLayer->dataProvider()->dataType( 1 ); for ( int row = 0; row < myHeight; row++ ) { for ( int col = 0; col < myWidth; col++ ) { double value = myLayer->dataProvider()->readValue( myData, myType, row * myWidth + col ); QString valueStr = QString::number( value ); if ( !myValues.contains( valueStr ) ) myValues.insert( valueStr ); } } free( myData ); } QgsDebugMsg( QString( "%1 values" ).arg( myValues.size() ) ); myLog << QString( "valuesCount:%1" ).arg( myValues.size() ); // Verify image colors QSet<QRgb> myColors; for ( int row = 0; row < myHeight; row++ ) { for ( int col = 0; col < myWidth; col++ ) { QRgb color = myImage.pixel( col, row ); if ( !myColors.contains( color ) ) myColors.insert( color ); } } QgsDebugMsg( QString( "%1 colors" ).arg( myColors.size() ) ); myLog << QString( "colorsCount:%1" ).arg( myColors.size() ); } else { QgsDebugMsg( "Layer is not valid" ); myLog << "error:Layer is not valid"; } QFile myLogFile( myLogPath ); myLogFile.open( QIODevice::WriteOnly | QIODevice::Text ); QTextStream myStream( &myLogFile ); myStream << myLog.join( "\n" ); myLogFile.close(); QgsMapLayerRegistry::instance()->removeAllMapLayers(); }