Skip to contents

Classify ground points using a modified version of the Progressive TIN densification method by Axelsson (2000) (see references). The approach involves iteratively constructing a triangulated surface model (TIN) to classify ground points (see details). This algorithm is much more robust than the CSF in classify_with_csf and should be preferred.

Usage

classify_with_ptd(
  res = 10,
  angle = 30,
  distance = 2,
  filter = drop_noise(),
  spacing = 0.25,
  class = 2L
)

Arguments

res

Scalar. The resolution for locating seed points. It takes the lowest point per grid cell. It should be larger than any above ground structure such as building or bridges. In forested lands 10 m is good but larger values are recommended if human made structure can be observed. 50 m is good in urban scene

angle

Scalar. The threshold for iteration angle, as illustrated in Figure 3 of Axelsson's paper. Use smaller values (close to 20) for flat areas and larger values (close to 40) for mountainous areas.

distance

Scalar. The threshold for iteration distance, as described in Figure 3 of Axelsson's paper.

filter

the 'filter' argument allows filtering of the point-cloud to work with points of interest. For a given stage when a filter is applied, only the points that meet the criteria are processed. The most common strings are Classification == 2", "Z > 2", "Intensity < 100". For more details see filters.

spacing

Scalar. The spacing of ground points. TIN densification halts if triangles are smaller than this limit avoiding useless over-densification. The default setting is generally suitable for most scenarios.

class

Integer. The classification to assign to the points, typically 2 for ground points.

Value

This stage transforms the point cloud in the pipeline. It consequently returns nothing.

Details

The method begins by identifying local low points, assuming at least one ground-level point exists within any X meters area. Initially, the triangles of the TIN model are mostly below the ground surface, only touching lowest points at their vertices. As the iterations progress, additional points are incorporated to more accurately follow the true ground surface.

The classification process is controlled by two main parameters:

  • Iteration angle: This controls the rate at which points are classified based on variations in ground level. Use smaller values (e.g., 20) for flat terrain and larger values (e.g., 40) for mountainous regions.

  • Iteration distance: This limits large upward jumps in the model, preventing the misclassification of points in low vegetation or on small buildings.

The algorithm is robust to low noise points, meaning it can handle some level of noise without needing explicit noise classification. However, it is preferable to have noise classified points to guarantee optimal results.

The densification process can also stop if the triangle edges become shorter than a specified length.

References

Axelsson, P. (2000). DEM Generation from Laser Scanner Data Using adaptive TIN Models. International Archives of Photogrammetry and Remote Sensing, 33(B4), 110–117. https://www.isprs.org/proceedings/xxxiii/congress/part4/111_xxxiii-part4.pdf

Examples

f <- system.file("extdata", "Topography.las", package="lasR")
pipeline = classify_with_ptd() + write_las()
ans = exec(pipeline, on = f, progress = TRUE)
#> Read files headers: [==========] 100% (1 threads)                    
Overall: [          ] 0% (1 threads) | : no progress                     
Overall: [          ] 0% (1 threads) | read_las: [          ] 0% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [          ] 1% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [          ] 2% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [          ] 3% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [          ] 4% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [          ] 5% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [          ] 6% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [          ] 7% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [          ] 8% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [          ] 9% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [=         ] 10% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [=         ] 11% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [=         ] 12% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [=         ] 13% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [=         ] 14% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [=         ] 15% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [=         ] 16% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [=         ] 17% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [=         ] 18% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [=         ] 19% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [==        ] 20% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [==        ] 21% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [==        ] 22% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [==        ] 23% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [==        ] 24% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [==        ] 25% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [==        ] 26% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [==        ] 27% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [==        ] 28% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [==        ] 29% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [===       ] 30% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [===       ] 31% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [===       ] 32% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [===       ] 33% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [===       ] 34% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [===       ] 35% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [===       ] 36% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [===       ] 37% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [===       ] 38% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [===       ] 39% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [====      ] 40% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [====      ] 41% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [====      ] 42% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [====      ] 43% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [====      ] 44% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [====      ] 45% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [====      ] 46% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [====      ] 47% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [====      ] 48% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [====      ] 49% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [=====     ] 50% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [=====     ] 51% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [=====     ] 52% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [=====     ] 53% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [=====     ] 54% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [=====     ] 55% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [=====     ] 56% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [=====     ] 57% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [=====     ] 58% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [=====     ] 59% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [======    ] 60% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [======    ] 61% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [======    ] 62% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [======    ] 63% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [======    ] 64% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [======    ] 65% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [======    ] 66% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [======    ] 67% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [======    ] 68% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [======    ] 69% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [=======   ] 70% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [=======   ] 71% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [=======   ] 72% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [=======   ] 73% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [=======   ] 74% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [=======   ] 75% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [=======   ] 76% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [=======   ] 77% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [=======   ] 78% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [=======   ] 79% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [========  ] 80% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [========  ] 81% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [========  ] 82% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [========  ] 83% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [========  ] 84% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [========  ] 85% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [========  ] 86% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [========  ] 87% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [========  ] 88% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [========  ] 89% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [========= ] 90% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [========= ] 91% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [========= ] 92% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [========= ] 93% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [========= ] 94% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [========= ] 95% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [========= ] 96% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [========= ] 97% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [========= ] 98% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [========= ] 99% (1 threads)                    
Overall: [          ] 0% (1 threads) | read_las: [==========] 100% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [          ] 0% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [          ] 1% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [          ] 2% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [          ] 3% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [          ] 4% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [          ] 5% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [          ] 6% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [          ] 7% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [          ] 8% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [          ] 9% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [=         ] 10% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [=         ] 11% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [=         ] 12% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [=         ] 13% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [=         ] 14% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [=         ] 15% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [=         ] 16% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [=         ] 17% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [=         ] 18% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [=         ] 19% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [==        ] 20% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [==        ] 21% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [==        ] 22% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [==        ] 23% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [==        ] 24% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [==        ] 25% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [==        ] 26% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [==        ] 27% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [==        ] 28% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [==        ] 29% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [===       ] 30% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [===       ] 31% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [===       ] 32% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [===       ] 33% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [===       ] 34% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [===       ] 35% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [===       ] 36% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [===       ] 37% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [===       ] 38% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [===       ] 39% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [====      ] 40% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [====      ] 41% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [====      ] 42% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [====      ] 43% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [====      ] 44% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [====      ] 45% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [====      ] 46% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [====      ] 47% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [====      ] 48% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [====      ] 49% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [=====     ] 50% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [=====     ] 51% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [=====     ] 52% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [=====     ] 53% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [=====     ] 54% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [=====     ] 55% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [=====     ] 56% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [=====     ] 57% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [=====     ] 58% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [=====     ] 59% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [======    ] 60% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [======    ] 61% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [======    ] 62% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [======    ] 63% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [======    ] 64% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [======    ] 65% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [======    ] 66% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [======    ] 67% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [======    ] 68% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [======    ] 69% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [=======   ] 70% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [=======   ] 71% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [=======   ] 72% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [=======   ] 73% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [=======   ] 74% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [=======   ] 75% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [=======   ] 76% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [=======   ] 77% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [=======   ] 78% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [=======   ] 79% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [========  ] 80% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [========  ] 81% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [========  ] 82% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [========  ] 83% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [========  ] 84% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [========  ] 85% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [========  ] 86% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [========  ] 87% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [========  ] 88% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [========  ] 89% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [========= ] 90% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [========= ] 91% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [========= ] 92% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [========= ] 93% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [========= ] 94% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [========= ] 95% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [========= ] 96% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [========= ] 97% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [========= ] 98% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [========= ] 99% (1 threads)                    
Overall: [          ] 0% (1 threads) | Write LAS: [==========] 100% (1 threads)                    
Overall: [==========] 100% (1 threads) |                     
Overall: [==========] 100% (1 threads)