The attached screenshot shows a LiDAR point cloud with significant overlapping scans. This point cloud tile is part of the MN statewide LiDAR dataset which has 25% scan overlap and 1.5 NPS. For many applications, these overlaps pose no problem. However, when calculating LiDAR metrics such as forestry grid metrics, these overlapping scan can pose a major problem by creating biases in the resulting products.

There are several commercial applications that can deal with these overlapping scans such as Esri's Classify LAS Overlap and Lastools lasoverage. Is there an open source approach to detect, classify, and remove overlapping points from multiple flight lines?

enter image description here

  • 1
    Do the points have GPS time values? If so, grouping by major chunks of time is one way to pull them apart. Commented Feb 11, 2018 at 1:52
  • 3
    I would just thin the entire point cloud to a fixed ground density. Commented Feb 11, 2018 at 2:12
  • 1
    BTW, if it is an las format, there should be a scan angle attribute. You could just threshold that value. Commented Feb 11, 2018 at 2:42
  • @HowardButler Yes, the laz files have GPS time stamps.
    – Aaron
    Commented Feb 12, 2018 at 21:37
  • 1
    Also, if possible, try choosing metrics which are more stable to point density heterogeneity (which usually are the height metrics). See for example: link.springer.com/article/10.1007/s13595-015-0457-x. Commented Feb 26, 2018 at 4:28

3 Answers 3


There are a couple of options. Depending on the area of MN where you're processing, the overlap areas of the data are classified, and you can use a PDAL filters.range to cull them out:

pdal translate input.las output.las range --filters.range.limits="!Classification[12:12]"

MN flightline overlap (inspect and visualize that in your browser here)

Not everywhere has these nicely classified, however, and PDAL's filters.sample would be one way to create a point cloud of consistent density.

pdal translate input.las output.las sample --filters.sample.radius=1.414

PDAL works on Windows, OSX, and Linux/Docker. You can find out how to install PDAL from this SO post or on the PDAL website.

  • Revisiting this after a few years--great answer. FYI, the second and last links are 404.
    – Aaron
    Commented Jun 2, 2021 at 3:22

In the latest release of the open-source geoprocessing platform WhiteboxTools (v. 0.7) I just added a new tool called ClassifyOverlapPoints that classifies or filters LAS points in regions of overlapping flight lines. If the --filter flag is specified, points from overlapping flightlines (i.e. later GPS times) are culled from the output point cloud. If this flag is left off, then all overlapping points are classified as such by setting the classification to 12 (see figures below, visualized using plas.io). This tool assumes that GPS data are available for the input LAS file. Scan angles are also utilized if present in the data set.

enter image description here

enter image description here

enter image description here

The library can be downloaded freely here and the source code for the tool can be found here. The User Manual contains information about how to use WhiteboxTools and the ClassifyOverlapPoints tool as do the tutorials. The tool can either be called through Python scripting (see below), or using the simple WhiteboxTools Runner user interface:

from WBT.whitebox_tools import WhiteboxTools

wbt = WhiteboxTools()

wbt.work_dir = "/path/to/data/"
in_file = "my_file.las"
out_file = "filtered.las"
wbt.classify_overlap_points(in_file, out_file, resolution=2.0, filter=False)

enter image description here

There is a QGIS plugin for the library, but this tool is not yet available in the plugin. Other related tools that could also be useful for this type of analysis include FilterLidarScanAngles, FlightlineOverlap, LidarPointDensity and LidarPointStats.


Building on @HowardButler's answer, the lidR package in R also has a method to filter out points already classified as "overlapping" using readLAS() (i.e. in the case of the MN dataset, overlapping points are classified as "17").


# Check to see all available filters

# Read points != 17
las <- readLAS('path/to/data.laz', filter="-drop_class 17")

Figure 1 shows the filtered and unfiltered point cloud pulse density maps.

Figure 1. Figure 1

  • Great! Are you able to propose any solution when overlapping areas aren't classified? I suppose to filter GPS times or/and scan angles but have no idea specify these values.
    – Adam
    Commented Nov 13, 2022 at 17:11

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.