Adaptive minimum interpolation (LiDAR)

This tool can be used to interpolate a regular grid raster from a point cloud LiDAR dataset using an adaptive form of the minimum interpolation method. The method differs from the Minimum Interpolation (LiDAR) tool, which simply assigns a grid cell the minimum elevation of the points within the grid cell, in the way that the assigned elevation value is found. First, all of the points within a neighbourhood of a specified size centered on the grid cell are identified and sorted from nearest to farthest. The sorted points are then visited in order and the minimum elevation of the previously visited points is recorded. This effectively creates a minimum elevation versus distance function. The function is scanned a second time, looking for steps where the minimum function drops by at least the specified Height Difference Parameter. When such a step is located, the lower elevation at the bottom of the step is recorded. The lower-step elevation of the distant most such step is then assigned to the output grid cell. In this way, the assigned elevation will not necessarily be the lowest elevation within the neighbourhood but rather the elevation associated with a large drop in the minimum elevation function. If no such drop occurs in the minimum elevation function, the output grid cell will be assigned the nearest elevation, effectively performing a nearest neighbour interpolation. Block-minimum gridding is a common method of interpolating LiDAR data in order to remove the impact of points associated with non-ground, or off-terrain, points. However, this gridding method affects every location, not just those grid cells associated with non-ground points. The adaptive minimum interpolation method is an attempt to reduce the impact of this minimum interpolator while retaining its effectiveness at removing off-terrain objects.

The user inputs one or more LiDAR datasets in LAS file format (.las) and the name of the suffix to assign output raster grids that are created. Although most often this tool will be used to create a digital elevation model (DEM) from the elevation data associated with the LiDAR dataset, the user can also specify a number of other parameters to interpolate including the LiDAR point intensity, classification, and associated red, green, and blue values. Note that not all LiDAR datasets will include each of these parameters. Interpolation can be based on all of the points in the dataset, first return points, or last return points. The user must also specify the IDW exponent, the search radius, and rotation value (if any).

The minimum height parameter can be used to eliminate the effects of LiDAR point drop outs (i.e. erroneously low points), which are common in some data sets. The maximum scan angle deviation parameter can be used to filter points from the neighbourhood around each interpolated grid cell that have scan angles that are larger than the neighbourhood minimum scan angle by this user-defined threshold value. Large variation in the scan angle of nearby LiDAR points can be common near the edges of scan lines. Although the effects of this are rarely apparent in the DEM, the impact of using a collection of points with greatly varying scan angles for interpolation can be observed in the derived products of the DEM, particularly the hillshade image. This can significantly impact modelled surface flowpaths in flight-line edge areas. Lowering the maximum scan angle deviation parameter will have the impact of reducing this artifact. If the parameter is set too low, however, the resulting interpolated surface may contain extensive areas of NoData values. It is not recommended that this parameter be set lower than 3.0 degrees. Similarly, if you do not want to exclude any points as a result of the variation of scan angles within interpolation neighbourhoods, simply set this parameter to a high value, e.g. 90.0 degrees.

Grid cells that have no points within the search radius assigned the NoData value in the output image. The output raster is of the float data type and continuous data scale.

See Also:

Scripting:

The following is an example of a Python script using this tool:

wd = pluginHost.getWorkingDirectory()
# You may have multiple input files but they must
# be separated by semicolons in the string.
inputs = wd + "input1.las" + ";" + wd + "input2.las" + ";" + wd + "input3.las"
suffix = "IDW"
interpParameter = "z (elevation)"
ptReturn = "all points"
maxSearchDist = "5.0"
gridRes = "1.0"
heightDiff = "2.0"
minHeight = "0.0"
maxScanAngleDeviation = "3.0"
# excluded points... neverClassified = "false"
unclassified = "false"
bareGround = "false"
lowVeg = "false"
mediumVeg = "false"
highVeg = "false"
buildings = "false"
lowPoints = "false"
keyPoints = "false"
water = "false"
args = [inputs, suffix, interpParameter, ptReturn, maxSearchDist, gridRes, heightDiff, minHeight, maxScanAngleDeviation, neverClassified, unclassified, bareGround, lowVeg, mediumVeg,
highVeg, buildings, lowPoints, keyPoints, water]
pluginHost.runPlugin("LiDAR_Adaptive_Min_Interpolation", args, False)

This is a Groovy script also using this tool:

def wd = pluginHost.getWorkingDirectory()
// You may have multiple input files but they must
// be separated by semicolons in the string.
def inputs = wd + "input1.las" + ";" + wd + "input2.las" + ";" + wd + "input3.las"
def suffix = "IDW"
def interpParameter = "intensity"
def ptReturn = "last return"
def maxSearchDist = "5.0"
def gridRes = "1.0"
def heightDiff = "2.0"
def minHeight = "0.0"
def maxScanAngleDeviation = "5.0"
// excluded points... def neverClassified = "false"
def unclassified = "false"
def bareGround = "false"
def lowVeg = "false"
def mediumVeg = "false"
def highVeg = "false"
def buildings = "false"
def lowPoints = "false"
def keyPoints = "false"
def water = "false"
String[] args = [inputs, suffix, interpParameter, ptReturn, maxSearchDist, gridRes, heightDiff, minHeight, maxScanAngleDeviation, neverClassified, unclassified, bareGround, lowVeg, mediumVeg,
highVeg, buildings, lowPoints, keyPoints, water]
pluginHost.runPlugin("LiDAR_Adaptive_Min_Interpolation", args, false)

Credits: