синтаксис растрового калькулятора gdal_calc для логічних операторів та інших функцій


13

У документації для gdal_calc зазначено калькулятор растрових командних рядків із синтаксисом numpy . Пізніше є кілька прикладів, коли в одному з них:

gdal_calc.py -A input.tif --outfile = result.tif --calc = "A * (A> 0)" --NoDataValue = 0 - означає встановлені значення нуля і нижче до нуля

На жаль, не існує прикладу для таких логічних операторів, як:

--calc = "A * (A> 0 і A> B)" - означає зберегти A, якщо більший нуль і більший B, а решта встановити на нуль

На основі логічних функцій Numpy / Scipy я би розраховував записати логічні оператори як:

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

Я спробував це, і, схоже, це спрацювало, але я хотів би бути впевнений, що це правильно.

Аналогічним чином, якщо потрібно мінімум A і B:

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

Ви можете просто написати:

--calc = "мінімум (A, B)"

Моя проблема полягає в тому, що я не можу знайти жодної кулінарної книги, щоб переконатися, що я це правильно став. Чи є якась хороша кулінарна книга з розширеними прикладами того, що є, а що неможливо з gdal_calc?

Відповіді:


10

У джерелі для gdal_calc.py обчислення проводяться безпосередньо, використовуючи eval:

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

Це підказує, що будь-який добре сформований вираз, який також оцінюється в командному рядку, буде працювати. Згідно з документацією, ви можете використовувати gdalnumeric синтаксис з +-/*та / або numpyфункціями. Ви можете протестувати свої функції, використовуючи невеликі манекенні масиви в інтерактивній оболонці, а потім використовувати ті самі виклики в gdal_calc.

Майте на увазі, що об'єднання декількох numpyфункцій, ймовірно, створює тимчасові масиви пам'яті, які можуть значно збільшити використання пам'яті, особливо при роботі з великими зображеннями.

Ви можете переглянути документацію numpy, щоб переглянути список усіх функцій: підпрограми . Тут ви, ймовірно, перебуваєте: математика або тут: rutines.logic .

Ось звідки беруться такі функції, як мінімум, просто імпорт простору вже імпортований. Дійсно, це numpy.minimum тощо


1
Дякую Бен, це ще один спосіб, про який я не мав поняття. Ще після якоїсь кулінарної книги, яка б пояснила, що можна використовувати, оскільки eval не включає мінімум () тощо функцій, які фактично можна використовувати в виразі.
Миро

8

Виходячи з відповіді Бенджаміна, ви можете використовувати logic_or () або logic_and (). Див. Http://docs.scipy.org/doc/numpy/reference/routines.logic.html . Наступний приклад добре працював для мене. Це встановлює всі значення від 177 до 185 (включно) до 0, що потім трактується як нодати.

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

1

У мене був растр, де значення варіювалися від -1 до 3, де нуль - дійсне число. У мене виникли проблеми із створенням виразу gdal_calc, тому я зробив це швидке та люте рішення.

#!/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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.