Version 9 (modified by benj, 11 years ago) (diff)

--

Creation of DEMs from LIDAR point clouds

This guide assumes you have a LIDAR dataset comprising a number of files containing LIDAR lines of the following format:

217755.001130 30563577.97 4513423.12 1293.23   178 30563577.96 4513423.12 1293.28   178
time(gps?)(last pulse) ZZeasting northing height(m) pulse_time? (first pulse) ZZeasting northing height(m) pulse_time? 

Automatic method

This method runs a script file that does all the steps from the manual method below. Use it unless for some reason you can't.

  1. If you don't already have one, create a GRASS location that is appropriate for the area covered by the Lidar data.
  1. Run the script file
    lidar2dem.sh <grass_mapset_directory> [Intermediate_file] [--reuse|--overwrite]
    

Note that while it is not necessary to specify an intermediate file (in this case a temporary file will be used), it is recommended that you do so. This is because if you specify one then it can be reused for subsequent runs (saving time), and because the name of the intermediate file is used as a base for the file name of the GRASS map that is created and of the DEM. You may specify --reuse or --overwrite to determine what will be done if the intermediate file already exists - if you do not specify and the file already exists you will be prompted.

Note also that it is recommended that you check the displayed upper and lower bounds against the displayed histogram to ensure that the automatically chosen values are sensible. If they are not and this causes a problem with the DEM then it will be necessary to reprocess using the manual method as below.

Manual method

  1. Merge files and strip off unnecessary UTM zone number by running trim_lidar.sh in the directory containing the lidar files:

Usage: trim_lidar.sh > output_file

  1. Generate a histogram for the lidar data to determine min/max reasonable data values by running lidar_histogram.py:

Usage: python lidar_histogram.py input_file

Note for ARSF internal use there is a convenience script in the path - use "lidar_histogram.sh <input_file>"

This generates a 5x log histogram (ie it's a histogram of the base-10 log of the lidar values binned into 10m bins, multiplied by 5 to scale). If there are a small number of low or high values in the histogram then decide on a scaling cutoff. eg:

20: 
40: #################
50: #############################
60: #############################
70: ##############################
80: ##############################
90: ###############################
100: ###############################
110: ###############################
120: ################################
130: ################################
140: ###############################
150: #############################
160: ############################
170: ############################
180: ###########################
190: ###########################
200: ##########################
210: #######################
220: ###################
230: ##############
590: #####
600: ######
610: ######
620: ####

In the given example, there are a very few values between 20-30m at the bottom end, and a big gap at the top end before a small number of values above 590m (nothing between 240m and 590m). So it would be sensible to pick 30m as a minimum cutoff and 250m as a maximum. Note that because the histogram is on a log scale the difference in numbers of points at both ends is much larger than it looks at first glance. The script will display values that it thinks are appropriate cut-off values.

  1. Check the LIDAR data projection in the header file. Open GRASS, select (or create) an a location in the appropriate projection and set the region appropriately for the dataset - geographic boundaries for the data are given by the script in the previous step, though you may wish to add a small amount of padding to this to ensure that the produced DEM covers the flight area.
  1. Read in the trimmed lidar file using r.in.xyz. Note that for large areas this will use a LOT of memory - if the command refuses to start complaining of a lack of memory, use the percent argument and the command will automatically run in several passes - this will take longer, but use less memory on each pass.
    r.in.xyz input=<trimmed_lidar_file> output=<lidar_basemap> x=2 y=3 z=4 fs=" " zrange=<min_cutoff>,<max_cutoff> [percent=xx]
    
  1. Interpolate gaps in the map using r.fillnulls:
    r.fillnulls input=<lidar_basemap> output=<lidar_interp_map>
    
  1. Reproject the dataset if necessary to match the projection of the flight data (should be the same, but conceivably won't be). See Creation of DEMs from SRTM 90m data for how to do this.
  1. Generate an ASCII DEM as per Creation of DEMs from NextMap data:
    r.out.ascii input=<lidar_interp_map> output=lidar.dem null=0
    

Attachments (3)

Download all attachments as: .zip