Cú pháp máy tính raster của gdal_calc cho các toán tử logic và các hàm khác


13

Trong tài liệu cho gdal_calc, nó được ghi rõ Máy tính raster dòng lệnh với cú pháp numpy . Sau này có một vài ví dụ trong đó một trong số chúng:

gdal_calc.py -A input.tif --outfile = result.tif --calc = "A * (A> 0)" --NoDataValue = 0 - có nghĩa là đặt giá trị từ 0 trở xuống thành null

Thật không may, không có ví dụ về các toán tử logic như:

--calc = "A * (A> 0 và A> B)" - có nghĩa là giữ A nếu A lớn hơn và B lớn hơn và đặt phần còn lại thành null

Dựa trên các hàm logic Numpy / Scipy, tôi sẽ viết các toán tử logic như sau:

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

Tôi đã thử điều này và nó có vẻ hoạt động nhưng tôi muốn được đảm bảo rằng đó là chính xác.

Theo cách tương tự nếu bạn muốn tối thiểu A và B:

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

Bạn chỉ có thể viết:

--calc = "tối thiểu (A, B)"

Vấn đề của tôi là tôi không thể tìm thấy bất kỳ cuốn sách nấu ăn nào để đảm bảo rằng tôi làm đúng. Có một số sách dạy nấu ăn tốt với các ví dụ nâng cao về những gì là và không thể với gdal_calc?

Câu trả lời:


10

Trong nguồn cho gdal_calc.py, phép tính được thực hiện trực tiếp bằng cách sử dụng eval:

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

Điều đó sẽ gợi ý rằng bất kỳ biểu thức được định dạng tốt nào cũng đánh giá trên dòng lệnh sẽ hoạt động. Theo tài liệu, bạn có thể sử dụng cú pháp gdalnumeric với +-/*và / hoặc các numpyhàm. Bạn có thể kiểm tra các chức năng của mình bằng cách sử dụng các mảng giả nhỏ trong vỏ tương tác, sau đó sử dụng các lệnh gọi tương tự trong gdal_calc.

Hãy nhớ rằng việc kết hợp nhiều numpychức năng với nhau có khả năng tạo ra các mảng trong bộ nhớ tạm thời có thể làm tăng đáng kể việc sử dụng bộ nhớ, đặc biệt là khi xử lý các hình ảnh lớn.

Bạn có thể xem tài liệu numpy cho một danh sách tất cả các chức năng: thói quen . Những cái bạn đang theo sau có khả năng ở đây: math hoặc here: Routines.logic .

Đây là nơi các hàm như tối thiểu đến từ, chỉ là không gian tên đã được nhập. Thực sự, đó là numpy.minimum, v.v.


1
Cảm ơn Ben, đó là một cách khác mà tôi không có manh mối. Tuy nhiên, sau một số sách dạy nấu ăn sẽ giải thích những gì có thể sử dụng, bởi vì eval không bao gồm các hàm tối thiểu () vv mà thực sự có thể sử dụng trong biểu thức.
Miro

8

Theo dõi câu trả lời của Benjamin, bạn có thể sử dụng logic_or () hoặc logic_and (). Xem http://docs.scipy.org/doc/numpy/reference/routines.logic.html . Ví dụ sau đây làm việc tốt cho tôi. Điều này đặt tất cả các giá trị từ 177 đến 185 (đã bao gồm) thành 0, sau đó được coi là nốt.

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

1

Tôi đã có một raster trong đó các giá trị nằm trong khoảng -1 đến 3 trong đó 0 là số hợp lệ. Tôi đã có một số vấn đề khi thực hiện một biểu thức gdal_calc để thực hiện giải pháp nhanh và nguy hiểm này.

#!/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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.