Airborne Laser Bathymetry application: Range/Refraction correction at Pielach River, Austria

Introduction to Refraction Correction

Airborne Laser Bathymetry (ALB) is a technique for measuring the depths of relatively shallow waters. It is a two-media measurement process since the laser beam has to travel both through air and water before it gets reflected from the bottom of a water body. This fact has an important impact on the accuracy of the derived depths because the propagation velocity of the laser beam differs in air and water. Thus, the laser echoes penetrating into the water column need to be corrected according to Snell's law (or law of refraction), and this is the so-called range/refraction correction. For the determination of these corrections, a water surface model is required which can either be generated based on the available ALB data or be a constant height value (e.g. lakes). For more information on the principle of the refraction correction, please refer to the documentation of Module Snellius and the related literature.

Study area and description of data

The study area is located at the lower course of the pre-alpine Pielach River between Loosdorf and Melk (see Fig. 1). The Pielach River is a gravel river and it is situated in the Lower Austrian Alpine foreland. After a 70 km run with a source-to-outlet height difference of 775 m, it discharges into the Danube River near Melk.

The ALB data that are used for the present use case where captured with the Riegl RIEGL VQ-880-G topo-bathymetric laser scanner operating at the wavelength of 532 nm. This instrument carries out range measurements for high resolution surveying of underwater topography with a narrow, visible green laser beam. The flight was performed on October 16, 2014, after a 30-years flood that occurred in May 2014. In addition, the flying altitude was 600 m resulting in a laser footprint diameter on the ground of 60 cm.

All the necessary data as well as the Python script that is going to be mentioned later on, can be downloaded as a zip folder from the OPALS download page. After the download, extract the data to a directory of your choice.

Fig. 1: Study area Neubacher Au, Pielach River, Lower Austria

Data Processing

The processing of the data consists preprocessing (i.e. filtering of "flying points" in the atmosphere), the derivation of the water surface model, and the range/refraction correction of the raw laser echoes. Finally, the results are visualized to enable the comparison of the two point clouds and the inspection of the results.

Filtering of the raw ALB point cloud

The first (pre)processing step is the removal of the so-called "flying points". These are occasional points in the atmosphere or even under the terrain, caused by birds, dust or other particles. They are considered as outliers and thus they should be excluded from the point cloud. It can be achieved by running the following sequence of commands:

opalsImport -inFile 20141016_Pielach.laz -iFormat LAS_1.2_ew.xml -trjFile 20141016_Pielach_trj.txt -tFormat trajectoryAscii.xml -storeBeamInfo BeamVector
opalsAddInfo -inFile 20141016_Pielach.odm -searchRadius 3 -searchMode d3 -neighbours 5 -attribute "Classification = count(n) <= 3 ? 64 : Classification"
opalsExport -inFile 20141016_Pielach.odm -outFile 20141016_Pielach_filtered.odm -filter "Generic[Classification!=64]"

The determination of the intersection of the laser beam with the water surface model requires the storage of the beam vector. Thus, the trajectory file (20141016_Pielach_trj.txt) is considered during the import of the point cloud and the beam vector is stored as attributes BeamVectorX, BeamVectorY and BeamVectorZ. Then, opalsAddInfo module is used to classify the "flying" points (classification id = 64). The classification was performed based on the number of points in a sphere of 3 meters radius around each point. A point is considered as an outlier if less the 3 m sphere contains less than 4 points. The cleaned point cloud is finally exported to a new ODM using a filter in opalsExport. The total number of points removed for the present point cloud was 712 out of over 10 million points.

Derivation of Digital Water Surface Model (WSM)

As it was already mentioned, a Digital Water Surface Model is required for the range/refraction correction. The WSM serves as the basis for range and refraction correction of the water echoes based on Snell's law. All points below this surface are classified either as water body or bottom and the corresponding corrections are calculated, while for the points above the water table no correction is needed. In the present use case, this model was derived by using the qpals WaterSurfaceModeler, part of the qpals Plugin.

In short, the Water Surface Modeler uses the 3D LiDAR point cloud and the river axis as input and it extracts cross sectional slices perpendicular to this axis. Then, the operator manually defines the water level height and the lateral extent for all of the sections in a simple graphical editor. The final result of this processing step is the WSM stored as a regular grid in GeoTiff file format.

In Fig. 2, the graphical editor of the Water Surface Modeler is shown. The water level heights as well as the lateral extents were defined for most of the sections along the river axis within the study area. The final water surface model was derived by the plugin (water_surface.tif in the zip folder) and is presented in Fig. 3 together with the gridded 3D LiDAR point cloud.

Fig. 2: Graphical User Interface of qpalsWSM. Example of a sectional slice (center: 2D, right: 3D)
Fig. 3: Final product of WSMT - Water Surface Model of part of Pielach River

Determination of range/refraction corrections

After the water surface model is derived, opalsSnellius can be applied directly to the (preprocessed) ALB point cloud to calculate the range/refraction corrections of the points that were obtained from the body of the river or its bottom. Simply run:

opalsSnellius -inFile 20141016_Pielach_filtered.odm -refModel water_surface.tif -outFile 20141016_Pielach_filtered_corr.odm

If the parameter outFile is specified, the output ODM contains the range/refraction corrected X,Y, Z coordinates of the point cloud. Otherwise, the corrections are stored in the input ODM as additional attributes _REFCORRX, _REFCORRY and _REFCORRZ, respectively. In addition to that, the water depth is stored for each water echo (attribute WaterDepth) both in the input and output ODM. As no user defined refractive index is specified, the default value (nwater=1.33) is used.

Visualisation of results

Finally, the results of the range/refraction corrections are visualized. An effective way to highlight the effect of the refraction correction is to plot the two point clouds (original and corrected) section-wise based on a pre-defined reference axis. Here, this axis is the same as the one used for the derivation of the WSM. In addition, it is useful to plot the water surface as well. In order to do so, first import the WSM into an ODM:

opalsImport -inFile water_surface.tif

The sections can either be derived using opalsSection or the Python script, which is an adapted version of the Python script from the $OPALS_ROOT/demo/ directory. Fig. 4 illustrates two examples of these sections:

Fig. 4: Cross-sectional view of the water surface (blue) and the raw (red) and corrected ALB point cloud (green) for two river sections

From this figure one can notice that the points of the on or above the water surface are identical, since no range/refraction correction is needed. In addition, the corrections increase with the water depth. Note that the water level (blue points) changes along the axis and this is the reason why it differs between the two graphs.

Another way to inspect the results is to calculate and visualize the height differences between the original and the corrected point cloud. Run the following commands to derive the DEM difference model shown in Fig. 5:

opalsGrid -inFile 20141016_Pielach_filtered.odm -gridSize 0.1 -interpolation movingPlanes -searchRadius 1
opalsGrid -inFile 20141016_Pielach_filtered_corr.odm -gridSize 0.1 -interpolation movingPlanes -searchRadius 1
opalsAlgebra -inFile 20141016_Pielach_filtered_z.tif 20141016_Pielach_filtered_corr_z.tif -formula "r[0] && r[1] ? r[0]-r[1] : invalid" -outFile diff.tif
opalsHisto -inFile diff.tif -sampleRange -0.5 0.5
opalsZColor -inFile diff.tif -palFile colorBrewer_PuBuPal.xml -scalePal -0.3,0
Fig. 5: Difference between the original and the corrected DEM


Mandlburger, G., Pfennigbauer, M., & Pfeifer, N. (2013). Analyzing near water surface penetration in laser bathymetry – A case study at the River Pielach. ISPRS Ann. Photogramm. Remote Sens. Spatial Inf. Sci. ISPRS Annals of Photogrammetry, Remote Sensing and Spatial Information Sciences, II-5/W2, 175-180. doi:10.5194/isprsannals-ii-5-w2-175-2013

Mandlburger, G., Hauer, C., Wieser, M., Pfeifer, N. (2015). Topo-Bathymetric LiDAR for Monitoring River Morphodynamics and Instream Habitats - A Case Study at the Pielach River. Remote Sens. 2015, 7, 6160-6195.

opalsSnellius is the executable file of Module Snellius
Definition: ModuleExecutables.hpp:208
@ movingPlanes
moving (tilted) plane interpolation
opalsAddInfo is the executable file of Module AddInfo
Definition: ModuleExecutables.hpp:8
@ tFormat
file format of the trajectory file (opalsImport)
opalsAlgebra is the executable file of Module Algebra
Definition: ModuleExecutables.hpp:13
opalsImport is the executable file of Module Import
Definition: ModuleExecutables.hpp:113
@ scalePal
scale factor to be applied to the given palette (opalsZcolor)
opalsExport is the executable file of Module Export
Definition: ModuleExecutables.hpp:73
@ refModel
defines a reference model (e.g., horizontal/tilted plane or raster model)
@ sampleRange
sample (attribute) range (e.g. opalsHisto)
@ BeamVector
Beam vector in the world coordinate system.
opalsGrid is the executable file of Module Grid
Definition: ModuleExecutables.hpp:93
@ filter
string to be parsed in construction of DM::IFilter (various modules)
@ storeBeamInfo
defines beam information that is attached during import (opalsImport)
opalsHisto is the executable file of Module Histo
Definition: ModuleExecutables.hpp:103
@ searchMode
dimension of nearest neighbor search (opalsNormals)
@ formula
formula string for albegraic grid computations (opalsAlgebra)
@ d3
Search based on full 3D coordinates (x,y and z)
@ palFile
palette file (opalsZcolor)