gdal_calc sintassi della calcolatrice raster per operatori logici e altre funzioni


13

Nella documentazione per gdal_calc è indicato il calcolatore raster della riga di comando con sintassi numpy . Più avanti ci sono alcuni esempi in cui in uno di essi:

gdal_calc.py -A input.tif --outfile = result.tif --calc = "A * (A> 0)" --NoDataValue = 0 - significa impostare i valori di zero e sotto su null

Sfortunatamente non c'è esempio su operatori logici come:

--calc = "A * (A> 0 e A> B)" - significa mantenere A se A zero più grande e B più grande e impostare il resto su null

Sulla base delle funzioni logiche di Numpy / Scipy, mi aspetterei di scrivere operatori logici come:

--calc = "A * logical_and (A> 0, A> B)"

Ho provato questo e sembra funzionare, ma vorrei essere sicuro che sia corretto.

Allo stesso modo se si desidera un minimo di A e B:

--calc = "A * (A <= B) + B * (A> B)"

Puoi semplicemente scrivere:

--calc = "minima (A, B)"

Il mio problema è che non riesco a trovare alcun libro di cucina per assicurarmi di farlo bene. Esiste un buon libro di cucina con esempi avanzati di ciò che è e non è possibile con gdal_calc?

Risposte:


10

Nella fonte per gdal_calc.py, il calcolo viene effettuato direttamente utilizzando eval:

myResult = eval(opts.calc, global_namespace, local_namespace)

Ciò suggerirebbe che qualsiasi espressione ben formata che valuti anche sulla riga di comando funzionerà. Secondo la documentazione, è possibile utilizzare la sintassi gdalnumerica con +-/*, e / o numpyfunzioni. Puoi testare le tue funzioni usando piccoli array fittizi nella shell interattiva, quindi usare le stesse chiamate in gdal_calc.

Tieni presente che il concatenamento di più numpyfunzioni può produrre array temporanei in memoria che possono aumentare notevolmente l'utilizzo della memoria, soprattutto quando si tratta di immagini di grandi dimensioni.

È possibile consultare la documentazione numpy per un elenco di tutte le funzioni: routine . Quelli che stai cercando sono probabilmente qui: matematica o qui: routines.logic .

Questo è dove provengono funzioni come il minimo, è solo che lo spazio dei nomi è già importato. Davvero, è numpy.minimum, ecc


1
Grazie Ben, è un altro modo per cui non avevo idea. Ancora dopo alcuni libri di cucina che spiegherebbero cosa è possibile usare, perché eval non include le funzioni minima () ecc. Che sono effettivamente utilizzabili nell'espressione.
Mirò,

8

Seguendo la risposta di Benjamin, puoi usare la logica_or () o la logica_and (). Vedi http://docs.scipy.org/doc/numpy/reference/routines.logic.html . Il seguente esempio ha funzionato bene per me. Questo imposta tutti i valori tra 177 e 185 (inclusi) su 0, che viene quindi trattato come nodata.

gdal_calc.py -A input.tif --outfile=output.tif --calc="A*logical_or(A<=177,A>=185)" --NoDataValue=0

1

Ho avuto un raster in cui i valori erano compresi tra -1 e 3, dove zero è un numero valido. Ho avuto dei problemi nel creare un'espressione gdal_calc, quindi ho reso questa soluzione veloce e furiosa.

#!/usr/bin/env python3

fileNameIn = "/tmp/geotiff/Global_taxonomic_richness_of_soil_fungi.tif"
fileNameOut = "/tmp/geotiff/Global_taxonomic_richness_of_soil_fungi.tiff"
dst_options = ['COMPRESS=DEFLATE',"PREDICTOR=3","TILED=YES"]
noDataValue = -3.4028234663852886e+38

from osgeo import gdal
import numpy

src_ds = gdal.Open(fileNameIn)
format = "GTiff"
driver = gdal.GetDriverByName(format)
dst_ds = driver.CreateCopy(fileNameOut, src_ds, False ,dst_options)

# Set location
dst_ds.SetGeoTransform(src_ds.GetGeoTransform())
# Set projection
dst_ds.SetProjection(src_ds.GetProjection())
srcband = src_ds.GetRasterBand(1)

dataraster = srcband.ReadAsArray().astype(numpy.float)
#Rplace the nan value with the predefiend noDataValue
dataraster[numpy.isnan(dataraster)]=noDataValue

dst_ds.GetRasterBand(1).WriteArray(dataraster)
dst_ds.GetRasterBand(1).SetNoDataValue(noDataValue)

dst_ds = None
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.