Module Snellius
See also

Aim of module

Performs range and refraction corrections of raw laser bathymetry measurements according to Snell's law.

General description

Laser bathymetry

Airborne laser bathymetry (ALB) is the technique for measuring the depths of relatively shallow coastal or inland waters (rivers, ponds, lakes). ALB is a two-media measurement process, since the laser beam has to travel both through the air and the water. This propagation, though, presents some differences between the air and the water, the main of which is in the propagation velocity of the laser beam (i.e. the speed of light). For that reason, the laser echoes that penetrate into the water column, need to be corrected due to this effect.

More specifically, according to the principle of ALB, a short green laser pulse ( \(\lambda = 532 nm\)) is emitted from an airborne platform, travels through the atmosphere, and hits the water surface where it gets refracted towards the plumb line. Within the water column the laser beam propagates with reduced velocity and is scattered at water and sediment particles. A part of the signal is reflected from the bottom of the water body, and, after the return trip, the full waveform of the backscattered echo signal is detected at the receiver. Beam refraction as a consequence of the different propagation speed in air and water is described by Snell's law (Willebrord Snellius) as:

\[ \frac{\sin\vartheta_{air}}{\sin\vartheta_{water}} = \frac{c_{air}}{c_{water}} = \frac{n_{water}}{n_{air}} \]

where \(\vartheta_{air}\) is the incidence angle of the laser beam w.r.t. the normal vector of the water surface and \(\vartheta_{water}\) in the water, \(c_{air}\) and \(c_{water}\) are the group velocities in the air and the water respectively and finally \(n_{air}\) and \(n_{water}\) are the refractive indices in the air and the water at the respective wavelength. It is mentioned that the refractive index of clear water at 20 °C is 1.33.

The interaction of the green laser beam with the medium water is illustrated in Fig. 1.

Fig. 1: Propagation of green laser beam in air and water

The range and refraction correction is carried out for the points of the input OPALS Datamanager (inFile). For each point, the laser beam is intersected with the water surface model (refModel), which may either be provided as a grid file in GDAL supported format or as a constant height value. A useful tool to obtain a water surface model is the Python script Water Surface Modelling Tool (see qpals WaterSurfaceModeler). All points intersecting the water surface are corrected applying Snell's law, as described above, based on the specified refraction index (refracIndex). Optionally, a filter (filter) can be used to restrict the considered point set.

Please note, that intersecting the laser beam with the water surface model requires storage of the beam vector. Therefore, the ODM file must contain the following attributes for all water echoes:

  • BeamVectorX
  • BeamVectorY
  • BeamVectorZ

For all bathymetric echoes the x/y/z-coordinate offsets and the water depth are stored as additional attributes in the ODM:

  • _REFCORRX: range/refraction corrections in X-direction
  • _REFCORRY: range/refraction corrections in Y-direction
  • _REFCORRZ: range/refraction corrections in Z-direction
  • WaterDepth: water depth

Furthermore the classification of the bathymetric echoes is set to ASPRS Standard LIDAR Point Class 9 (i.e. water). If an optional output file (outFile) is specified the range/refraction corrected coordinates and all attributes are written to a new OPALS Datamanager.

Photo bathymetry

Module Snellius cannot only be used for laser bathymetry but also for photo bathymetry. Fig. 2 shows a principle sketch of image ray refraction in the multimedia photogrammetric case. As in laser bathymetry, ray bending is described by Snell's law.

Fig. 2: Refraction of image rays at the water surface

The input file (inFile) contains the uncorrected photogrammetric 3D point cloud. To activate the photogrammetric mode, a file (oriFile) containing the exterior orientations of the photos from which the point cloud was derived must be specified. Please note that for proper photo bathymetry refraction correction, only the camera positions (X, Y, Z) are required but not the rotation angles. Arbitrary file formats are supported via parameter oriFormat. Please refer to OPALS Format Definition for further information about user defined file formats.

As in the laser case, the coordinate corrections as well as the water depth are stored as additional attributes (cf. above). As the bended image rays are generally skew, additional accuracy measures describing the the quality of the ray forward intersection are provided:

  • SIGMAX: accuracy in X-direction
  • SIGMAY: accuracy in Y-direction
  • SIGMAZ: accuracy in Z-direction

Parameter description

-inFileinput OPALS datamanager file
Type: opals::Path
Remarks: mandatory
The ODM file for which the range/refraction correction is to be performed
-outFileoutput OPALS datamanager file name
Type: opals::Path
Remarks: optional
If specified, the runtime and refraction corrected coordinates and all attributes are saved to a new OPALS data manager (ODM) file.
-refModelreference model (air-water-interface)
Type: opals::Path
Remarks: mandatory
The reference model (air-water-interface) is expected as a raster in GDAL readable format. As an alterative a numeric value denoting the horizontal water level can be specified instead of a raster model.
-refractiveIndexrefractive index
Type: double
Remarks: default=1.33
Denotes the refractive index of water and is used to compute the range/refraction correction for water echoes in raw bathymetry point clouds accordeing to Snell's law.
-oriFileimage orientation file (photogrammetry case)
Type: opals::Path
Remarks: optional
Appling the refraction corrections on two media photogrammetry point clouds, the projection centers of all images needs to be specified in a orientation file
-oriFormatimage orientation file format (photogrammetry case)
Type: opals::String
Remarks: default=auto
File format of the image orientation file. Please refer to parameter iFormat of Module Import for further details
-filtermodify the input using a (tree of) filter(s)
Type: opals::String
Remarks: optional
A filter string in EBNF syntax as described in section 'Filter syntax' can be passed to restrict the set of input points (e.g. to consider last echoes only).
-storeMetaInfolevel of meta info that are stored for each point
Type: opals::NormalsMetaInfo
Remarks: default=minimum
Possible values:  
  minimum ... Storage of normal vector, sigma0 and estimtation method
  medium .... Storage of 'minimum' infos, eigenvalues, nr. of given points and nr. of used points
  maximum ... Storage of 'medium' infos, eigenvektor matrix
This parameter controls the amount of additional intermediate results stored in the ODM. The information content is different for the LiDAR- and photobathymetry. For a detailed list of attributes please please refer to the general description.


The data used in the following examples can be found in the $OPALS_ROOT/demo/ directory.

Example 1:

This first example gives guidance on how the opalsSnellius module can be used for the range/refraction correction of the raw, uncorrected laser point cloud. A brief description of the required files is also included. For further investigation of the opalsSnellius module as well as the Python script Water Surface Modelling Tool, see the use case Airborne Laser Bathymetry application: Range/Refraction correction at Pielach River, Austria.

To perform range/refraction correction of a raw ALB point cloud run the following commands:

opalsImport -inFile strip149.las -iFormat LAS_1.4_beamInfo.xml
opalsSnellius -inFile strip149.odm -refModel waterSurface.tif

The raw ALB point cloud is contained in the strip149.las, while with the LAS_1.4_beamInfo.xml XML file (OPALS Format Definition) its format is specified. Note that the water surface model is already provided as a raster model stored in GeoTiff format while usually it has to be generated from the data.

If the parameter (outFile) is specified, the range/refraction corrected coordinates (X, Y and Z) are stored in the new ODM together with all additional attributes of the input ODM. Please note that the intermediate attributes _REFCORRX, _REFCORRY and _REFCORRZ are not contained in the output ODM.

opalsSnellius -inFile strip149.odm -refModel waterSurface.tif -outFile strip149_corr.odm

To compute and visualize the differences, run the following command sequence:

opalsGrid -inFile strip149.odm -gridSize 0.1 -interpolation movingAverage -searchRadius 1
opalsGrid -inFile strip149_corr.odm -gridSize 0.1 -interpolation movingAverage -searchRadius 1
opalsAlgebra -inFile strip149_z.tif strip149_corr_z.tif -formula r[0]-r[1] -outFile diff.tif
opalsHisto -inFile diff.tif -sampleRange -0.5 0.2
opalsZColor -inFile diff.tif -palFile jetPal.xml -scalePal -0.20,0

At first, the two DEMs are created, for the raw and the corrected point cloud respectively. Using the opalsAlgebra, the difference between these two is computed and saved into a new .tif file (diff.tif), which is shown in Fig. 2.

Fig. 2: Difference between the raw and the corrected DEM of the point cloud

It is observed that all of the differences are negative, which implies that the corrected points have higher values of Z, and therefore smaller depths, as expected. This is due to the fact that the raw water depths are overestimated as a matter of not considering the reduced propagation speed of light in water. In addition, the dark red regions, that have a zero value, are non water regions. So, there were no corrections applied to them.

Another way to visualize the differences is by using the opalsSection module or the Python script included in the $OPALS_ROOT/demo/ directory:

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

Fig. 4 shows the two point clouds with respect to the water surface, as that was extracted from the water surface model. It is obvious that when the points are over the water surface, the two different datasets coincide since there is no range correction. In addition, one can see that the range/refraction corrections are higher in deeper waters.

Example 2:

The second example illustrates refraction correction of a photogrammetric point cloud. In addition to the 3D points, the water surface model and the image positions/orientations are required.

opalsImport -inFile photoBathyPts.laz
opalsSnellius -inFile photoBathyPts.odm -outFile photoBathyPtsCorr.odm -oriFile photoBathyOri.txt -oriFormat photoBathyOriFmt.xml -refModel photoBathyWsm.tif -refractiveIndex 1.33

The results are plotted in Fig. 5:

Fig. 5: Cross-sectional view of the water surface (blue) and the raw (red) and corrected photogrammetric point cloud (green)


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.

gm & cc
@ oriFile
file with a priori exterior image orientation (opalsStripAdjust)
opalsSnellius is the executable file of Module Snellius
Definition: ModuleExecutables.hpp:208
opalsAlgebra is the executable file of Module Algebra
Definition: ModuleExecutables.hpp:13
opalsImport is the executable file of Module Import
Definition: ModuleExecutables.hpp:113
@ movingAverage
moving average interpolation (=moving horizontal plane)
@ scalePal
scale factor to be applied to the given palette (opalsZcolor)
@ refModel
defines a reference model (e.g., horizontal/tilted plane or raster model)
@ oriFormat
file format for image orientations (opalsSnellius)
@ sampleRange
sample (attribute) range (e.g. opalsHisto)
opalsGrid is the executable file of Module Grid
Definition: ModuleExecutables.hpp:93
opalsHisto is the executable file of Module Histo
Definition: ModuleExecutables.hpp:103
@ refractiveIndex
refractive index (e.g. opalsSnellius)
@ formula
formula string for albegraic grid computations (opalsAlgebra)
@ palFile
palette file (opalsZcolor)