Point Cloud to 3D Terrain Model with Buildings

Liz Sanderson
Liz Sanderson
  • Updated

Introduction

Since LiDAR point cloud data contains information about any surface that reflects a laser beam, we can use it to model terrain and building shapes. This is exactly what we set out to do in this demo, where a LAS point cloud is used to (1) build a triangular irregular network (TIN) terrain model and (2) extrude building footprints to their actual 3D height. Each of these two steps becomes a layer in our output: a 3D model written to PDF that captures the urban built environment in a Vancouver neighborhood.

There are two tricks to this workflow: 

1. Extracting and replacing the building footprint geometry (vector data)

and

2. Clipping the point cloud using the building footprints. In short, we will isolate the point clouds for each building footprint, then extrude them into 3D solids. 

CAD Building Outlines:

d0f-zXlzx4wbJKo3wlEAM8Ryr55MOVsAMldcKnqqrncaWAgRvBI1e6_bz4W3L7dkB5jTMSSFwiLiQPYihEBqYXIUxg2aKWLmGHKBSlOUCyP5bwyZ5mV-LNS6cJbjj51w4OvJM9U

LAS Point Cloud:

Ljc6y-1S_epaF5L_jE6p1AOraQsbtv6TW5zAxdObn2ZqJ4Wx5EUyrssNrJsqNZkcvmcWg3fmtcaOtEDDYi-M5yairimnC2tUQcPLFsaYVIJQZKJ57oWc04lvb3bVosEODVqe_SM

Step-by-step Instructions

1. Read Source Point Cloud and Buildings

The City of Vancouver's point cloud data is stored in the ASPRS LiDAR Data Exchange Format (LAS), an industry-standard format for 3D point clouds. Building outlines and base heights are read from a vector ACAD DWG file. Read in both files found in the Files section of the article.

Add a reader to the canvas for the LAS.laz file. Add another reader for the AutoCAD DWG building footprint file building_outlines.dwg. When reading the CAD file, go to the Parameters and set Group Entities By to Attribute Schema to access the base heights attributes for extrusion later. 

2. Store Building Geometry

Add a GeometryExtractor and connect it to the building footprints to store the current geometry as an attribute on the feature. This can be very useful if a feature’s geometry needs to be temporarily altered to obtain additional information, as is the case when we combine this data with the point cloud in the next steps. Extracting a feature’s original geometry allows it to be restored at any time. We’ll restore the building footprint geometry once we’re ready to extrude the buildings into three dimensions.

In the GeometryExtractor parameters, make sure that the Geometry Encoding is set to FME Binary and the Destination Geometry Attribute is _geometry. We will not need to remove geometry.

image.png

If you would like to run your translation now, adjust feature handling so that the translation doesn’t terminate when it encounters a rejected feature. You can do this by going to: Navigator > Workspace Parameters > Translation > Reject Feature Handling: Change it to Continue Translation.

3. Filter the Point Cloud for Buildings

Classified point clouds will contain a component that stores the classification, usually as a coded numeric value. This classification is typically used to distinguish between points belonging to ground, vegetation, buildings, etc. Add a PointCloudFilter to the LAS reader and use the following expressions to filter out points classified as Buildings or Ground.

Output Port: Buildings

Expression: @Component(classification)==6  

Output Port: Ground

Expression: @Component(classification)==2  

 image.png

Here’s the workspace up to this point:

image.png

4. Clip the Point Cloud by the Buildings

To get height values for every building, clip the point cloud by the building outline features. Add a Clipper and connect the filtered Buildings points to the Candidate port and the building outlines to the Clipper port. To preserve the Clipper's attributes, enable the Merge Attributes parameter in the parameters. Then set the Accumulation Mode to Merge Clipper, and Conflict Resolution to Use Candidate.

This means that we will keep the point cloud (Candidate) attributes and resolve any conflicts in merging by preserving the point cloud attributes. The result is a point cloud for every building!

image.png

5. Get Building Heights

Connect the Inside output port from the Clipper to a PointCloudStatisticsCalculator transformer. Open the PointCloudStatisticsCalculator parameters and enable Median for the z Component. The median is used because the roof provides most of the points in the point cloud. We don't use the maximum point cloud height because it includes items like antennas that aren't representative of the actual building height.

image.png

6. Restore the Geometry

Use the GeometryReplacer to restore the geometry from the attribute _geometry. Now, every building has its original vector geometry and a median height value derived from the point cloud.

image.png

7. Set Building Base Heights

Since the z.median value derived from the PointCloudStatisticsCalculator represents height above sea level and not the true height of the building, we need a logical way to find the height of the building based on the two pieces of elevation data that we have: the elevation of the building footprint (base_height) and the elevation of the building rooftop (z.median). 

From the GeometryReplacer output, connect a 3DForcer to set the base heights to the base_height attribute from the source DWG building outlines. Once the base elevation is correct, we can accurately extrude the building height from the building’s base elevation to the median point cloud height using some simple subtraction.

image.png

If base_height is not appearing as an option for you, make sure that your reader parameters are set to Group Entries By: Attribute Schema. Replace the reader to access the additional parameters, if needed.

8. Extrude the Buildings

An extrusion is defined as the extension of an object by an additional dimension. In our case, we want to project our 2D building footprints into 3D buildings. To achieve this, we add an Extruder transformer connected to the 3DForcer's output port to extrude the buildings to the rooftop height derived from the point clouds minus the base elevation. Use the Arithmetic editor in the Extruder and enter the following expression in the Distance field:

@Value(z.median)-@Value(base_height)

image.png

The 2D building outline polygons are converted to 3D solids based on the building's height values.

image.png

9. Create Surface

A surface will be created with the ground points to fill in the terrain surrounding the buildings. Add a TINGenerator transformer and connect the Ground output port from the PointCloudFilter to the Points/Lines input port of the TINGenerator. 

image.png

The surface tolerance parameter of the TINGenerator determines which input points are added as model vertices. In our case, a value of 1 is suitable. The larger the value, the more input points will be filtered out.

image.png

10. Write the Result

The TIN surface and extruded buildings can be written to any format that supports surfaces or meshes, such as SketchUp, 3D PDF, or Autodesk FBX. In this example, we will write to an Adobe 3D PDF and create two destination feature types, one for the building and one for the ground. Connect the extruded buildings and the TINSurface output port from the TINGenerator to their respective feature types.

To create a single PDF, you will write out two feature types into a single writer:

  1. Connect the Extruded output port of the Extruder to a 3D PDF Writer named ‘Buildings’.
  2. Select the TINSurface output port of the TINGenerator and go to Writers > Add Feature Type on the top menu bar. Name the feature type ‘Ground’ and select the existing writer from the drop-down menu.

image.png

Now, when you go to your Navigator to view the writers, notice that there are two Feature Types in the Buildings writer. 

image.png

Run the workspace to generate a PDF, then view it with Adobe Reader. If you decide to make any changes and run the translation again, make sure you have closed any open PDFs before starting.

 

Completed Workspace

image.pngResults

3D Model viewed in Adobe PDF Reader:

image.png

Alternate Approach

Building Heights from Point Cloud

If you don't have building height/elevation data present in your vector building footprints, you can retrieve the base heights of the buildings from the point cloud data rather than from the existing attribute. Before extruding, it is best to drape the building outlines onto the TIN surface. To create a flat base, there should be only one z value per outline. To achieve this, SurfaceDraper, CoordinateExtractor, and StatisticsCalculator are a good place to start!

image.png

Conclusion

This workflow highlights the power of the PointCloudFilter for working with LAS files as well as the potential in FME to combine multiple files of different types into a valuable information product. With vector building footprints and a point cloud, we’ve extracted elevation data, merged the geometries, extruded 3D solids, and created a surface and building model that, once written altogether to PDF, can easily be shared and viewed in a PDF reader by colleagues unfamiliar with GIS or without access to FME Form.

Additional Resources

Data Attribution

The data used here originates from open data made available by the City of Vancouver, British Columbia. It contains information licensed under the Open Government License - Vancouver.

Was this article helpful?

We're sorry to hear that.

Please tell us why.

As of January 14th, 2026, comments on knowledge base articles have been closed. To make sure questions don’t get missed and to enable more community support, we’ve moved discussions to the FME Community. If you have a question or a comment about this article, please create a new post or create a support ticket.