mantıksal işleçler ve diğer işlevler için gdal_calc raster hesap makinesi sözdizimi


13

In gdal_calc belgelerine Arü numpy sözdizimi ile Komut satırı raster hesap makinesi . Daha sonra bunlardan birinde birkaç örnek var:

gdal_calc.py -A input.tif --outfile = result.tif --calc = "a * (A> 0)" --NoDataValue n = 0 - araçları ayarlamak sıfır değerine ve aşağıdaki null

Maalesef aşağıdaki gibi mantıksal operatörlere örnek yok:

--calc = "A * (A> 0 ve A> B)" - vasıta Daha büyük sıfır ve daha büyük B ise A tutmak ve boş gerisini ayarlamak

Numpy / Scipy mantık fonksiyonlarına dayanarak mantıksal operatörleri şöyle yazmayı beklerim :

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

Bunu denedim ve işe yarıyor gibi görünüyor ama doğru olduğundan emin olmak istiyorum.

Benzer şekilde, minimum A ve B istiyorsanız:

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

Sadece şunu yazabilirsiniz:

--calc = "en düşük (A, B)"

Benim sorunum, bunu doğru yaptığımdan emin olmak için herhangi bir yemek kitabı bulamıyorum. Gdal_calc ile neyin mümkün ve neyin mümkün olmadığına dair gelişmiş örneklere sahip iyi bir yemek kitabı var mı?

Yanıtlar:


10

Gdal_calc.py kaynağında, hesaplama doğrudan kullanılarak yapılır eval:

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

Bu, komut satırında da değerlendirilen iyi biçimlendirilmiş ifadelerin işe yarayacağını gösterir. Belgelere göre +-/*, ve / veya numpyişlevlerle gdalnümerik sözdizimi kullanabilirsiniz . Etkileşimli kabuktaki küçük kukla dizileri kullanarak işlevlerinizi test edebilir, ardından gdal_calc içinde aynı çağrıları kullanabilirsiniz.

Birden çok numpyişlevi zincirlemenin , özellikle büyük görüntülerle uğraşırken bellek kullanımını önemli ölçüde artırabilecek geçici bellek içi diziler üretebileceğini unutmayın.

Tüm fonksiyonların bir listesi için numpy belgelerine bakabilirsiniz: rutinler . Sonrasında olanlar muhtemelen burada: matematik veya burada: rutin.logic .

Minimum gibi işlevlerin geldiği yer, sadece ad alanının zaten içe aktarılmış olmasıdır. Gerçekten, numpy. Minimum, vb


1
Teşekkürler Ben, bu konuda bir ipucum yoktu. Yine de, neyin kullanılabileceğini açıklayan bazı yemek tariflerinden sonra, çünkü eval ifadede gerçekten mümkün olan minimum () vb fonksiyonları içermez.
Miro

8

Benjamin'in cevabından sonra, logical_or () veya logical_and () kullanabilirsiniz. Bkz. Http://docs.scipy.org/doc/numpy/reference/routines.logic.html . Aşağıdaki örnek benim için iyi çalıştı. Bu, 177 ve 185 (dahil) arasındaki tüm değerleri 0'a ayarlar ve bu değer daha sonra nodata olarak değerlendirilir.

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

1

Değerler -1 ile 3 arasında değişiyordu, burada sıfır geçerli bir sayı. Bir gdal_calc ifade yapmak bu yüzden bu hızlı ve öfkeli bir çözüm yapmakta bazı sorunlar vardı.

#!/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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.