GDAL-RASTER-CALC(1) GDAL GDAL-RASTER-CALC(1)
gdal-raster-calc - Perform pixel-wise calculations on a raster
Added in version 3.11.
Usage: gdal raster calc [OPTIONS] <INPUTS>... <OUTPUT>
Perform raster algebra
Positional arguments:
-i, --input <INPUTS> Input raster datasets [1.. values] [required]
-o, --output <OUTPUT> Output raster dataset [required]
Common Options:
-h, --help Display help message and exit
--json-usage Display usage as JSON document and exit
--config <KEY>=<VALUE> Configuration option [may be repeated]
-q, --quiet Quiet mode (no progress bar)
Options:
-f, --of, --format, --output-format <OUTPUT-FORMAT> Output format ("GDALG" allowed)
--co, --creation-option <KEY>=<VALUE> Creation option [may be repeated]
--overwrite Whether overwriting existing output is allowed
Mutually exclusive with --append
--append Append as a subdataset to existing output
Mutually exclusive with --overwrite
--ot, --datatype, --output-data-type <OUTPUT-DATA-TYPE> Output data type. OUTPUT-DATA-TYPE=Byte|Int8|UInt16|Int16|UInt32|Int32|UInt64|Int64|CInt16|CInt32|Float16|Float32|Float64|CFloat32|CFloat64
--no-check-srs Do not check consistency of input spatial reference systems
--no-check-extent Do not check consistency of input extents
--propagate-nodata Whether to set pixels to the output NoData value if any of the input pixels is NoData
--calc <CALC> Expression(s) to evaluate [1.. values] [required]
--dialect <DIALECT> Expression dialect. DIALECT=muparser|builtin (default: muparser)
--flatten Generate a single band output raster per expression, even if input datasets are multiband
--nodata <NODATA> Assign a specified nodata value to output bands ('none', numeric value, 'nan', 'inf', '-inf')
Advanced Options:
--if, --input-format <INPUT-FORMAT> Input formats [may be repeated]
--oo, --open-option <KEY>=<VALUE> Open options [may be repeated]
gdal raster calc performs pixel-wise calculations on one or more
input GDAL datasets. Calculations can be performed eagerly, writing
results to a conventional raster format, or lazily, written as a set
of derived bands in a VRT (Virtual Dataset).
The list of input GDAL datasets can be specified at the end of the
command line or put in a text file (one input per line) for very long
lists. If more than one input dataset is used, it should be prefixed
with a name by which it will be referenced in the calculation, e.g.
A=my_data.tif. (If a single dataset is used, it will be referred to
with the variable X in formulas.)
Starting with GDAL 3.12, it is also possible to use a VRT C++ pixel
function (such a sum, mean, min, max) by specifying --dialect to
builtin.
The inputs should have the same spatial reference system and should
cover the same spatial extent but are not required to have the same
spatial resolution. The spatial extent check can be disabled with
--no-check-extent, in which case the inputs must have the same
dimensions. The spatial reference system check can be disabled with
--no-check-srs.
Since GDAL 3.12, this algorithm can be part of a gdal pipeline or
gdal raster pipeline.
The following options are available:
-f, --of, --format, --output-format <OUTPUT-FORMAT>
Which output raster format to use. Allowed values may be given
by gdal --formats | grep raster | grep rw | sort
--co, --creation-option <NAME>=<VALUE>
Many formats have one or more optional creation options that
can be used to control particulars about the file created. For
instance, the GeoTIFF driver supports creation options to
control compression, and whether the file should be tiled.
May be repeated.
The creation options available vary by format driver, and some
simple formats have no creation options at all. A list of
options supported for a format can be listed with the
--formats command line option but the documentation for the
format is the definitive source of information on driver
creation options. See Raster drivers format specific
documentation for legal creation options for each format.
--overwrite
Allow program to overwrite existing target file or dataset.
Otherwise, by default, gdal errors out if the target file or
dataset already exists.
-i [<name>=]<input>
Select an input dataset to be processed. If more than one
input dataset is provided, each dataset must be prefixed with
a name to which it will will be referenced in --calc.
--calc An expression to be evaluated using the muparser math parser
library. The expression may refer to individual bands of each
input (e.g., X[1] + 3) or it may be applied to all bands of an
input (X + 3).
There are two methods by which an expression may be applied to
multiple bands. In the default method, the expression is
applied to each band individually, resulting in one output
band for each input band. For example, with a three-band input
X, the expression --calc "X+3" would be expanded into --calc
"X[1]+3" --calc "X[2]+3" --calc "X[3]+3". If the expression
contains a reference to all bands of multiple inputs, those
inputs must either have the same number of bands, or a single
band. For example, if inputs A and B each have three bands,
and input C has a single band, then the argument --calc "A + B
+ C" is equivalent to --calc "A[1] + B[1] + C[1]" --calc "A[2]
+ B[2] + C[1]" --calc "A[3] + B[3] + C[1]". Similarly, --calc
"sum(A,B,C)" would be expanded to --calc "sum(A[1], B[1],
C[1]" --calc "sum(A[2], B[2], C[1])" --calc "sum(A[3], B[3],
C[1])".
In the second method, which is enabled with --flatten,
aggregate functions (sum, avg, min, and max) invoked on
multiple bands will be applied to all bands in aggregate. In
this case, sum(A) is expanded into sum(A[1], A[2], A[3]), and
sum(A,C) is expanded into sum(A[1], A[2], A[3], C[1]). If the
expression consists _only_ of aggregate functions, this will
produce a single output band no matter how many input bands
are present. However, if the expression contains a
non-aggregate reference to all bands of an input, then one
output band will still be produced for each input band. A
simple example is the expression A / sum(A), which would
produce an N-band raster where each output band contains the
input band's fraction of the total.
Multiple calculations may be specified; output band(s) will be
produced for each expression in the order they are provided.
Input rasters will be converted to 64-bit floating point
numbers before performing calculations.
Starting with GDAL 3.12, it is also possible to use a VRT C++
pixel function (such a sum, mean, min, max) by specifying
--dialect to builtin. Arguments to functions are passed
within parentheses, like sum(k=1), min(propagateNoData=true)
or interpolate_linear(t0=1,dt=1,t=10).
--dialect muparser|builtin
Added in version 3.12.
Specify the expression engine used to interpret the value of
--calc. The default is muparser.
--flatten
Added in version 3.12.
Generate a single band output raster per expression, even if
input datasets are multiband.
For the default muparser dialect, using the name of an input
raster (let's say A) is equivalent to A[1],A[2],...,A[n]. Such
syntax works with the min, max, sum and avg muparser
functions.
For example, let's consider 2 rasters A and B with 3bands
each, then --flatten --calc "avg(A)-avg(B)" is equivalent to
--calc "avg(A[1],A[2],A[3])-avg(B[1],B[2],B[3])"
And --flatten --dialect=builtin --calc mean will compute a
single band with the average of all 4 input bands.
--no-check-extent
Do not verify that the input rasters have the same spatial
extent. The input rasters will instead be required to have the
same dimensions. The geotransform of the first input will be
assigned to the output.
--no-check-srs
Do not check the spatial reference systems of the inputs for
consistency. All inputs will be assumed to have the spatial
reference system of the first input, and this spatial
reference system will be used for the output.
--nodata
Added in version 3.12.
Set the NoData value for the output dataset. May be set to
"none" to leave the NoData value undefined. If --nodata is not
specified, gdal raster calc will use a NoData value from the
first source dataset to have one.
--propagate-nodata
Added in version 3.12.
If set, a NoData value in any input dataset used an in
expression will cause the output value to be NoData.
GDALG OUTPUT (ON-THE-FLY / STREAMED DATASET)
This program supports serializing the command line as a JSON file
using the GDALG output format. The resulting file can then be opened
as a raster dataset using the GDALG: GDAL Streamed Algorithm driver,
and apply the specified pipeline in a on-the-fly / streamed way.
Example 1: Per-band sum of three files
gdal raster calc -i "A=file1.tif" -i "B=file2.tif" -i "C=file3.tif" --calc "A+B+C" -o out.tif
Example 2: Per-dataset average of all bands of each dataset
gdal raster calc -i "A=file1.tif" -i "B=file2.tif" -i "C=file3.tif" --flatten --calc "avg(A)" --calc "avg(B)" --calc "avg(C)" -o out.tif
Example 3: Per-band maximum of three files
gdal raster calc -i "A=file1.tif" -i "B=file2.tif" -i "C=file3.tif" --calc "max(A,B,C)" -o out.tif
Example 4: Setting values of zero and below to NaN
gdal raster calc -i "A=input.tif" -o result.tif --calc="A > 0 ? A : NaN"
Example 5: Compute the average (as a single band) of all bands of two
input datasets
gdal raster calc -i A=input1.tif -i B=input2.tif -o result.tif --flatten --calc=mean --dialect=builtin
Example 6: Generate a masked aspect layer where the slope angle is
greater than 2 degrees, using nested pipelines (since GDAL 3.12.1)
gdal raster calc -i "SLOPE=[ read dem.tif ! slope ]" -i "ASPECT=[ read dem.tif ! aspect ]" -o result.tif --calc "(SLOPE >= 2) ? ASPECT : -9999" --nodata -9999
Dan Baston <dbaston@gmail.com>
1998-2026
March 20, 2026 GDAL-RASTER-CALC(1)
NAME
gdal-raster-calc - Perform pixel-wise calculations on a raster
Added in version 3.11.
SYNOPSIS
Usage: gdal raster calc [OPTIONS] <INPUTS>... <OUTPUT>
Perform raster algebra
Positional arguments:
-i, --input <INPUTS> Input raster datasets [1.. values] [required]
-o, --output <OUTPUT> Output raster dataset [required]
Common Options:
-h, --help Display help message and exit
--json-usage Display usage as JSON document and exit
--config <KEY>=<VALUE> Configuration option [may be repeated]
-q, --quiet Quiet mode (no progress bar)
Options:
-f, --of, --format, --output-format <OUTPUT-FORMAT> Output format ("GDALG" allowed)
--co, --creation-option <KEY>=<VALUE> Creation option [may be repeated]
--overwrite Whether overwriting existing output is allowed
Mutually exclusive with --append
--append Append as a subdataset to existing output
Mutually exclusive with --overwrite
--ot, --datatype, --output-data-type <OUTPUT-DATA-TYPE> Output data type. OUTPUT-DATA-TYPE=Byte|Int8|UInt16|Int16|UInt32|Int32|UInt64|Int64|CInt16|CInt32|Float16|Float32|Float64|CFloat32|CFloat64
--no-check-srs Do not check consistency of input spatial reference systems
--no-check-extent Do not check consistency of input extents
--propagate-nodata Whether to set pixels to the output NoData value if any of the input pixels is NoData
--calc <CALC> Expression(s) to evaluate [1.. values] [required]
--dialect <DIALECT> Expression dialect. DIALECT=muparser|builtin (default: muparser)
--flatten Generate a single band output raster per expression, even if input datasets are multiband
--nodata <NODATA> Assign a specified nodata value to output bands ('none', numeric value, 'nan', 'inf', '-inf')
Advanced Options:
--if, --input-format <INPUT-FORMAT> Input formats [may be repeated]
--oo, --open-option <KEY>=<VALUE> Open options [may be repeated]
DESCRIPTION
gdal raster calc performs pixel-wise calculations on one or more
input GDAL datasets. Calculations can be performed eagerly, writing
results to a conventional raster format, or lazily, written as a set
of derived bands in a VRT (Virtual Dataset).
The list of input GDAL datasets can be specified at the end of the
command line or put in a text file (one input per line) for very long
lists. If more than one input dataset is used, it should be prefixed
with a name by which it will be referenced in the calculation, e.g.
A=my_data.tif. (If a single dataset is used, it will be referred to
with the variable X in formulas.)
Starting with GDAL 3.12, it is also possible to use a VRT C++ pixel
function (such a sum, mean, min, max) by specifying --dialect to
builtin.
The inputs should have the same spatial reference system and should
cover the same spatial extent but are not required to have the same
spatial resolution. The spatial extent check can be disabled with
--no-check-extent, in which case the inputs must have the same
dimensions. The spatial reference system check can be disabled with
--no-check-srs.
Since GDAL 3.12, this algorithm can be part of a gdal pipeline or
gdal raster pipeline.
The following options are available:
-f, --of, --format, --output-format <OUTPUT-FORMAT>
Which output raster format to use. Allowed values may be given
by gdal --formats | grep raster | grep rw | sort
--co, --creation-option <NAME>=<VALUE>
Many formats have one or more optional creation options that
can be used to control particulars about the file created. For
instance, the GeoTIFF driver supports creation options to
control compression, and whether the file should be tiled.
May be repeated.
The creation options available vary by format driver, and some
simple formats have no creation options at all. A list of
options supported for a format can be listed with the
--formats command line option but the documentation for the
format is the definitive source of information on driver
creation options. See Raster drivers format specific
documentation for legal creation options for each format.
--overwrite
Allow program to overwrite existing target file or dataset.
Otherwise, by default, gdal errors out if the target file or
dataset already exists.
-i [<name>=]<input>
Select an input dataset to be processed. If more than one
input dataset is provided, each dataset must be prefixed with
a name to which it will will be referenced in --calc.
--calc An expression to be evaluated using the muparser math parser
library. The expression may refer to individual bands of each
input (e.g., X[1] + 3) or it may be applied to all bands of an
input (X + 3).
There are two methods by which an expression may be applied to
multiple bands. In the default method, the expression is
applied to each band individually, resulting in one output
band for each input band. For example, with a three-band input
X, the expression --calc "X+3" would be expanded into --calc
"X[1]+3" --calc "X[2]+3" --calc "X[3]+3". If the expression
contains a reference to all bands of multiple inputs, those
inputs must either have the same number of bands, or a single
band. For example, if inputs A and B each have three bands,
and input C has a single band, then the argument --calc "A + B
+ C" is equivalent to --calc "A[1] + B[1] + C[1]" --calc "A[2]
+ B[2] + C[1]" --calc "A[3] + B[3] + C[1]". Similarly, --calc
"sum(A,B,C)" would be expanded to --calc "sum(A[1], B[1],
C[1]" --calc "sum(A[2], B[2], C[1])" --calc "sum(A[3], B[3],
C[1])".
In the second method, which is enabled with --flatten,
aggregate functions (sum, avg, min, and max) invoked on
multiple bands will be applied to all bands in aggregate. In
this case, sum(A) is expanded into sum(A[1], A[2], A[3]), and
sum(A,C) is expanded into sum(A[1], A[2], A[3], C[1]). If the
expression consists _only_ of aggregate functions, this will
produce a single output band no matter how many input bands
are present. However, if the expression contains a
non-aggregate reference to all bands of an input, then one
output band will still be produced for each input band. A
simple example is the expression A / sum(A), which would
produce an N-band raster where each output band contains the
input band's fraction of the total.
Multiple calculations may be specified; output band(s) will be
produced for each expression in the order they are provided.
Input rasters will be converted to 64-bit floating point
numbers before performing calculations.
Starting with GDAL 3.12, it is also possible to use a VRT C++
pixel function (such a sum, mean, min, max) by specifying
--dialect to builtin. Arguments to functions are passed
within parentheses, like sum(k=1), min(propagateNoData=true)
or interpolate_linear(t0=1,dt=1,t=10).
--dialect muparser|builtin
Added in version 3.12.
Specify the expression engine used to interpret the value of
--calc. The default is muparser.
--flatten
Added in version 3.12.
Generate a single band output raster per expression, even if
input datasets are multiband.
For the default muparser dialect, using the name of an input
raster (let's say A) is equivalent to A[1],A[2],...,A[n]. Such
syntax works with the min, max, sum and avg muparser
functions.
For example, let's consider 2 rasters A and B with 3bands
each, then --flatten --calc "avg(A)-avg(B)" is equivalent to
--calc "avg(A[1],A[2],A[3])-avg(B[1],B[2],B[3])"
And --flatten --dialect=builtin --calc mean will compute a
single band with the average of all 4 input bands.
--no-check-extent
Do not verify that the input rasters have the same spatial
extent. The input rasters will instead be required to have the
same dimensions. The geotransform of the first input will be
assigned to the output.
--no-check-srs
Do not check the spatial reference systems of the inputs for
consistency. All inputs will be assumed to have the spatial
reference system of the first input, and this spatial
reference system will be used for the output.
--nodata
Added in version 3.12.
Set the NoData value for the output dataset. May be set to
"none" to leave the NoData value undefined. If --nodata is not
specified, gdal raster calc will use a NoData value from the
first source dataset to have one.
--propagate-nodata
Added in version 3.12.
If set, a NoData value in any input dataset used an in
expression will cause the output value to be NoData.
GDALG OUTPUT (ON-THE-FLY / STREAMED DATASET)
This program supports serializing the command line as a JSON file
using the GDALG output format. The resulting file can then be opened
as a raster dataset using the GDALG: GDAL Streamed Algorithm driver,
and apply the specified pipeline in a on-the-fly / streamed way.
EXAMPLES
Example 1: Per-band sum of three files
gdal raster calc -i "A=file1.tif" -i "B=file2.tif" -i "C=file3.tif" --calc "A+B+C" -o out.tif
Example 2: Per-dataset average of all bands of each dataset
gdal raster calc -i "A=file1.tif" -i "B=file2.tif" -i "C=file3.tif" --flatten --calc "avg(A)" --calc "avg(B)" --calc "avg(C)" -o out.tif
Example 3: Per-band maximum of three files
gdal raster calc -i "A=file1.tif" -i "B=file2.tif" -i "C=file3.tif" --calc "max(A,B,C)" -o out.tif
Example 4: Setting values of zero and below to NaN
gdal raster calc -i "A=input.tif" -o result.tif --calc="A > 0 ? A : NaN"
Example 5: Compute the average (as a single band) of all bands of two
input datasets
gdal raster calc -i A=input1.tif -i B=input2.tif -o result.tif --flatten --calc=mean --dialect=builtin
Example 6: Generate a masked aspect layer where the slope angle is
greater than 2 degrees, using nested pipelines (since GDAL 3.12.1)
gdal raster calc -i "SLOPE=[ read dem.tif ! slope ]" -i "ASPECT=[ read dem.tif ! aspect ]" -o result.tif --calc "(SLOPE >= 2) ? ASPECT : -9999" --nodata -9999
AUTHOR
Dan Baston <dbaston@gmail.com>
COPYRIGHT
1998-2026
March 20, 2026 GDAL-RASTER-CALC(1)