I'm working on a LiDAR project to determine where Joshua trees are located within a specified study area. Due to the vegetation cover being so sparse, there are really on 2 canopy species there, which are Joshua trees and cottonwoods. I believe this to be a relatively easy LiDAR analysis due to very limited species richness in the canopy. My approach has been to create a bare earth raster (DEM) and then a 1st return raster. I would then subtract the bare earth from the 1st return raster to create a vegetation raster. I would be able to easily remove any noise (e.g. power lines, buildings) by using a basemap for verification. Because the client wants to see all Joshua trees >=12ft, I would simply reclassify the vegetation raster. By doing this, I should be able to see all tree species, which should be Joshua trees, within my study area. With this methodology, I've only been able to create the highest bare earth point locations in the study area, which is not what I want and am confused as to why this is my output.

This is the methodology I've followed in ArcMap:

Create Bare Earth Layer

  1. Create a las dataset of the selected study area with the Create LAS Dataset tool
  2. Make a las dataset layer with this layer with the Make LAS Dataset Layer tool
    a. Select 2 (ground) from the Class Codes
  3. Convert this layer to raster with the LAS Dataset to Raster tool.

Create Vegetation Layer


  2. Subtract the Bare Earth raster from the 1st Return Raster with the Minus tool

     1st Return (raster) – Bare Earth (raster) = Vegetation Layer
  3. Use the Reclassify tool to determine what is 12 ft and greater:

           Classification: Natural Breaks (Jenks)
           Classes: 2
           Break values: 3.66, 10.725098

Does anybody have any experience with this and might be able to provide some tips/pointers in where I might be going wrong? If people know of better methodologies, I am open to ideas!

  • "With this methodology, I've only been able to create the highest bare earth point locations in the study area...". I could understand almost everything you described, except for this key part (i.e., the unexpected output). Can you clarify (say in other words, add a screenshot)? Thanks. Jul 9, 2017 at 21:45

2 Answers 2


The "quality" of the CHM raster that you generate from the LiDAR points as input to the CanopyMaxima algorithm will significantly affect your results. I suggest to try out a few methods for generating a CHM, such as

  • simple highest return gridding / binning
  • highest returns turned into a small disk gridding / binning
  • first-return interpolation via a TIN followed by rasterization
  • TIN interpolation of only highest returns on a grid and rasterization
  • the pit-free algorithm based on partial CHMs
  • the spike-free algorithm based on spike-avoidance.

These two blog articles on pit-free and spike-free describe how to generate CHM raster with the different methods listed above using LAStools.


It appears as if you are attempting to create a canopy height model with your workflow. This will show the height of all objects above ground. Looking at your species of interest, cottonwood trees typically grow tall and within riparian areas and flood zones. Joshua trees are more arid upland trees. Therefore, reclassifying the canopy height model to include all pixels >= 12' would certainly include both species rather than only Joshua trees.

ArcGIS is great for manipulating derived LiDAR products, although has a long way to go when it comes to LiDAR processing. Rather, I would recommend FUSION, which is optimized for working on LiDAR forestry applications. I would recommend an algorithm in FUSION called CanopyMaxima to identify individual trees within your AOI. From the documentation (p.26):

CanopyMaxima is most often used to identify individual dominant and codominant trees as represented in a canopy height model. It works best for conifer trees that are relatively isolated. In dense stands, trees growing in close proximity to one another cannot be separated. The result is a single local maxima where there should be more than one maxima. The algorithm does not perform well in deciduous forests because the crown shape for such trees tends to be more rounded and crowns tend to overlap one another near the top of the tree

The command is relatively simple:

CanopyMaxima /img24 canopy_maxima_test_1m.dtm testtrees.csv

From here, you have a CSV file showing the coords of individual trees. To filter out cottonwood trees, consider the following workflow:

  1. Convert tree location CSV to point shapefile
  2. Identify riparian areas (via thresholding a DEM, or buffering a streams layer, for example) and use that to filter out any tree location points within the riparian areas.
  • Thank you so much for the help. I have a few questions. Should I create the DTM in ArcMap and then use that DTM in the algorithm above? Also, where do I enter this algorithm in Fusion? I really have no experience with this software program. If you have time, I would love to discuss this with you further. Maybe even on the phone. I read that you are a consultant. Maybe we could make an agreement on a fee and we could work on this so I can develop methodology for my project. My number is 3076907598. Thanks so much!!
    – Tommy JH
    Jul 10, 2017 at 17:55

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.