Suite

QGIS depuis la console : algèbre raster


Je suis novice en programmation pyqgis.

J'ai besoin d'effectuer un simple type de calcul "GeoTiff * A" (où A est une constante), mais j'ai du mal à le faire.

J'ai essayé processing.runalg('saga:rastercalculator') mais j'ai échoué car ma constante n'est PAS un raster.

Je suppose que je devrais utiliser 'qgismodelertools:calculator' ou peut-être quelque chose comme ce qu'ils utilisent ici http://geoexamples.blogspot.it/2012/12/raster-calculations-with-gdal-and-numpy.html

Des indices ?


La réponse de Gene est succincte et logique, mais rasterio ne sort pas de la boîte QGIS 2.8, que j'utilise depuis OSGEO4W.

En attendant, j'ai utilisé le code utile d'EikeMike en le transformant en une fonction fonctionnelle et appelable :

def raster_calc(RGBI_DS,outFile,constant): traitement d'import, os, time, subprocess, array from osgeo import gdal from osgeo.gdalnumeric import * from osgeo.gdalconst import * # Lire le jeu de données raster GDALRgbiDS = gdal.Open(RGBI_DS, GA_ReadOnly ) band1rot = GDALRgbiDS.GetRasterBand(1) # Convertir la bande en tableau Rdata = BandReadAsArray(band1rot) * 1.0 # calculer le raster * constant dataOut = (Rdata * constant) # Exporter le résultat en tant que pilote Geotiff = gdal.GetDriverByName("GTiff") dsOut = driver.Create(outFile, GDALRgbiDS.RasterXSize, GDALRgbiDS.RasterYSize, 1, gdal.GDT_Float32) CopyDatasetInfo(GDALRgbiDS,dsOut) bandOut=dsOut.GetRasterBand(1) BandWriteArray(bandOut, dataOut) #Déclenche réellement l'écriture, cette du fichier de sortie dsOut =Aucun bandOut =Aucun pilote =Aucun

Plus tard, je me suis trouvé une solution beaucoup plus simple et plus courte.

C'est ici:

Tenez-vous-en à 'saga:rastercalculator' (ou algorithme similaire). Construisez simplement la formule mathématique en tant que nouvelle variable où votre constante est elle-même une variable. En d'autres termes:

import processing formula = ('a * %s' % (str(constant))) # où 'a' va pointer vers votre raster et 'constant' est le chiffre que vous voulez multiplier votre raster par processing.runalg('saga :rastercalculator',votreraster,Aucun,formule,outFile)

Malheureusement, la question concerne PyQGIS et non GDAL (osgeo) (utilisez rasterio, plus facile, voir ci-dessous en 3) et il existe de nombreux exemples dans GIS This Site comme Comment évaluer les expressions de la calculatrice raster à partir de la console?

processing.runalg('saga:rastercalculator')est la calculatrice raster de Sagaprocessing.runalg('herbe:r.mapcalculator')est le calculateur raster GRASS GIS

Pour utiliser la calculatrice raster QGIS dans la console, je détaille ici le processus en utilisant l'exemple de Cómo usar el Raster Calculator desde la Python Console de José Guerrero (en espagnol)

1) La boîte de dialogue de la calculatrice raster

2) Le script dans la console

Caractéristiques de la couche raster

layer=iface.activeLayer() # comparer avec les valeurs de la boîte de dialogue print layer.extent().xMinimum(), layer.extent().xMaximum() 202086.577 205625.414407 print layer.extent().yMinimum(), layer. extend().yMaximum() 88411.048 90534.3504441 print layer.width(), layer.height() 100 60 name = layer.name() print name test bands = layer.bandCount() print bands 1

Pour utiliser le calculateur raster avec la seule bande, l'expression est donc [email protected] comme dans le dialogue

de qgis.analysis import QgsRasterCalculator, QgsRasterCalculatorEntry resultlayer = QgsRasterCalculatorEntry() resultantlayer.ref = nom + "@1" resultantlayer.raster = couche resultantlayer.bandNumber = 1 elements = [resultinglayer] # effectuer un simple type de calcul "GeoTiff * A" (où A est une constante) calc = QgsRasterCalculator('([email protected])*3', '/Users/Shared/resulting.tif', 'GTiff', layer.extent(), layer.width(), layer. hauteur(), entrées ) calc.processCalculation() # charge la couche raster résultante. rlayer = QgsRasterLayer('/Users/Shared/resulting.tif', 'resulting') QgsMapLayerRegistry.instance().addMapLayer(rlayer)

3) EikeMike vous donne une solution avec GDAL, comparez avec une solution rasterio

importez rasterio avec rasterio.open('/Users/Shared/test.tif') en tant qu'original : layer = original.read() # ou read_band(1), mais obsolète resultlayer = layer*3 kwargs = original.meta avec rasterio. open("/Users/Shared/resulting.tif", 'w', **kwargs) en sortie : output.write(resultinglayer)

Vous trouvez un extrait d'un de mes scripts. J'utilise GDAL là-bas et le calcul est fait avec des tableaux. Les lignes importantes pour vous sont le RGBI_DS - ici vous mettez votre chemin et votre nom de fichier. et la ligne de données - ici, vous pouvez remplacer le 2.0 par votre constante. J'espère que cela vous permet de démarrer.

import processing, os, time, subprocess, array from osgeo import gdal from osgeo.gdalnumeric import * from osgeo.gdalconst import * # Raster Dataset RGBI_DS = "D:/Rohdaten/RGBI_DS.img" # Read Raster dataset GDALRgbiDS = gdal.Open (RGBI_DS, GA_ReadOnly ) band1rot = GDALRgbiDS.GetRasterBand(1) # Convertir la bande en Array Rdata = BandReadAsArray(band1rot) * 1.0 # calculer le raster * constant dataOut = (Rdata * 2.0) # Output outFile = "D:/NDVI.tif" # Exporter le résultat en tant que pilote Geotiff = gdal.GetDriverByName("GTiff") dsOut = driver.Create(outFile, GDALRgbiDS.RasterXSize, GDALRgbiDS.RasterYSize, 1, gdal.GDT_Float32) CopyDatasetInfo(GDALRgbiDS,dsOut.Get1=dsBand ) BandWriteArray(bandOut, dataOut) #Suppression des variables, cela déclenche en fait l'écriture du fichier de sortie dsOut =Aucun bandOut =Aucun driver =Aucun


Voir la vidéo: Using the rreclass tool to reclassify a raster in QGIS (Octobre 2021).