First, for the answers proposed here, you probably do not want to use the ferry filter to push HeightAboveGround
to Z
, at least not prior to segmentation, as the act of normalizing heights involves subtracting an interpolated estimate of the ground elevation from each return. Something planar in the original X, Y, Z
space may no longer be planar in the transformed X, Y, HeightAboveGround
space. If you really need this to occur for downstream processing, I'd suggest holding off until the end of the pipeline.
Two options in the PDAL toolbox are:
filters.approximatecoplanar
filters.estimaterank
Neither of these is a full-fledged building/vegetation segmentation solution, but may serve as valuable building blocks.
PDAL's approximatecoplanar
filter may be helpful -- it is just one of the processing steps used in "Real-Time Detection of Planar Regions in Unorganized Point Clouds" by Limberger and Oliveira. Try adding the following to your pipeline following the existing range filter.
{
"type":"filters.approximatecoplanar",
"knn":8,
"thresh1":25,
"thresh2":6
},
You will have a new dimension called Coplanar
, where 0 indicates that a point is not likely part of a planar patch (e.g., vegetation) and 1 indicates that it is perhaps part of a planar patch (e.g., roof). You'll need to either 1) pick another output format that supports the Coplanar
dimension, or 2) insert another range filter to select only Coplanar=0
or Coplanar=1
.
The estimaterank
filter is similar in nature. There you will get a new dimension Rank
, where Rank=2
indicates planar features and Rank=3
would be more indicative of vegetation. Again, you'll need to choose how to deal with your new dimension as the LAS writer will drop unknown fields like Rank
.