Using LIDAR Waveform Attributes in FME

Liz Sanderson
Liz Sanderson
  • Updated

FME Version

  • FME 2018.x


The example below was generously provided by Christian Sevcik of Riegl Laser Measurement Systems GmbH and was presented at the FME International User Conference in Vancouver in 2014. Please see the full presentation for a brief, but very clear, technical background on Waveform laser scans:

Full-waveform LiDAR data differs from discrete LiDAR data because it considers the entire return as a continuous wave while the discrete data only considers the major peaks within the wave. Using a full wave results in a precise and attribute rich point cloud. This is in part due to the fact that waveform data contains additional attributes called amplitude, reflectance and pulse width and shape deviation. This additional information is especially helpful when dealing with more complex features like vegetation because they help to discriminate between the angles and details of the features.


Waveform Attributes in FME

FME is able to read waveform attributes from RIEGL Projects (RDB_PROJECT), RIEGL Laser Scan Database (RDB) and other LiDAR formats. The RDB_PROJECT and RDB reader support terrestrial, mobile, and airborne scanned projects which are in file formats .rsp and .rpp.

The purpose of this example is to demonstrate the use of LiDAR waveform attributes in FME through classifying point cloud data by tree height. The steps to do this are as follows:


Step-by-step Instructions

Reproject and Filter

  1. The data that we will be using for this example has been provided by RIEGL. Add a RIEGL RDB Project reader to input the .rpp data of the sample forestry data.
  2. Add a CsmapReprojector transformer and connect the reader to the input port. Change the parameters so that “Source Coordinate System” is set to “WGS84.Geocentric_FME”, “Destination Coordinate System” is set to “MGI-AT/a.AUT-EAST/GK” and “Vertical Handling” is set to “Heights are relative to the ellipsoid(s) or geocentric”.


  3. Use a PointCloudCombiner with default parameters and connect it to the Reprojected data. This transformer will ensure that all of the RIEGL project data is being output in point cloud format.
  4. Add a PointCloudFilter and connect the previous output data to the input port. In the parameters we will add two expressions. The first is “@Component(classification)==3||@Component(classification)==4||@Component(classification)==5” with “Vegetation” in the Output Port. Values 3, 4, and 5 correspond to low, medium, and high vegetation respectively. The second row in the filter has the expression “@Component(classification)==2” with “Ground” in the Output Port.
    Filter by Pulse Shape Deviation
  5. We will first focus on the Vegetation output from the PointCloudFilter. Add another PointCloudFilter to connect to the Vegetation output. The parameters in this transformer should have the Expression set to “@Component(deviation)<20” with “Passed” in the Output Port. This is done to filter out points where the pulse shape deviation is less than 20. Because pulse shape deviation tells us how much the echo/return pulse has been distorted from the original pulse, filtering out high values presumably removes poor quality echoes.


  6. Add a FeatureHolder to connect to the Passed output port. The FeatureHolder will make sure all data from the previous transformer has been processed before any data is passed on to the next transformer. If interested, an Inspector can also be connected to the Passed port to see the vegetation points.

    Normalize Elevation of LiDAR Points
  7. We will now go back to the first PointCloudFilter where we separated the Vegetation and Ground classifications. Add a SurfaceModeller and connect the Ground output to the Points/Lines input port. Change the parameters so that “Surface Tolerance” is set to 0.05, both the X and Y Output DEM Cell Spacing is set to 2 and that Output Contours is unchecked.


  8. Now add a StringConcatenator. Connect the DEMRaster output port from the SurfaceModeller to the input port. Under the parameters, change the name of the “New Attribute” to “fme_basename”. Under “String Parts”, add one row where String Type is set to “Attribute Value” and the String Value is set to “fme_basename”. Add another row where String Type is set to “Constant” and the String Value is set to “_DTM”.
  9. Now we will add a PointCloudOnRasterComponentSetter to combine the vegetation point clouds and modelled ground points together. Connect the Output from the FeatureHolder to the PointCloudOnRasterComponentSetter PointCloud input port and the Output from the StringConcatenator to the Raster input port. Change the components so that Band 0 is added with Component set to “user_data”. The Default Value can be left blank.
  10. Add a PointCloudExpressionEvaluator and connect the output PointCloud from the previous transformer to the input port. Change the parameters so that one row in the Component Expressions table has Component set to “z”, Data Type set to “Auto” and Expression set to “@Component(z)-@Component(user_data)”. This will normalize the elevation of the LiDAR points by subtracting the ground elevation from the z coordinates.
  11. We will now add transformers to create 3D vector tiles of the maximum and mean tree height. To do this start by adding a Tiler with the “Result” from the PointCloudExpressionEvaluator connected to the input port. Change the Tile Size in the parameters so that both the width and height are set to 20.
  12. Connect the Tiled output to a Counter transformer with default parameters.
  13. Add a BoundingBoxReplacer and connect the output from the Counter to the input port.

    Calculate Point Cloud Statistics
  14. Add a PointCloudExpressionEvaluator. We will connect the output port from the Counter to this transformer’s input port (the Counter Output will now be connected to two transformers). Add a row to the Component Expression parameters of the PointCloudExpressionEvaluator where Component is set to “classification”, Data Type is set to “Preserve” and Expression is set to “@if(@Component(z)<2,3,5)”.


  15. Add a PointCloudFilter and connect the previous Results to the input port. Change the parameters to add a row where Expression is set to “@Component(classification)==5 and the Output Port is set to “HighVegetation”.


  16. We will add another PointCloudFilter that will be connected to the “HighVegetation” output from the last filter. Change the parameters to add a row where Expression is set to “@Component(return)==1 and the Output Port is set to “First Returns”. These output points are shown below.
  17. We will now calculate statistics on the first return, high vegetation points. Connect the “First Returns” output to a PointCloudStatisticsCalculator. Check Max, Mean and Median for the z component.



    Complete Creating Tiles for Tree Height
  18. Now we will bring the statistics that have just been calculated together with the BoundingBoxReplacer. To do this add a FeatureMerger with the Box output from the BoundingBoxReplacer connected to the Requestor input and the output from the PointCloudStatisticsCalculator to the Supplier input. Set the parameters to that the Requester and Supplier are both joined based on “ID” with the Comparison Mode is set to “Automatic”. Each tile/box now have attributes based on the statistics that were calculated.
  19. To make the tiles three dimensional, add a 3DForcer and connect the “Merged” outputs to the input port. Change “Elevation” in the parameters to “z.max”.
  20. The outputs from the 3DForcer can be written using an Esri Shapefile writer with default parameters.
  21. You may also choose to use the Extruder transformer with the parameters Direction set to “Vertical” and Distance set to “z.mean” to make each tile have a height representative of the mean elevation. The outputs from the extruder can be viewed in the Data Inspector.


The images below show how the data change throughout this workflow example. Image a is the reprojected forest data (step 2). Image b shows the resulting tiled point clouds (step 11) after normalizing the elevation and filtering the points by pulse shape deviation. Image c shows the written shapefile output while image d shows the what the output would look like if being extruded by the z.mean.



3dforcer.jpg extruder.jpg


Data Attribution


Was this article helpful?



Please sign in to leave a comment.