sintaks kalkulator raster gdal_calc untuk operator logis dan fungsi lainnya


13

Dalam dokumentasi untuk gdal_calc dinyatakan kalkulator raster baris perintah dengan sintaks numpy . Kemudian ada beberapa contoh di mana di salah satunya:

gdal_calc.py -A input.tif --outfile = result.tif --calc = "A * (A> 0)" --NoDataValue = 0 - berarti menetapkan nilai nol dan di bawah menjadi nol

Sayangnya tidak ada contoh pada operator logis seperti:

--calc = "A * (A> 0 dan A> B)" - berarti menjaga A jika A lebih besar nol dan lebih besar B dan mengatur sisanya menjadi nol

Berdasarkan fungsi logika Numpy / Scipy saya berharap untuk menulis operator logis sebagai:

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

Saya mencoba ini dan tampaknya berhasil tetapi saya ingin diyakinkan bahwa itu benar.

Dengan cara yang sama jika Anda ingin minimum A dan B:

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

Anda bisa menulis:

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

Masalah saya adalah saya tidak dapat menemukan buku masak untuk memastikan saya mendapatkan ini dengan benar. Apakah ada beberapa buku masak yang bagus dengan contoh lanjutan tentang apa yang bisa dan tidak mungkin dengan gdal_calc?

Jawaban:


10

Di sumber untuk gdal_calc.py, perhitungan dilakukan langsung menggunakan eval:

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

Itu akan menyarankan bahwa setiap ekspresi yang terbentuk dengan baik yang juga mengevaluasi pada baris perintah akan berfungsi. Menurut dokumentasi, Anda dapat menggunakan sintaks gdalnumeric dengan +-/*, dan / atau numpyfungsi. Anda dapat menguji fungsi Anda menggunakan array dummy kecil di shell interaktif, lalu gunakan panggilan yang sama di gdal_calc.

Ingatlah bahwa menggabungkan beberapa numpyfungsi secara bersamaan cenderung menghasilkan susunan di dalam memori sementara yang secara substansial dapat meningkatkan penggunaan memori, terutama ketika berhadapan dengan gambar besar.

Anda dapat melihat dokumentasi numpy untuk daftar semua fungsi: rutinitas . Yang Anda kejar kemungkinan ada di sini: matematika atau di sini: routines.logic .

Di sinilah fungsi seperti minimum berasal, hanya saja namespace sudah diimpor. Sungguh, numpy.minimum, dll


1
Terima kasih, Ben, itu cara lain yang tidak saya ketahui. Masih setelah beberapa buku masak yang akan menjelaskan apa yang mungkin digunakan, karena eval tidak termasuk fungsi minimum () dll yang sebenarnya mungkin digunakan dalam ekspresi.
Miro

8

Sebagai lanjutan dari jawaban Benjamin, Anda dapat menggunakan logical_or () atau logical_and (). Lihat http://docs.scipy.org/doc/numpy/reference/routines.logic.html . Contoh berikut ini bekerja dengan baik untuk saya. Ini menetapkan semua nilai antara 177 dan 185 (inklusif) ke 0, yang kemudian diperlakukan sebagai nodata.

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

1

Saya memiliki raster di mana nilai berkisar antara -1 dan 3 di mana nol adalah angka yang valid. Saya punya beberapa masalah dalam membuat ekspresi gdal_calc jadi buat solusi yang cepat dan ganas ini.

#!/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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.