Estimating forest canopy density and height

Forest canopy density and height are used as variables in a number of environmental applications. These applications include the estimation of biomass, forest extent and condition, and biodiversity. Canopy density, or canopy cover, is the ratio of vegetation to ground as seen from the air. Canopy height measures how far above the ground the top of the canopy is. Lidar can be used to determine both of these variables.

The following are steps to calculate canopy density and height from lidar points. First, you need lidar that has been classified into ground returns (bare earth) versus nonground returns. This type of point classification is usually performed by your data provider. Secondly, you need to consider when the lidar was collected and the type of vegetation in the study area. If there are a lot of deciduous trees and the collection was performed during autumn (leaf off),the density calculation is not going to work.

Loading points into the geodatabase

To calculate canopy density, load the ground, or bare earth, lidar points into one multipoint feature class and aboveground points into another multipoint feature class. Assuming your data is in LAS format, you can load the lidar points into the geodatabase using the LAS To Multipoint geoprocessing tool. Make sure to specify the proper class codes to filter the two multipoint feature classes with. The following table contains the LAS class codes as defined in the LAS 1.1 standard:

Class code

Classification type


Created, never classified






Low vegetation


Medium vegetation


High vegetation




Low points (noise)


Model key



Any LAS file made in the last few years should use these codes if the points have been classified. Unfortunately, there's still some ambiguity. For example, class 2 is ground, but class 8 is ground as well. Class 8, or model key, points are a special set of ground points used for contouring or other applications requiring a thinned set of ground points. Whether you have them depends on how the data was processed. If you don't know, specify both classes. If it turns out there are not any model key points, it won't hurt. Vegetation has a similar issue. Sometimes vendors place everything that's above ground into class 1 because they haven't performed a more detailed classification on them. So if you are unsure of the specifics of your data's classification, load nonground points using classes 1, 3, 4, and 5. That's a reasonable catch-all to get your vegetation points. Note, if buildings or other man-made nonground features are in class 1, you will get them too, and they'll skew the results somewhat.

Calculating the density

The most effective way to determine the canopy density is to divide the study area into many small equal-sized units through rasterization. In each raster cell, you compare the number of aboveground returns to the total number of lidar returns.

The important technique to remember here is to determine an appropriate cellsize for this analysis. It needs to be at least four times the average point spacing. You can go larger but not smaller with the cell size.

  1. Use the Point To Raster geoprocessing tool on the aboveground points with the COUNT option.
  2. Point To Raster
  3. Convert any resulting NoData cells to 0 so that subsequent operations treat a cell with no points as 0. This is accomplished using the IsNull geoprocessing tool followed by the Con geoprocessing tool.
  4. Is Null geoprocessing tool
    Con geoprocessing tool
  5. Repeat steps 1 and 2 with the lidar ground multipoints.
  6. Add the aboveground and bare earth rasters together to get a total count per cell using the Plus geoprocessing tool.
  7. Plus geoprocessing tool
  8. All the rasters you've made so far are long data types. You need one raster to be floating point to get floating point output from the Divide geoprocessing tool that you will use in step 6. To generate a float raster, use the output raster from the Plus geoprocessing tool as input to the Float geoprocessing tool.
  9. Float geoprocessing tool
  10. Now use the Divide geoprocessing tool to compare the aboveground count raster and the floating point total count raster. This gives you the ratio from 0.0 to 1.0, where 0.0 represents no canopy and 1.0 very dense canopy.

The following image represents canopy density. The lightest areas have little to no vegetation. These are areas where a large percentage of lidar shots could "see" the ground. The dark green areas, where lidar could not penetrate to ground as well, indicate denser vegetation canopy.

Density results

Calculating the height

To determine canopy height, you will need to subtract the bare earth surface (DEM) from the first return surface (DSM). Follow the steps in the Creating raster DEMs and DSMs from large lidar point collections topic to generate these two surfaces.

  1. Once you have generated the first return and bare earth rasters, use the Minus geoprocessing tool to determine the difference between these two raster datasets. The difference results represent, over forest, the canopy height.

The image below represents height above ground. It ranges from blue (little to no height) to orange, which is the tallest.

Height results

Lidar can be used to calculate the density and height of vegetation. This is useful for a variety of purposes, including biomass and carbon estimates, as well as forest management.