論理演算子およびその他の関数のgdal_calcラスター計算機構文


13

gdal_calcのドキュメントには記載されているnumpyの構文でコマンドラインラスタ電卓を。後で、そのうちの1つにいくつかの例があります。

gdal_calc.py -A input.tif --outfile = result.tif --calc = "A *(A> 0)" --NoDataValue = 0- ゼロ以下の値をnullに設定することを意味します

残念ながら、次のような論理演算子の例はありません。

--calc = "A *(A> 0 and A> B)"- 、Aがゼロより大きくBが大きい場合にAを保持し、残りをnullに設定することを意味します

Numpy / Scipyの論理関数に基づいて、論理演算子を次のように記述することを期待します。

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

私はこれを試しましたが、うまくいくようですが、それが正しいことを確認したいと思います。

同様に、AとBの最小値が必要な場合:

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

あなたはただ書くことができます:

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

私の問題は、これが正しいことを確認するためのクックブックが見つからないことです。gdal_calcで可能なことと不可能なことの高度な例を含む、良いクックブックはありますか?

回答:


10

gdal_calc.pyのソースでは、計算は次を使用して直接行われますeval

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

これは、コマンドラインでも評価される整形式が機能することを示唆しています。ドキュメントによると、gdalnumeric構文は+-/*、および/またはnumpy関数で使用できます。対話型シェルで小さなダミー配列を使用して関数をテストし、gdal_calcで同じ呼び出しを使用できます。

複数のnumpy関数を連結すると、特に大きなイメージを処理する場合に、メモリ使用量を大幅に増加させる一時的なメモリ内配列が生成される可能性が高いことに注意してください。

すべての関数のリストについては、numpyのドキュメントを参照してください:routines。あなたが後にしているものはおそらくここにあります:mathまたはhere:routines.logic

これは、minimumなどの関数の由来です。名前空間が既にインポートされているだけです。本当に、それはnumpy.minimumなどです


1
ベンありがとう、それは私が手がかりを持っていなかった別の方法です。evalには式で実際に使用できるminimum()などの関数が含まれていないため、使用できることを説明するクックブックの後にもあります。
ミロ

8

Benjaminの答えに続いて、logical_or()またはlogical_and()を使用できます。http://docs.scipy.org/doc/numpy/reference/routines.logic.htmlを参照してください。次の例はうまく機能しました。これにより、177〜185(両端を含む)のすべての値が0に設定され、nodataとして処理されます。

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.