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.
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)