Module GeorefApprox

- See also
- opals::IGeorefApprox

Improves the geo-referencing of an ALS flight block based on pairwise affine strip transformations (cf. Module LSM).

The Module GeorefApprox allows to perform the geo-referencing of a set of ALS strips so that they are finally given in one common coordinate system. Therefore, a multi-strip adjustment is carried out where the pairwise relative orientation parameters resulting from a previous step are used as observations (e.g., this can be done by applying Module LSM to each overlapping strip pair).

The basic input for Module GeorefApprox is a list of relative transformation parameters as obtained by Module LSM. Of course, all ALS strips occurring in this list must be connected to each other by relative transformations (otherwise, multi-strip adjustment will fail). By default, all those strips will be used in adjustment. However, the user may define a subset of strips by specifying the parameter stripList.

In order to define the datum, 12 parameters are chosen and kept fixed. Therefore, one of the strips is declared as reference strip. By default, the most central strip - i.e. the strip whose centre of gravity (COG) is closest to the median position of all strips' COGs - is determined and selected as reference strip. However, a user-defined reference strip may be specified using the parameter fixedStrip.

The simplest way to define the datum is to keep one complete transformation-set fixed, i.e. to set the reference strip's transformation to identity transformation. In this case, however, residual errors stemming from the mounting calibration may - when performing adjustment without any control features - cause a shift which is linearly growing for each strip with its (across-flight-direction) distance from the central fixed strip.

In order to prevent the block from this 'affine drifting', zero-shift observations are introduced for the two peripheral strips (i.e. 6 shift components are observed 0). In this case, the datum definition requires 6 further constraints: therefore, it is sufficient that 2 rotation angles, 2 scales and 2 affinities are kept fixed in the reference strip's transformation.

The parameter sigmaShift specifies the standard deviation of additional zero-shift observations (recommended value: some dm). If sigmaShift = 0, no such observations are introduced to the adjustment and the identity transformation is assigned to the reference strip in order to fix the datum. If a positve value is specified, the additional shift observations apply to the two outermost strips of the block. In case sigmaShift is negative, the fictional zero-shift observations are applied to all strips of the block.

-obsTrafParsobserved relative transformation parameters

Type: opals::Vector<opals::TrafPars3dAffine>

Remarks: optional

Specifies a list of relative strip transformation parameters usually determined by Module LSM. The transformation parameters are introduced as observations in a global strip adjustment. Secure that all strips are connected by relative transformations (no separated strip block) otherwise the adjustment will fail.

* TrafPars3dAffine: Describes a relative or absolute 3D-affine transformation. This class contains the transformation parameters of an affine 3D (i.e. 12-parameter) transformation, given as 12-array*

Remarks: optional

Specifies a list of relative strip transformation parameters usually determined by Module LSM. The transformation parameters are introduced as observations in a global strip adjustment. Secure that all strips are connected by relative transformations (no separated strip block) otherwise the adjustment will fail.

-outTrafParsoutput transformation parameters

Type: opals::Vector<opals::TrafPars3dAffine>

Remarks: output

The results of the strip adjustment are the 12 parameters of an 3D affine transformation of each strip.

* TrafPars3dAffine: Describes a relative or absolute 3D-affine transformation. This class contains the transformation parameters of an affine 3D (i.e. 12-parameter) transformation, given as 12-array*

Remarks: output

The results of the strip adjustment are the 12 parameters of an 3D affine transformation of each strip.

-stripListoptional strip list

Type: opals::Vector<opals::Path>

Remarks: estimable

Per default all strips defined in the obsTrafPars list are used in the strip adjustment. In case of a given strip list only specified strips are processed. Estimation rule: All strips referenced in trafPars are used for the stripList.

Remarks: estimable

Per default all strips defined in the obsTrafPars list are used in the strip adjustment. In case of a given strip list only specified strips are processed. Estimation rule: All strips referenced in trafPars are used for the stripList.

-fixedStripfixed strip within the adjustment

Type: opals::Path

Remarks: estimable

Specifies which strip is fixed (reference strip) within the strip adjustment. Estimation rule: The most central strip given in stripList or trafPars (i.e. the strip having its centre of gravity closest to the median position of all used strips) is chosen as reference strip.

Remarks: estimable

Specifies which strip is fixed (reference strip) within the strip adjustment. Estimation rule: The most central strip given in stripList or trafPars (i.e. the strip having its centre of gravity closest to the median position of all used strips) is chosen as reference strip.

-sigmaShiftsigma of additional shift observations

Type: double

Remarks: default=-0.1

Specifies a sigma of artificial zero shift observations to avoid affine shifting caused by 'error propagation'. If sigmaShift == 0, additional shift observations are omitted (sigmaShift is set to zero).

If sigmaShift > 0, the shift components of two peripheral strips are observed as 0.0 +/- sigmaShift.

If sigmaShift < 0, the shift components of all strips are observed as 0.0 +/- sigmaShift.

Remarks: default=-0.1

Specifies a sigma of artificial zero shift observations to avoid affine shifting caused by 'error propagation'. If sigmaShift == 0, additional shift observations are omitted (sigmaShift is set to zero).

If sigmaShift > 0, the shift components of two peripheral strips are observed as 0.0 +/- sigmaShift.

If sigmaShift < 0, the shift components of all strips are observed as 0.0 +/- sigmaShift.

-maxItermaximum number of iterations

Type: int32

Remarks: default=20

The strip adjustment is a non-linear problem and therefore solved iteratively. If the adjustment doesn't converge (all absolute parameter updates are below convThreshold) within the maximum number of iterations, the result is rejected.

Remarks: default=20

The strip adjustment is a non-linear problem and therefore solved iteratively. If the adjustment doesn't converge (all absolute parameter updates are below convThreshold) within the maximum number of iterations, the result is rejected.

-convThresholdconvergence threshold

Type: double

Remarks: default=0.001

The strip adjustment iterations are repeated until the maximum absolute parameter update is below the specified threshold or the maximum number of iterations (cf. -maxIter) is reached.

Remarks: default=0.001

The strip adjustment iterations are repeated until the maximum absolute parameter update is below the specified threshold or the maximum number of iterations (cf. -maxIter) is reached.

-minWeightminimum weight value

Type: double

Remarks: default=1e-07

If diagonal elements of a transformation Qxx matrix are zero, there are set to the given value to avoid the adjustment to fail.

Remarks: default=1e-07

If diagonal elements of a transformation Qxx matrix are zero, there are set to the given value to avoid the adjustment to fail.

As input datasets, the 3 files `G111.las`

, `G112.las`

and `G113.las`

located in the

directory are used, each of which containing the point cloud of a part of an ALS strip. First, we have to import the datasets and derive grid models. Therefore, we use the modules Module Import and Module Grid. Since there are relatively much vegetated areas in this datasets, the use of grid masks is highly recommended for Module LSM. Therefore, we additionally derive sigma and excenter grid models, with the help of which we can derive grid masks using the module Module Algebra :**$OPALS_ROOT/demo/**

As result, we obtain the grid models `G111.tifs`

, `G111_sigmaZ.tif`

, `G111_excen.tif`

, `G112.tif`

, `G112_sigmaZ.tif`

, `G112_excen.tif`

, `G113.tif`

, `G113_sigmaZ.tif`

, `G113_excen.tif`

.

Using Module Algebra, we generate the grid masks `G111_mask.tif`

, `G112_mask.tif`

, `G113_mask.tif`

:

opalsAlgebra -inFile G111_sigmaZ.tif G111_excen.tif -outFile G111_mask.tif -formula "r[0]<0.1 && r[1]<0.8"

opalsAlgebra -inFile G112_sigmaZ.tif G112_excen.tif -outFile G112_mask.tif -formula "r[0]<0.1 && r[1]<0.8"

opalsAlgebra -inFile G113_sigmaZ.tif G113_excen.tif -outFile G113_mask.tif -formula "r[0]<0.1 && r[1]<0.8"

In the next step, we apply Module LSM to the pairs of neighbouring strips (using the grid masks, respectively), i.e. to pair G111/G112 and to pair G112/G113 in our case (G112 is situated between G111 and G113). We specify `LSMpairs.xml`

as outParamFile, where all the relative transformation results are collected.

Note: Since the resulting parameters of Module LSM are used as input parameters for Module GeorefApprox, the parameter outTrafPars of Module LSM is assigned to the parameter obsTrafPars of Module GeorefApprox by default (see configuration file `opals.cfg`

):

opalsGeorefApprox.paramMapping="obsTrafPars=opalsLSM.outTrafPars"

For further information on this, please refer to the section Parameter Mapping.

Based on the transformation parameters stored in `LSMpairs.xml`

, the multi-strip adjustment can be carried out and the final results are written to the file `geoRefApproxResult.xml`

:

In this case, we are not using additional shift observations and the datum is defined by keeping the central strip (G112) fixed. The results (after 2 iteration steps) are:

Transformation parameters for G111 | Transformation parameters for G112 | Transformation parameters for G113

1.00022 0.00054 0.01469 0.131 | 1.00000 0.00000 0.00000 0.000 | 1.00045 0.00002 -0.00392 -0.076

0.00066 0.99991 -0.01146 -0.112 | 0.00000 1.00000 0.00000 0.000 | 0.00074 1.00003 0.00202 -0.024

0.00035 -0.00023 1.00008 0.001 | 0.00000 0.00000 1.00000 0.000 | -0.00043 0.00003 1.00013 0.033

If we want to consider additional zero-shift observations, we have to specify the parameter sigmaShift (here, we use a sigma of 0.1m):

In this case, we obtain the following results (after 2 iteration steps):

Transformation parameters for G111 | Transformation parameters for G112 | Transformation parameters for G113

0.99938 0.00054 0.01455 0.000 | 0.99916 0.00000 -0.00013 -0.009 | 0.99961 0.00002 -0.00405 0.000

0.00101 0.99991 -0.01146 0.000 | 0.00036 1.00000 0.00000 0.060 | 0.00110 1.00003 0.00202 0.000

0.00048 -0.00023 1.00008 0.000 | 0.00013 0.00000 1.00000 -0.020 | -0.00030 0.00003 1.00013 0.000

**Note**: For better readability, the values extracted from the XML result file have been rounded to 5 decimal places (affine 3x3-matrix) and 3 significant digits (shift components), respectively.

opalsAlgebra is the executable file of Module Algebra

@ sigmaShift

sigma of additional shift observations (opalsGeorefApprox)

@ sigmaz

sigma z of grid post adjustment (i.e. std.dev. of the interpolated height)

opalsGeorefApprox is the executable file of Module GeorefApprox