Skip to content

CLI reference: lsdtt-raster-preprocessing

Runs a configurable preprocessing pipeline on a DEM raster. Steps are applied in order; each step is optional and controlled by parameters in a plain-text parameter file.

Usage

lsdtt-raster-preprocessing <path> <parameter_file>
lsdtt-raster-preprocessing <parameter_file>         # path defaults to ./
lsdtt-raster-preprocessing -h                       # print help and exit
lsdtt-raster-preprocessing -v                       # print version and exit
lsdtt-raster-preprocessing -c                       # print citation and exit

Parameter file format

# Lines beginning with # are comments and are ignored.
key: value

Keys use snake_case. Values have no quoting requirements. All keys and their defaults are listed below.


Multipart points

point_data_fname accepts multipart geometry (MultiPoint and friends). Each feature is split into its parts on read, with the attributes copied onto each, and the split is reported in the log.

Shapefiles are the commonest source of multipart data, and versions before August 2026 discarded it silently — see Vector data.

Pipeline overview

Steps run in this order when enabled:

Step Trigger parameter
0. Mosaic input tiles mosaic_file_list
1. Projection check / reprojection always runs
2. Threshold masking min_elevation, maximum_elevation
2b. Binary mask run_binary_mask: true
2c. Clip to polygon clip_raster_to_polygon: true
3. Interior nodata interior_nodata_method: fill (later steps use the filled DEM) or write_filled_nodata_raster: true (writes the filled DEM only)
4. Clip to max-valid rectangle write_clipped_rectangle_raster: true
5. Depression breaching write_breached_raster: true or breach_before_fill: true
6. Pit filling write_fill_raster: true or write_fill_diff_raster: true
7. Depression polygons write_depression_polygons: true
8. Hillshade write_hillshade_raster: true
8b. Multidirectional hillshade write_multidirectional_hillshade_raster: true
9. Vector clipping clip_vector_data_to_raster: true

Input / output parameters

These are universal across all lsdtt3 CLIs.

Parameter Type Default Description
read_path string directory of parameter file Directory containing the input raster.
read_fname string parameter file stem Input raster filename (with or without extension).
write_path string same as read_path Directory for output files.
write_fname string same as read_fname Output filename stem.
write_output_format string cog Output raster format. cog = Cloud Optimised GeoTIFF. gtiff = plain compressed GeoTIFF. same_as_input = match the input format.

Threading

Parameter Type Default Description
n_threads int 0 Number of OpenMP threads. 0 uses all available hardware threads. 1 disables parallelism. Applies to filling, breaching, nodata repair, and wavelet steps.

Step 0: Mosaic

Merge multiple input rasters into one before any other processing. When mosaic_file_list is set, read_fname is ignored — a warning is printed if both are present. write_fname must be set explicitly when using a mosaic.

Parameter Type Default Description
mosaic_file_list string (empty) Path to a text file listing rasters to merge, one absolute path per line. Blank lines and lines beginning with # are ignored. Rasters with mismatched CRS, cell size, or misaligned origin are skipped with a warning. In overlap regions the last file in the list takes priority. Output: <write_fname>_mosaic.tif.

Step 1: Projection

The raster must be in a projected (metre-unit) CRS before analysis. This step checks the input and reprojects it if needed.

Output files produced by reprojection receive a suffix indicating the chosen CRS: _utm, _polar (NSIDC polar stereographic, used when |lat| > 75°), or _lambert (Lambert Azimuthal Equal Area, used for very wide rasters when allow_lambert_projection is true).

Parameter Type Default Description
enforce_projection bool true If true and the raster is geographic or Web Mercator, reproject it automatically. If false and the raster is unprojected, the program exits with an error.
force_reproject bool false Reproject even when the input is already in a projected CRS. Useful for converting an existing projection to the preferred UTM/polar/LAEA analysis CRS.
resampling_method string cubic GDAL resampling algorithm used during reprojection. Cubic is the default for continuous elevations; use near or mode for categorical rasters. Other options include bilinear, cubicspline, lanczos, average, max, min, med, q1, q3, sum.
grid_spacing float -1 Target grid spacing in metres after reprojection. Negative (default) = auto-estimate from input pixel size, rounded to the nearest 5 m (≥20 m inputs), 2 m (5–20 m), or 1 m (<5 m). Set a positive value to enforce a specific spacing.
force_resampling bool false If true, use forced_grid_spacing as the target spacing instead of the auto-estimated or user-supplied grid_spacing.
forced_grid_spacing float -1 Target grid spacing in metres when force_resampling is true. Must be positive.
allow_lambert_projection bool false Use Lambert Azimuthal Equal Area for rasters spanning three or more UTM zones.
warp_mem_mb int 512 GDALWarp working memory in MB. Larger values reduce source tile re-reads for large rasters. Minimum ~64 MB.

Step 2: Threshold masking

Pixels outside the elevation range are set to nodata. The masked raster is written as <write_fname>_remove_seas.tif when any pixels are changed.

Parameter Type Default Description
min_elevation float 0.0 Pixels at or below this elevation (metres) are set to nodata. The default of 0.0 removes ocean and below-sea-level artefacts common in global DEMs. Negative values apply as given (for a basin below sea level, set it just below the lowest land); -9999 disables.
maximum_elevation float 30000 Pixels above this elevation (metres) are set to nodata. Reduce to remove artefacts in low-relief study areas.

Step 2b: Binary mask

Apply an external binary raster to keep only pixels that overlap the foreground of the mask. Runs after threshold masking.

Output: <write_fname>_binary_masked.tif

Parameter Type Default Description
run_binary_mask bool false Enable binary mask application.
binary_mask_fname string (empty) Path to the binary mask raster. Any GDAL-readable single-band raster is accepted. Pixels > 0.5 are treated as foreground (keep); all others set the DEM pixel to nodata. Must cover the same extent and have the same cell size and origin as the (possibly reprojected) DEM. Required when run_binary_mask is true.

Step 2c: Clip raster to polygon

Crop the DEM to the bounding box of a polygon, and optionally mask pixels that fall outside the polygon shape.

Output: <write_fname>_polygon_clipped.tif

Parameter Type Default Description
clip_raster_to_polygon bool false Enable polygon clipping.
polygon_clip_fname string (empty) Path to the polygon vector file. Any OGR-readable polygon format is accepted (GeoPackage, FlatGeobuf, Shapefile, GeoJSON, etc.). The first layer and first polygon are used. A warning is printed if the file contains more than one polygon. Required when clip_raster_to_polygon is true.
force_rectangular_raster bool false If false (default), pixels inside the bounding box but outside the polygon shape are set to nodata. If true, all pixels within the bounding box are kept — a plain rectangular crop.
polygon_clip_rule string majority_coverage Rule for deciding whether a pixel on the polygon boundary is kept. any_coverage: pixel is kept if the polygon touches any part of it. majority_coverage: pixel is kept if its centre falls inside the polygon. full_coverage: pixel is kept only if entirely inside. Ignored when force_rectangular_raster is true.

Step 2d: Pixel replacement

Overwrite individual cells with new values, listed in a point file. Use it to blank a handful of known-bad pixels, or to correct spot elevations, without building a mask raster — run_binary_mask is the raster-driven equivalent.

Runs before breaching, filling and interior nodata filling: it is a correction to the source data, so everything downstream sees the corrected DEM. The corrected DEM is only written on its own if you ask for it.

Output: <write_fname>_pixels_replaced.tif (with write_replaced_pixels_raster)

Parameter Type Default Description
replace_pixels_fname string (empty) Point file listing pixels to overwrite. CSV, FlatGeobuf or GeoPackage. Empty disables the step.
replace_pixels_value_field string value Name of the column holding each pixel's new value.
write_replaced_pixels_raster bool false Write the DEM after replacement. Without it the corrected DEM still feeds every later stage but is not written separately.

Positions come from the geometry for vector formats. For CSV, either latitude / longitude (read as EPSG:4326) or easting / northing — x and y also work — read as being in the raster's own coordinate system.

Setting a cell to the raster's nodata value blanks it properly: the cell is marked invalid, not merely given the nodata number. That distinction matters, because a cell holding -9999 while still flagged as valid data would be treated as a very deep pit by every routing routine downstream.

Pixels that fall outside the raster, or whose value column cannot be read, are skipped with a warning rather than failing the run — so one bad row in a long list does not cost you the whole job.

Example CSV:

easting,northing,value
-121503,-2502711,-99999
 486210,  4321870,  1204.5

Step 3: Interior nodata fill

Fill nodata pixels that are completely surrounded by valid data (voids that do not touch the raster edge). Recommended before clipping to a rectangle.

Output: <write_fname>_nodata_filled.tif

Parameter Type Default Description
interior_nodata_method string sink sink: interior nodata stay nodata and flow ends there. fill: they are filled with nodata_fill_method_choice and breaching and pit filling run on the filled DEM. Nodata touching the raster edge is never filled.
write_filled_nodata_raster bool false Fill interior nodata and write the result. On its own, the later steps still use the unfilled DEM.
nodata_fill_method_choice string laplacian Filling algorithm. laplacian: smooth Dirichlet interpolation (recommended). iterative_weighted_average: faster; well-suited to thin voids.
nodata_fill_max_iter int 10000 Maximum iterations for iterative methods.

Step 4: Clip to maximum valid rectangle

Clip the raster to the largest axis-aligned rectangle that contains no nodata pixels. Running step 3 first maximises the size of this rectangle.

Output: <write_fname>_clipped_rect.tif

Parameter Type Default Description
write_clipped_rectangle_raster bool false Enable rectangle clipping and write the result.

Step 5: Depression breaching

Carve flow paths through topographic barriers to eliminate closed depressions. Breaching preserves more of the original surface than filling; it is particularly effective on lidar DEMs.

Output files:

File Trigger
<write_fname>_breached.tif write_breached_raster: true
<write_fname>_carve_diff.tif write_carve_diff_raster: true
Parameter Type Default Description
write_breached_raster bool false Write the breached DEM.
write_carve_diff_raster bool false Write the difference raster (breached minus original). Negative values show where the surface was lowered.
breach_before_fill bool false Run breaching before pit filling. The breached DEM is then used as input to the fill step. Recommended for lidar DEMs where channelised flow paths must be carved before residual pits are filled.
fill_remainder_after_breach bool true Fill pits that could not be fully breached. Used with breach_before_fill or least-cost breaching.
breach_algorithm_choice string lindsay2016 Breaching algorithm. lindsay2016: Lindsay (2016) efficient breaching. least_cost: Lindsay (2020) pit-centric least-cost breaching.
breach_lc_max_dist int 1000 Maximum search radius in pixels for least-cost breaching. Only used when breach_algorithm_choice is least_cost.
breach_lc_max_cost float unlimited Maximum total elevation lowering allowed for a breach path. Paths requiring more lowering are skipped. Only used when breach_algorithm_choice is least_cost.
breach_lc_flat_increment float 0.0 Small elevation increment added along flat breach paths to ensure drainage. Only used when breach_algorithm_choice is least_cost.

Step 6: Pit filling

Fill closed depressions so that every pixel drains to the raster edge. Run after breaching if breach_before_fill is true.

Output files:

File Trigger
<write_fname>_fill.tif write_fill_raster: true
<write_fname>_fill_diff.tif write_fill_diff_raster: true
Parameter Type Default Description
write_fill_raster bool false Write the pit-filled DEM.
write_fill_diff_raster bool false Write the difference raster (filled minus original). Positive values show where the surface was raised. For barnesetal2021 this represents water depth standing in depressions.
fill_algorithm_choice string barnes2014 Filling algorithm. barnes2014: Improved Priority-Flood (Barnes et al. 2014) — the default, and the only one that imposes fill_min_slope across flats. vincent1993: grayscale morphological reconstruction (Vincent 1993) — bit-identical to barnes2014 and 2–3× faster, but requires fill_min_slope: 0 (see below). barnesetal2021: Fill-Spill-Merge — note this algorithm does not guarantee that all depressions are filled (see doi:10.5194/esurf-9-105-2021).
fill_min_slope float 0.0001 Minimum gradient imposed between adjacent filled cells to prevent flat regions that produce ambiguous flow directions. Increase slightly for very coarse DEMs. Not used with barnesetal2021. See the note below on how this differs from RichDEM.

Note: vincent1993 is faster but cannot impose a gradient

vincent1993 computes the same fixed point as barnes2014 by a different route — two raster scans plus a FIFO drain (O(N)) instead of a priority queue (O(N log N)). It is verified bit-identical to barnes2014 across all test fixtures and degenerate cases, and is 2–3× faster (up to ~5× on real terrain with few depressions).

The catch: it fills depressions to exactly their spill level, leaving true flats. It has no mechanism for the gradient fill_min_slope imposes. Since lsdtt3's D8 router rejects a surface containing true flats, vincent1993 is only usable with fill_min_slope: 0, and the CLI will refuse to run otherwise rather than silently ignore the parameter.

Use it when you want a filled surface and are not routing flow across it, or when a downstream step will resolve the flats itself. For the normal fill-then-route workflow, stay on barnes2014.

Note that fill_pits() in the library already dispatches to reconstruction automatically whenever min_slope is zero, so the speed-up is applied without you asking for it — this parameter is for pinning the backend explicitly.

Note: fill_min_slope is a slope, and differs from RichDEM's "epsilon fill"

lsdtt3 is benchmarked against RichDEM (Benchmarking and testing in lsdtt3). Both tools offer what is loosely called an "epsilon fill", but they are not the same operation, and comparing their outputs without knowing this is misleading.

  • fill_min_slope: 0 is equivalent to RichDEM's FillDepressions(epsilon=false). Verified bit-exact against it on both a high-relief and a low-relief real DEM.
  • fill_min_slope > 0 imposes a true slope: each cell in a flat is raised by fill_min_slope × cell_size (× √2 diagonally). On a 30 m grid the default gives 3 mm of rise per cell. The gradient is uniform across the raster, scales with resolution, and does not depend on elevation or on the raster's data type.
  • RichDEM's epsilon=true instead raises each cell to the next representable floating-point value (one ULP). That step depends on elevation and data type — about 1.2e-4 m at 2000 m in float32, 7.6e-6 m at 100 m, and effectively zero near sea level. RichDEM refuses integer rasters for this reason.

What this means in practice. The two approaches agree closely in high relief and diverge in low relief, because the flat-gradient term is a negligible share of the fill in steep terrain and a dominant one in flat terrain. Measured on 256² real DEMs:

Terrain Depression fill volume Flat-gradient term Its share
Alpine (Val Venosta) 6091 m 0.56 m 0.01 %
Lakeland (Finland) 188 m 78.8 m 29.5 %

In the low-relief case lsdtt3 moves ~40× more material than RichDEM's epsilon fill. Neither is wrong — they answer the question differently — but if you work in low-relief terrain (coastal plains, glaciated shield, marsh, floodplain) be aware that fill_min_slope is doing a substantial amount of work there, and consider reducing it. The default is tuned for the steeper landscapes lsdtt3 is most often applied to.

Setting fill_min_slope: 0 removes the imposed gradient entirely, but leaves true flats whose flow directions are ambiguous. That is a reasonable choice only if the downstream analysis can tolerate them. | fill_spill_merge_rainfall_rate | float | 0.1 | Uniform rainfall depth in elevation units per cell for the Fill-Spill-Merge algorithm. Only used when fill_algorithm_choice is barnesetal2021. | | fsm_boundary_conditions | string | oooo | Boundary conditions for the depression hierarchy used by Fill-Spill-Merge, given as four characters in north–east–south–west order. o = open (edge drains freely to the ocean). n = no-flux (edge is not an ocean boundary). p = periodic (edge wraps; not ocean). Example: oooo for a typical DEM tile; nnnn for a closed basin. Only used when fill_algorithm_choice is barnesetal2021. |


Step 7: Depression polygons

Trace closed depressions identified by the fill difference raster into vector polygons. Requires that write_fill_raster or write_fill_diff_raster is also true (the fill diff must be computed).

Output: <write_fname>_depressions.<ext> (extension depends on write_vector_format)

Each polygon carries three attributes: depression_id, area_m2, volume_m3.

Parameter Type Default Description
write_depression_polygons bool false Enable depression polygon output. Automatically enables write_fill_diff_raster.
depression_min_pixels int 1 Minimum depression size in pixels. Depressions smaller than this are removed before polygon tracing.
depression_min_depth float 0.0 Minimum fill depth in metres for a cell to be included in a depression. A small positive value (e.g. 0.01) suppresses near-zero fill artefacts.
write_vector_format string flatgeobuf Output format for all vector writes. flatgeobuf or fgb: FlatGeobuf (recommended). gpkg: GeoPackage.

Step 8: Hillshade

Compute a hillshade raster using the Zevenbergen and Thorne (1987) algorithm. When pit filling is also enabled, the hillshade is computed from the filled DEM.

Output: <write_fname>_hillshade.tif

Parameter Type Default Description
write_hillshade_raster bool false Enable hillshade computation and write the result.
hillshade_azimuth float 315 Sun azimuth in degrees clockwise from north. 315° (northwest) is the standard cartographic convention.
hillshade_altitude float 45 Sun altitude above the horizon in degrees.
hillshade_z_factor float 1.0 Vertical exaggeration applied before computing the hillshade. Values greater than 1 emphasise relief in flat terrain.

Step 8b: Multidirectional hillshade

Compute a multidirectional hillshade by averaging hillshades from evenly spaced azimuth directions. This reduces directional bias and improves visual continuity of features that are only strongly illuminated from certain directions.

When pit filling is also enabled, this step uses the filled DEM (same source choice as Step 8).

Output: <write_fname>_hillshade_multidirectional.tif

Parameter Type Default Description
write_multidirectional_hillshade_raster bool false Enable multidirectional hillshade computation and write the result.
multidirectional_hillshade_n_directions int 8 Number of evenly spaced azimuth directions. Must be >= 2. Typical values: 8–16.
multidirectional_hillshade_start_azimuth float 0.0 Starting azimuth in degrees clockwise from north. Subsequent azimuths are sampled uniformly around 360°.
hillshade_altitude float 45 Sun altitude used for each direction.
hillshade_z_factor float 1.0 Vertical exaggeration used for each direction.

Step 9: Vector clipping

Clip a vector file to the bounding box of the output raster. The vector CRS need not match the raster CRS — the raster bounding box is reprojected into the vector's native CRS before clipping.

Output: <write_fname>_clipped_vector.<ext> (extension depends on write_vector_format)

Parameter Type Default Description
clip_vector_data_to_raster bool false Enable vector clipping.
vector_data_fname string (empty) Path to the input vector file. Any OGR-readable format is accepted (Shapefile, GeoPackage, FlatGeobuf, GeoJSON, etc.). Required when clip_vector_data_to_raster is true.

Example parameter file

read_path:  /data/dems/
read_fname: my_dem
write_path: /data/output/
write_fname: my_dem_preprocessed

# Projection
enforce_projection:       true
resampling_method:        cubic
grid_spacing:             -1
allow_lambert_projection: false

# Masking
min_elevation:            0.0
maximum_elevation:        30000

# Fill interior nodata voids first, then clip to a clean rectangle
write_filled_nodata_raster:    true
write_clipped_rectangle_raster: true

# Breach lidar-style DEMs, then fill residual pits
breach_before_fill:        true
breach_algorithm_choice:   lindsay2016
write_fill_raster:         true
write_fill_diff_raster:    true

# Hillshade from the filled DEM
write_hillshade_raster:    true
hillshade_azimuth:         315
hillshade_altitude:        45
hillshade_z_factor:        1.0

Parameters

This section is generated from the executable's -h json registry. Do not edit it manually.

Status: stable.

File I/O

Parameter Type Default Role Parent Description Guidance
read_path string ./ io - Directory from which input files are read. Defaults to the directory holding the parameter file.
read_fname string - io - Input filename, with or without extension (e.g. my_dem.tif). Read from read_path. lsdtt3 uses GDAL, so any GDAL-readable raster format works. If empty, defaults to the parameter filename stem.
write_path string - io - Directory to which output files are written. Defaults to read_path when not set.
write_fname string - io - Output filename prefix (no path, no extension). All outputs are named <write_fname>_<descriptor>.<ext>. Defaults to the stem of read_fname when not set.

Run control

Parameter Type Default Role Parent Description Guidance
n_threads int 0 io - Number of OpenMP threads. 0 = use all hardware threads. 1 = single-threaded. Applies to filling, breaching, nodata repair, and wavelet steps.
write_output_format string cog io - Output raster format. cog: Cloud Optimised GeoTIFF (default). gtiff: plain compressed GeoTIFF. same_as_input: match the input raster format.

Projection

Parameter Type Default Role Parent Description Guidance
enforce_projection bool true switch - Check and reproject the raster to a suitable projected CRS. If true and the raster is geographic or Web Mercator, it is reprojected automatically before any analysis. If false and the raster is not projected, the program exits with an error.
resampling_method string cubic param enforce_projection GDAL resampling algorithm used during reprojection. Cubic is the default here because this workflow reprojects continuous elevation surfaces. Use near or mode for categorical rasters. Accepted values: near, bilinear, cubic (default), cubicspline, lanczos, average, mode, max, min, med, q1, q3, sum.
grid_spacing float -1 param enforce_projection Target grid spacing in metres after reprojection. If negative (default), spacing is inferred from the input pixel size and rounded: >=20 m -> nearest 5 m; 5-20 m -> nearest 2 m; <5 m -> nearest 1 m. Set a positive value to enforce a specific spacing.
allow_lambert_projection bool false param enforce_projection Use Lambert Azimuthal Equal Area for rasters spanning 3+ UTM zones. If true and the raster is very wide (>=3 UTM zones), a LAEA projection centred on the raster is used instead of UTM. Output files receive the suffix _lambert.
warp_mem_mb int 512 param enforce_projection GDALWarp working memory in MB. Larger values reduce source tile re-reads for large rasters. Reduce on memory-constrained systems (minimum ~64 MB).
force_reproject bool false switch - Force reprojection to the recommended analysis CRS. If true, the raster is reprojected to the recommended CRS even when the input raster is already projected. This allows conversion from an existing projected CRS to the preferred UTM, polar stereographic, or Lambert Azimuthal Equal Area analysis projection.
force_resampling bool false switch - Force a user-specified grid spacing during reprojection. If true, forced_grid_spacing is used as the target grid spacing instead of the automatically estimated or user-supplied grid_spacing.
forced_grid_spacing float -1 param force_resampling Target grid spacing in metres when force_resampling is true. Must be positive when force_resampling is true. Ignored otherwise.

Oblique frame rotation

Parameter Type Default Role Parent Description Guidance
rotate_to_linear_feature bool false switch - Rotate the DEM into the oblique frame of a feature (a line, two points or a polygon). Replaces the reprojection step: the DEM is warped once, straight from its own CRS, into an oblique Mercator frame with the feature along +x (on the DEM's own datum), and every later step runs on the rotated DEM. The frame is a rectangle aligned with the feature: for a line or two points, the geodesic between the end points lengthened by the end buffer and linear_feature_rotation_width wide; for polygons, their minimum-area enclosing rectangle. Writes <write_fname>_oblique.tif and <write_fname>_oblique_rotation_frame.txt, which records the frame and the lattice to rotate products back onto (the DEM's own grid when it is projected in metres, otherwise the analysis CRS of the frame centre). Cannot be combined with rotate_to_data_footprint, force_reproject or run_rotate_back.
rotation_feature_fname string - io rotate_to_linear_feature Vector file holding the line, two points or polygon(s). Any OGR-readable format with a CRS; it is reprojected to the DEM's own geographic CRS. Refused before any warp: no CRS, a mix of geometry kinds, one point or more than two, a closed line (use a polygon), or end points less than three cells apart.
rotation_feature_path string - io rotate_to_linear_feature Optional directory for rotation_feature_fname. If empty, read_path is used. Ignored when rotation_feature_fname is an absolute path.
rotation_feature_layer string - io rotate_to_linear_feature Layer name within rotation_feature_fname. If empty, the first layer is used (with a warning when the file has more than one).
linear_feature_rotation_width float 0.0 param rotate_to_linear_feature Full width (m) of the frame across a line or two points, centred on it. Required (> 0) for a line or two points. Ignored, with a warning, for polygons, whose own short side is the width.
linear_feature_rotation_end_buffer float -1.0 param - Buffer (m) added beyond each end of the frame axis. -1 means 10 grid cells. For polygons and rotate_to_data_footprint it is added on all four sides.
rotate_to_data_footprint bool false switch - Rotate the DEM into the frame of its own valid cells. The frame is the minimum-area rectangle enclosing the DEM's valid cells (the polygon rule of rotate_to_linear_feature applied to their convex hull), so an elongated DEM is turned to lie along +x with as little nodata as possible. Outputs and frame file as rotate_to_linear_feature. Cannot be combined with rotate_to_linear_feature, force_reproject or run_rotate_back.

Rotate back

Parameter Type Default Role Parent Description Guidance
run_rotate_back bool false switch - Warp rasters from an oblique frame back onto the frame file's target lattice. A separate mode: no other preprocessing step runs, and switching one on in the parameter file is refused. Each raster in rotate_back_file_list is written to write_path as <its name>_rotated_back.tif. A raster at the frame's cell size goes to the target cell size, any other keeps its own; the output lattice is anchored at the target origin, so after rotate_to_linear_feature or rotate_to_data_footprint on a projected DEM the products land on the source DEM's own pixels. A raster not in the frame CRS is refused. Vector outputs need no rotating back: they carry their CRS.
rotation_frame_fname string - io run_rotate_back The rotation frame file (<stem>_rotation_frame.txt). Relative paths are taken from read_path. If empty, the frame is rebuilt from each raster's own CRS and the target is the analysis CRS of the frame centre on the lattice anchored at (0, 0), with a warning: a source DEM origin off that lattice cannot be recovered without the frame file.
rotate_back_file_list string - io run_rotate_back Text file listing the rasters to rotate back, one per line. Each line is a raster path, optionally followed by a comma and a resampling method (path,near); use near for categorical rasters (basins, junctions, masks, lithology). Blank lines and lines starting with # are skipped. The list and relative raster paths are taken from read_path.
rotate_back_resampling_method string bilinear param run_rotate_back Resampling method for list lines that do not give one. near, bilinear (default), cubic, cubicspline, lanczos, average, mode, max, min, med, q1, q3, sum.
rotate_back_epsg int 0 param run_rotate_back EPSG code overriding the frame file's target CRS (0: the frame file's). A CRS other than the frame file's target is gridded on the lattice anchored at (0, 0), with a warning.

Vertical units

Parameter Type Default Role Parent Description Guidance
vertical_units string metres param - Vertical unit of the input elevations: metres, feet or us_survey_feet. NO raster format records the vertical unit, so this CANNOT be detected and is NEVER applied automatically. Much US state lidar is delivered as NAVD88 FEET on a metre UTM grid; left uncorrected every slope, curvature and relief is too large by 3.28. Establish the vertical datum from the data provider before setting this - a wrong setting silently corrupts correct data. The tool warns when slopes look implausible.
check_vertical_units_against_usgs bool true param - When the slope-plausibility warning fires, query USGS 3DEP to settle whether the elevations are metres or feet. Plausibility can only FLAG a suspicious DEM; an external reference SETTLES it, because nothing but a unit error puts a DEM 3.28x off a national elevation dataset. Runs ONLY if the warning fires AND the DEM sits in US coverage - which is not the limitation it appears, since feet-on-a-metre-grid is a US delivery convention. Sends 5 pixel coordinates to epqs.nationalmap.gov. Set false to keep the run offline. Nothing is ever converted automatically.

Threshold masking

Parameter Type Default Role Parent Description Guidance
min_elevation float 0 param - Cells at or below this elevation (m) become nodata before any analysis. -9999 disables. For removing the sea, which many DEMs store as valid cells at about 0 m, and nodata stored as 0 (a block of zeros beside real terrain is a cliff that captures flow paths). Removed cells that touch the DEM edge act as an open boundary, so a river reaching the coast drains off the DEM there. Negative values apply as given: where land lies below sea level (fens, polders, Death Valley -86 m, the Dead Sea -430 m) set it just below the lowest land, or below the sea surface of the DEM, so that flow is still routed over the sub-zero land. -9999 (or lower) disables.
maximum_elevation float 30000 param - Pixels above this elevation (metres) are set to nodata. Default covers the full range of terrestrial elevations. Reduce to remove artefacts in low-relief study areas.

Sea mask

Parameter Type Default Role Parent Description Guidance
sea_mask_fname string - param - Vector file of sea (or land) polygons, or a coastline: the sea becomes nodata. Empty = off. For DEMs with land below 0 m (a coastal DTM with a large tidal range, reclaimed land), where min_elevation would remove real land: set min_elevation to -9999 and give the sea as a vector. Relative to read_path unless absolute; any OGR format and CRS (reprojected); only features meeting the DEM are read, so a national file is fine. Polygons: cells whose centre is inside. Lines (need not be closed): the sea is what a flood from the sea side of the lines reaches without crossing them; if it reaches the land side (a gap, or lines that do not cross the DEM) the sea side within sea_mask_max_distance_metres is used instead, and the log says so. The removed sea is always an outlet: interior_nodata_method fill never refills it. A file with both polygons and lines is refused.
sea_mask_layer string - param sea_mask_fname Layer of sea_mask_fname to read (empty: the first). -
sea_mask_side_choice string auto param sea_mask_fname Which side of the vector is sea: auto, sea_inside, land_inside, sea_left, sea_right. sea_inside / land_inside for polygons; sea_left / sea_right for lines, looking along the direction they were digitised (OpenStreetMap coastlines have the land on the left: sea_right). auto decides from the DEM and logs the evidence: the side whose cells are already nodata much more often, else the side with the lower median elevation (by at least 0.5 m); for lines per line part, from the cells within 3 cells of it. auto refuses when neither tells the sides apart.
sea_mask_max_distance_metres float 500 param sea_mask_fname Lines only: the fallback after a leak, the sea side within this distance (m) of the lines. -
write_sea_mask_raster bool false switch sea_mask_fname Write the sea mask: 1 = sea, 0 = land (<write_fname>_sea_mask.tif). -

Binary mask

Parameter Type Default Role Parent Description Guidance
run_binary_mask bool false switch - Apply an external binary mask raster to the DEM. Loads the raster at binary_mask_fname and calls raster_mask_by_binary_keep: pixels where the mask > 0.5 are kept; all others are set to nodata. The mask must cover the same spatial extent and have the same cell size and origin as the (possibly reprojected) DEM. Runs after threshold masking. Output suffix: _binary_masked.tif
binary_mask_fname string - param run_binary_mask Full path to the binary mask raster. Any GDAL-readable single-band raster is accepted. Pixels > 0.5 are treated as keep (foreground); all others set the DEM pixel to nodata. Required when run_binary_mask = true.

Interior nodata filling

Parameter Type Default Role Parent Description Guidance
write_filled_nodata_raster bool false switch - Write a DEM with interior nodata pixels filled. Only fills nodata pixels completely surrounded by valid data. Does not fill nodata that touches the raster edge. Uses nodata_fill_method_choice. On its own this only writes the file; set interior_nodata_method: fill to also use the filled DEM in the later steps (breaching, pit filling).

Interior nodata

Parameter Type Default Role Parent Description Guidance
interior_nodata_method string sink param - How nodata pixels inside the DEM are treated: sink or fill. Interior nodata are nodata pixels not connected to the raster edge through other nodata (isolated voids, moulins, masked lakes). sink (the default, unchanged behaviour): they are outlets, so flow that reaches them ends there, as at the DEM edge; use this for real internal drainage (e.g. moulins on an ice sheet). fill: they are interpolated with nodata_fill_method_choice before any filling or routing, so flow passes across them; use this for data voids. Nodata connected to the edge (e.g. sea removed by min_elevation) is never filled and always acts as an open boundary.
nodata_fill_method_choice string laplacian param interior_nodata_method=fill Method for filling interior nodata pixels. laplacian: smooth Dirichlet interpolation (recommended). iterative_weighted_average: fast, well-suited to thin voids. Used when interior_nodata_method is fill.
nodata_fill_max_iter int 10000 param interior_nodata_method=fill Maximum iterations for iterative nodata fill methods. Used when interior_nodata_method is fill.

Clip to rectangle

Parameter Type Default Role Parent Description Guidance
write_clipped_rectangle_raster bool false switch - Write a DEM clipped to the largest rectangle of all-valid pixels. Run write_filled_nodata_raster first to maximise the rectangle size.

Depression breaching

Parameter Type Default Role Parent Description Guidance
write_breached_raster bool false switch - Write a depression-breached DEM. Use breach_algorithm_choice to select the algorithm.
write_carve_diff_raster bool false switch - Write the difference raster: breached minus original. Negative values show where breaching lowered the surface.
breach_before_fill bool false switch - Breach depressions before filling pits. Recommended for lidar DEMs where channelised flow paths must be carved before residual pits are filled.
fill_remainder_after_breach bool true param breach_before_fill Fill pits that could not be fully breached. Only used when breach_algorithm_choice is least_cost. If cells without a downslope neighbour remain after the breach, they are filled with fill_min_slope and fill_flat_resolution_choice, as the barnes2014 pit fill would, so the breached DEM is routable.
breach_algorithm_choice string lindsay2016 param write_breached_raster Algorithm for depression breaching. lindsay2016: Lindsay (2016) efficient breaching. least_cost: Lindsay (2020) pit-centric least-cost breaching.
breach_lc_max_dist int 1000 (outlet) / 100 (whitebox) param write_breached_raster Maximum breach path length in cells for least-cost breaching. Counted in steps from the pit (a diagonal step counts as one), not as a radius. Pits that need a longer path are left unbreached (and filled if fill_remainder_after_breach is true). 1 to 32767. If not set, 1000 with breach_lc_edge_policy outlet (long enough to bridge large water bodies, so a far-off pit is not carved to the nearest raster edge instead) and 100 with whitebox (the WhiteboxTools default; longer paths there can carve across divides). Only used when breach_algorithm_choice is least_cost.
breach_lc_max_cost float unlimited param write_breached_raster Maximum cost of a least-cost breach path. The cost of a path is the depth each cell on it is lowered, summed: metres when breach_lc_minimize_dist is false; with breach_lc_minimize_dist true each step is weighted by its length in cells (1 or 1.414), so the units are metres x cells. A pit whose cheapest path costs more is left unbreached. Only used when breach_algorithm_choice is least_cost.
breach_lc_minimize_dist bool false param write_breached_raster Weight least-cost breach paths by their length. false: a path costs the total depth lowered (m), so the search prefers shallow cuts however long. true: each step is weighted by its length in cells, favouring shorter paths; breach_lc_max_cost is then in metres x cells. Only used when breach_algorithm_choice is least_cost.
breach_lc_edge_policy string outlet param write_breached_raster Whether a least-cost breach may drain off the raster edge. outlet: the raster edge is an outlet, like a nodata cell, so a pit near the edge can breach straight off the grid. whitebox: the edge is not an outlet (as in WhiteboxTools), so a breach must reach an edge cell that is already low enough, which can carve deep cuts across divides near the edge. Only used when breach_algorithm_choice is least_cost.
breach_lc_flat_increment float 0.0 param write_breached_raster Elevation drop (m) per cell along a least-cost breach channel. 0 or less selects the automatic value: twice the float32 spacing at the largest absolute elevation in the DEM (e.g. 2.4e-4 m for elevations of 1024-2047 m), the smallest drop that keeps the channel strictly downhill. Only used when breach_algorithm_choice is least_cost.

Smoothing

Parameter Type Default Role Parent Description Guidance
smooth_algorithm_choice string none param - Edge-preserving smoothing applied BEFORE breaching and filling: none, perona_malik or coherence_diffusion. For work that reads heights off surfaces - terrace treads, valley floors, anything the fluvial-surface ladder bands - the riser is the signal, not the noise. A mean or Gaussian filter removes DEM noise and the tread/riser break in equal measure, which moves every height break downstream. Perona-Malik (1990) diffuses within a facet and stops at a gradient above K, so the riser survives. It is a CONDITIONING step: the smoothed raster is written as its own file and everything downstream should read that, so which DEM an analysis ran on is visible rather than inferred.
perona_malik_iterations int 10 param - Explicit diffusion timesteps. More iterations remove more within-facet noise. The riser is preserved at every count, so this trades runtime against how quiet the treads become rather than against how much structure survives.
perona_malik_lambda float 0.20 param - Diffusion timestep. Must be in (0, 0.25]. 0.25 is the stability limit of the explicit 4-neighbour stencil. A value above it is REJECTED rather than warned about: an unstable run does not give a worse DEM, it gives a meaningless one.
perona_malik_conductance string exponential param - Conductance function: exponential or quadratic. exponential is exp(-(s/K)^2), Perona & Malik eq. 3, and falls away faster above K, so it preserves a sharp riser more strictly. quadratic is 1/(1+(s/K)^2), eq. 4, which keeps diffusing weakly across strong edges and is the gentler choice on a noisy DEM.
perona_malik_k_quantile float 0.90 param - Quantile of the DEM's own neighbour-difference distribution used to set the edge threshold K. 0 = state K directly instead. K is in metres of rise between adjacent cells, the same units as the differences the stencil takes - not a central-difference gradient, which averages across two cells and so cannot see the one-cell noise the diffusion does. A K carried over from another landscape means nothing, so following Black et al. (1998) it is read off the distribution of the DEM in hand. The value actually used is printed.
perona_malik_k_metres_per_cell float 0 param - Edge threshold K stated directly, in metres of rise per cell. Only read when perona_malik_k_quantile is 0. Use this to pin K across a set of DEMs that must be conditioned identically; the quantile would otherwise give each one its own.
write_stencil_difference_raster bool false output - Write the neighbour-difference raster (metres) K was read from. Per cell, the largest absolute elevation difference to a valid 4-neighbour - the exact quantity the conductance is evaluated on. Write it the first time a DEM is conditioned: a quantile is only interpretable against the distribution it was taken from.
coherence_iterations int 10 param - Coherence-enhancing diffusion steps. More iterations bridge longer breaks along a feature and smooth further within a facet.
coherence_time_step float 0.15 param - Diffusion timestep tau. Must be in (0, 0.25]. Same explicit-stencil stability limit as perona_malik_lambda, and rejected the same way.
coherence_derivative_radius_metres float 0 param - Gradient pre-smoothing radius before the structure tensor is formed. 0 = one cell. Defaults are stated in CELLS, not metres, because a radius that is sensible on 1 m lidar is sub-pixel on 30 m COP30 and the structure tensor then has nothing to integrate over.
coherence_integration_radius_metres float 0 param - Structure-tensor integration radius. 0 = three cells. This sets the length scale over which a feature has to look linear before the filter will smooth along it. Too small and every noisy streak reads as coherent; too large and a curving riser stops registering as one feature. See the note on cells vs metres under coherence_derivative_radius_metres.
coherence_contrast float 0.2 param - Coherence contrast C: how selective the along-feature smoothing is. The coherence it is compared against is normalised to [0, 1], so C is scale-invariant and transfers between DEMs. Raise it to smooth only the most coherent threads; lower it to smooth more of the field.
coherence_min_diffusivity float 0.001 param - Across-feature diffusivity floor, in (0, 1). The eigenvalue perpendicular to the feature. Near zero means no smoothing at all across a riser, which is the point; raise it only to deliberately soften the across-feature behaviour.

Pit filling

Parameter Type Default Role Parent Description Guidance
write_fill_raster bool false switch - Write a pit-filled DEM. Use fill_algorithm_choice to select the algorithm.
write_fill_diff_raster bool false switch - Write the difference raster: filled minus original. Positive values show where filling raised the surface.If fill_agorithm_choice is barnesetal2021, this represents the water depth standing in topographic depressions.
priority_flood_queue string binary param write_fill_raster Spill-queue backend for Barnes 2014 filling. binary (default) uses the historic heap. radix uses the equivalent hybrid radix queue. Only used when fill_algorithm_choice is barnes2014.
fill_min_slope float 0.0001 param write_fill_raster Minimum gradient imposed between adjacent filled cells. Prevents flat regions that cause ambiguous flow direction. Increase slightly for very coarse DEMs. This does not apply to fill-spill-merge. Under fill_flat_resolution_choice barnes2014b_gradient it is the minimum gradient across flats; barnes2014b_float_step ignores it.
fill_flat_resolution_choice string inline_gradient param - How flats are made drainable: inline_gradient, barnes2014b_gradient or barnes2014b_float_step. inline_gradient (default, unchanged): the Priority-Flood fill imposes fill_min_slope during the flood. The barnes2014b options make flow converge across flats (Barnes et al. 2014, doi:10.1016/j.cageo.2013.01.009). barnes2014b_gradient uses fill_min_slope (m/m, must be > 0) as the minimum gradient; flats are raised about 3-4x more, capped below their rims, and capped flats are reported. barnes2014b_float_step is equivalent to RichDEM ResolveFlats on float32 in its first pass: it ignores fill_min_slope and its slopes depend on elevation (of order ULP(z) / cell size). With either barnes2014b option the result is always routable: cells the first pass leaves without a lower neighbour are refilled and resolved again (up to 4 rounds), and any still left are raised by a final priority-flood pass by one float32 step each; the report gives the rounds and the cells changed after the first pass.
fill_spill_merge_rainfall_rate float 0.1 param write_fill_raster Uniform rainfall depth in elevation units per cell for fill-spill-merge flow routing (Barnes et al., 2021). Spatial patterns in rainfall to route into and over depressions are not currently supported.
fsm_boundary_conditions string oooo param write_fill_raster Boundary conditions for the depression hierarchy (north east south west). Four characters, one per edge: o = open (cells on this edge drain freely to the ocean, default). b = forced baselevel outlet (same as o for hierarchy purposes). n = no-flux (edge is NOT an ocean boundary). p = periodic (edge wraps; NOT an ocean boundary). Example: oooo = all four edges are open ocean (typical for a DEM tile). Example: nnnn = closed basin (no edge is ocean; requires interior pits).

Filling

Parameter Type Default Role Parent Description Guidance
fill_algorithm_choice string barnes2014 param - Depression filling algorithm. barnes2014: Improved Priority-Flood (Barnes et al. 2014). The default. Imposes fill_min_slope across flats so the filled surface is routable. vincent1993: grayscale morphological reconstruction (Vincent 1993). Produces a BIT-IDENTICAL result to barnes2014 and is 2-3x faster, but fills to exactly the spill level and so requires fill_min_slope: 0 -- it cannot impose a gradient across flats, and lsdtt3's D8 router will reject a surface with true flats. barnesetal2021: Fill-Spill-Merge (https://doi.org/10.5194/esurf-9-105-2021); note this distributes a finite rainfall volume and does not guarantee all depressions are filled.

Output

Parameter Type Default Role Parent Description Guidance
write_vector_format string flatgeobuf io - Vector output format: flatgeobuf or gpkg. Governs every vector layer this tool writes. FlatGeobuf is preferred: it is compact, carries its own georeferencing, and does not have GeoPackage's problems writing across drives (a common WSL2 situation). CSV is available only through selectors for point/table outputs. Per-output overrides exist only where a container genuinely differs. Raster outputs are governed separately by write_output_format.

Pixel replacement

Parameter Type Default Role Parent Description Guidance
replace_pixels_fname string - param - Point file listing pixels to overwrite with new values. CSV, FlatGeobuf or GeoPackage. Positions come from geometry, or from latitude/longitude, or from easting/northing in the raster CRS. The replacement value is read from the column named by replace_pixels_value_field. Setting a cell to the raster's nodata value marks it nodata rather than merely writing the number. Applied before breaching, filling and nodata filling.
write_replaced_pixels_raster bool false switch replace_pixels_fname Write the DEM after pixel replacement. Without this the corrected DEM is still used by every later stage, but is not written on its own. Set it when the corrected DEM is the thing you want.
replace_pixels_value_field string value param replace_pixels_fname Column holding the replacement value. Named field in replace_pixels_fname giving the new value for each listed pixel.

Sink candidates

Parameter Type Default Role Parent Description Guidance
write_sink_candidates bool false switch - Write a point layer of candidate internally drained sinks. Finds closed depressions that never drain to the DEM edge and writes them for review in a GIS. Pass the reviewed file to lsdtt-internal-drainage to route flow into the accepted sinks. Output format follows write_vector_format.
sink_candidate_min_pixels int 1 param write_sink_candidates Minimum sink size in pixels. Closed depressions smaller than this are not reported. Raise it to suppress DEM noise on rough surfaces.

Depression polygons

Parameter Type Default Role Parent Description Guidance
write_depression_polygons bool false switch - Write a vector polygon layer of topographic depressions, based on the fill diff raster. Each polygon carries depression_id, area_m2, and volume_m3 attributes. Output format is controlled by write_vector_format.
depression_min_pixels int 1 param write_depression_polygons Minimum depression size in pixels. Depressions with fewer pixels than this are removed before polygon tracing. Useful for suppressing single-cell fill artefacts.
depression_min_depth float 0.0 param write_depression_polygons Minimum fill depth in metres for a cell to be considered a depression. Cells where fill_diff <= this value are treated as background. A small positive value (e.g. 0.01) suppresses near-zero fill artefacts.

Hillshade

Parameter Type Default Role Parent Description Guidance
write_hillshade_raster bool false switch - Write a hillshade raster. Uses the Zevenbergen and Thorne (1987) algorithm. Computed from the filled DEM when write_fill_raster is also true.
hillshade_azimuth float 315 param write_hillshade_raster Sun azimuth in degrees clockwise from grid north (grid up). 315 (northwest) is the cartographic convention. It is relative to the raster grid, so in an oblique frame it lights from the frame's north-west.
hillshade_altitude float 45 param write_hillshade_raster Sun altitude above the horizon in degrees. 45 degrees is a typical default.
hillshade_z_factor float 1.0 param write_hillshade_raster Vertical exaggeration factor applied before computing hillshade. Values greater than 1 emphasise relief in flat terrain.
write_multidirectional_hillshade_raster bool false switch - Write a multidirectional hillshade raster. Computes hillshade from multiple azimuths and writes the mean illumination raster to reduce directional bias.
multidirectional_hillshade_n_directions int 8 param write_multidirectional_hillshade_raster Number of evenly spaced azimuth directions used for multidirectional hillshade. Must be >= 2. Typical values are 8 to 16.
multidirectional_hillshade_start_azimuth float 0.0 param write_multidirectional_hillshade_raster Starting azimuth in degrees clockwise from grid north for multidirectional hillshade. Subsequent azimuths are sampled uniformly around 360 degrees.

Mosaic

Parameter Type Default Role Parent Description Guidance
mosaic_file_list string - switch - Path to a text file listing rasters to mosaic (one path per line). If set, the listed rasters are merged into a single output raster before any other preprocessing step. Rasters with a different CRS, cell size, or pixel-misaligned origin are skipped with a warning. Blend semantics: last valid pixel wins (later files take priority over earlier ones in overlap regions, matching gdal_merge.py default). The mosaic is written to write_path/write_fname_mosaic.tif and used as the input DEM for all subsequent pipeline steps. Lines starting with # and blank lines are ignored in the file list.

Vector clipping

Parameter Type Default Role Parent Description Guidance
clip_vector_data_to_raster bool false switch - Clip a vector file to the bounding box of the output raster. The vector CRS need not match the raster CRS - the raster bbox is reprojected into the vector's native CRS before clipping. Set vector_data_fname to the path of the input vector file.
vector_data_fname string - param clip_vector_data_to_raster Path to the input vector file to clip. Any OGR-readable format is accepted (Shapefile, GeoPackage, FlatGeobuf, GeoJSON, etc.). Required when clip_vector_data_to_raster is true.

Clip raster to polygon

Parameter Type Default Role Parent Description Guidance
clip_raster_to_polygon bool false switch - Crop the DEM to the minimum bounding box of a polygon. The DEM is cropped to the smallest axis-aligned rectangle that contains the polygon, in the raster's own CRS. Pixels outside the polygon are also set to nodata unless force_rectangular_raster is true. If the file contains more than one polygon, a warning is issued and only the first polygon is used. Set polygon_clip_fname to the path of the polygon file. Output suffix: _polygon_clipped.tif
polygon_clip_fname string - param clip_raster_to_polygon Path to the polygon vector file used to clip the DEM. Any OGR-readable polygon format is accepted (GeoPackage, FlatGeobuf, Shapefile, GeoJSON, etc.). The first layer and first polygon are used. Required when clip_raster_to_polygon is true.
force_rectangular_raster bool false param clip_raster_to_polygon When clipping to a polygon, keep all data inside the bounding box. If false (default), pixels that fall inside the bounding box but outside the polygon shape are set to nodata. If true, all pixels within the bounding box are kept regardless of whether they fall inside the polygon - the output is a plain rectangular crop. Only used when clip_raster_to_polygon is true.
polygon_clip_rule string majority_coverage param clip_raster_to_polygon Pixel inclusion rule when masking by the polygon shape. Only used when clip_raster_to_polygon is true and force_rectangular_raster is false. any_coverage: pixel is kept if the polygon touches any part of it. majority_coverage: pixel is kept if the polygon centre falls inside (approximately 50% coverage, default). full_coverage: pixel is kept only if the polygon covers it fully.

Point sampling

Parameter Type Default Role Parent Description Guidance
sample_rasters_to_points bool false switch - Sample a list of rasters onto a point dataset. Reads a point dataset and a CSV file with columns raster,attribute. Each raster is sampled at each point and written as a new attribute in an output point file.
point_data_fname string - param sample_rasters_to_points Path to the input point dataset. Recommended input is an OGR-readable point vector file such as FlatGeobuf, GeoPackage, Shapefile, or GeoJSON. CSV latitude/longitude support can also be added, but vector input is the cleanest first implementation because existing attributes are preserved.
point_data_layer_name string - param sample_rasters_to_points Optional layer name for the input point dataset. If empty, the first layer is used, or the only layer if the file has one.
raster_attribute_fname string - param sample_rasters_to_points CSV file listing rasters to sample, with columns raster,attribute. The raster column gives the raster filename or path. The attribute column gives the name of the output attribute to append to the point file.