Provided by: grass-doc_7.4.0-1_all bug

NAME

       r.in.lidar  - Creates a raster map from LAS LiDAR points using univariate statistics.

KEYWORDS

       raster, import, LIDAR, statistics, conversion, aggregation, binning

SYNOPSIS

       r.in.lidar
       r.in.lidar --help
       r.in.lidar  [-penosgijdv]   [input=name]    [output=name]    [file=name]   [method=string]
       [type=string]         [base_raster=name]          [zrange=min,max]          [zscale=float]
       [intensity_range=min,max]    [intensity_scale=float]    [percent=integer]    [pth=integer]
       [trim=float]                   [resolution=float]                   [return_filter=string]
       [class_filter=integer[,integer,...]]    [--overwrite]   [--help]   [--verbose]   [--quiet]
       [--ui]

   Flags:
       -p
           Print LAS file info and exit

       -e
           Use the extent of the input for the raster extent
           Set internally computational region extents based on the point cloud

       -n
           Set computation region to match the new raster map
           Set computation region to match the 2D extent and resolution of the newly created  new
           raster map

       -o
           Override projection check (use current location’s projection)
           Assume that the dataset has same projection as the current location

       -s
           Scan data file for extent then exit

       -g
           In scan mode, print using shell script style

       -i
           Use intensity values rather than Z values
           Uses intensity values everywhere as if they would be Z coordinates

       -j
           Use Z values for filtering, but intensity values for statistics

       -d
           Use base raster resolution instead of computational region
           For   getting   values  from  base  raster,  use  its  actual  resolution  instead  of
           computational region resolution

       -v
           Use only valid points
           Points invalid according to APSRS LAS specification will be filtered out

       --overwrite
           Allow output files to overwrite existing files

       --help
           Print usage summary

       --verbose
           Verbose module output

       --quiet
           Quiet module output

       --ui
           Force launching GUI dialog

   Parameters:
       input=name
           LAS input file
           LiDAR input files in LAS format (*.las or *.laz)

       output=name
           Name for output raster map

       file=name
           File containing names of LAS input files
           LiDAR input files in LAS format (*.las or *.laz)

       method=string
           Statistic to use for raster values
           Options:  n,  min,  max,  range,  sum,  mean,  stddev,  variance,  coeff_var,  median,
           percentile, skewness, trimmean
           Default: mean
           n: Number of points in cell
           min: Minimum value of point values in cell
           max: Maximum value of point values in cell
           range: Range of point values in cell
           sum: Sum of point values in cell
           mean: Mean (average) value of point values in cell
           stddev: Standard deviation of point values in cell
           variance: Variance of point values in cell
           coeff_var: Coefficient of variance of point values in cell
           median: Median value of point values in cell
           percentile: pth (nth) percentile of point values in cell
           skewness: Skewness of point values in cell
           trimmean: Trimmed mean of point values in cell

       type=string
           Type of raster map to be created
           Storage type for resultant raster map
           Options: CELL, FCELL, DCELL
           Default: FCELL
           CELL: Integer
           FCELL: Single precision floating point
           DCELL: Double precision floating point

       base_raster=name
           Subtract raster values from the Z coordinates
           The scale for Z is applied beforehand, the range filter for Z afterwards

       zrange=min,max
           Filter range for Z data (min,max)
           Applied after base_raster transformation step

       zscale=float
           Scale to apply to Z data
           Default: 1.0

       intensity_range=min,max
           Filter range for intensity values (min,max)

       intensity_scale=float
           Scale to apply to intensity values
           Default: 1.0

       percent=integer
           Percent of map to keep in memory
           Options: 1-100
           Default: 100

       pth=integer
           pth percentile of the values
           Options: 1-100

       trim=float
           Discard given percentage of the smallest and largest values
           Discard <trim> percent of the smallest and <trim> percent of the largest observations
           Options: 0-50

       resolution=float
           Output raster resolution

       return_filter=string
           Only import points of selected return type
           If not specified, all points are imported
           Options: first, last, mid

       class_filter=integer[,integer,...]
           Only import points of selected class(es)
           Input is comma separated integers. If not specified, all points are imported.

DESCRIPTION

       The  r.in.lidar  module  loads LAS LiDAR point clouds into a new raster map using binning.
       The user may choose from a variety of statistical methods which will be used  for  binning
       when creating the new raster.

       Since a new raster map is created during the binning, the binning of points depends on the
       current computational region settings (extent and resolution) by default (see  more  about
       binning  below).   When  using  the -e flag, the binning will be done in the extent of the
       point cloud, so the resulting raster will have extent based  on  the  input  point  cloud.
       When  the  resolution=value  parameter  is  used,  the  binning is done using the provided
       resolution and the resulting raster will have that resolution (see  more  below  for  more
       information about extent and resolution management).

       r.in.lidar  is designed for processing massive point cloud datasets, for example raw LiDAR
       or sidescan sonar swath data. It has been tested with large datasets (see below for memory
       management notes).

   Binning
       The  main different of r.in.lidar in comparison to r.in.lidar is that r.in.lidar creates a
       raster instead of just importing the points into GRASS GIS. However, r.in.lidar  does  not
       merely  rasterizes  the  points  from  the  point cloud. r.in.lidar uses binning to derive
       values for individual raster cells, so the value of a cell is typically an aggregation  of
       values  of  individual points falling into one cell.  In general binning is the conversion
       of points into a regular grid.  The binning of points with X and Y coordinates starts with
       the overlay of a grid of bins over the points.

       In  the  basic case, binning is a method which counts the number of points which fall into
       one raster cell, i.e. bin. The number of points per cell (bin) indicates  the  density  of
       points  in  the  point  cloud.   The cell (bin) is always square or rectangular in case of
       r.in.lidar because the result is GRASS GIS 2D raster.  The result  of  binning  where  the
       number  of  point  per  cell is counted is sometimes called 2D (two dimensional) histogram
       because a histogram is used in univariate statistics  (in  one  dimension)  to  count  the
       number samples falling into a given bin.

        Figure: The binning on left was used to count number of points per (sometimes also called
       2D histogram). The numbers in cells are examples of counts, the rest is represented by the
       color.   The  binning  on right was used with mean to create a surface based on the values
       associated with the points. The numbers show examples of cell values. Note also the  cells
       without  any  points  which were assigned the NULL value.  The basic concept of binning is
       extended when the points have another value associated with  them.  For  LiDAR  data  this
       value  can  be the Z coordinate or intensity. The value for a given cell (bin) is computed
       using univariate statistics from the values of all  points  in  the  cell.   For  example,
       computing  the  mean  value  of  Z coordinates can yield a raster representing the digital
       elevation model. Another example is the range of Z coordinates which  can  be  used  as  a
       rough estimate of vegetation height.

   Statistics
       Available statistics for populating the output raster map are:

       n
           This  computes  the  number  (count)  of points per cell. The result is a indicator of
           spatially variable density of points in the given area.

       min
           This finds the minimum of point values in each cell.  It can be  useful  when  finding
           topography  in  a  forested  or urban environment and there is a lot of points per one
           cells (terrain is oversampled considering the desired resolution).  It can also create
           surfaces  independent  on  the  noise from premature hits as it will always select the
           lowest point.

       max
           This finds the maximum of point values in each cell.  In connection  with  base_raster
           it  can  yield maximum vegetation of feature height per cell.  For this purpose, it is
           usually much more appropriate than mean which would yield heights mostly influenced by
           the vertical distribution of points.

       range
           This  computes the range of point values in each cell.  The range of Z coordinates per
           cell can be used as a rough estimate of vegetation height when  the  cells  are  small
           enough,  slopes  low  and  the  area  is mostly vegetated.  However, for more profound
           analysis, the base raster together with different statistics is recommended.

       sum
           This computes the sum of point values  per  cell.   This  is  useful  especially  when
           intensity is used as a value (flags -i and -j).

       mean
           This  is a mean (average) value of point values in cell.  When used with Z coordinates
           (the default) and points from the ground class, the  resulting  raster  is  a  digital
           elevation  model.   When  intensity  is  used  as  a point value, the resulting raster
           contains mean intensity per cell.  Note that mean  gives  heights  influenced  by  the
           vertical distribution of points

       stddev
           This computes the standard deviation of point values for each cell.

       variance
           This  computes  the  variance of point values for each cell.  Variance and derivatives
           use the biased estimator (n) [note that this might be subject to change].

       coeff_var
           This computes the coefficient of variance of point values for each  cell.  Coefficient
           of variance is given in percentage and defined as (stddev/mean)*100.

       median
           This computes the median of point values for each cell

       percentile
           pth (nth) percentile of points in cell

       skewness
           This is a skewness of point values in cell

       trimmean
           This  is  a trimmed mean of point values in cell.  Trimmed mean also know as truncated
           mean is a mean computed after discarding values at the low end and at  the  high  end.
           How  many  values to discard is given by the trim option in percent. In statistics the
           usual percentage of trimmed values ranges from 5 to 25 percent.  Note  that  different
           statistics have different memory requirements (see below for details).

   Filtering
       Points  falling  outside  the current computational region will be skipped.  This includes
       points falling exactly on the southern region bound. To capture those  adjust  the  region
       with:
       g.region s=s-0.000001
       See g.region for details about computation region handling in GRASS GIS.

       The  zrange parameter may be used for filtering the input data by vertical extent. Example
       uses include filtering out extreme outliers and outliers on relatively flat terrain.  This
       parameter can be also used for cutting the point cloud into vertical sections preparing it
       for further processing by separate sections, together as if it would be an  imagery  group
       (see i.group), or combined into a 3D raster using r.to.rast3.  In for these last examples,
       it might actually be more advantageous to use r3.in.lidar module.  The zrange parameter is
       especially  powerful  when  used  together  with  the base_raster parameter. The zrange is
       applied to Z values after the base_raster reduction.

        Figure: This is the principle of zrange filter. Points with the Z coordinate value  below
       the  lower  value  in the range (here 180) are filtered out (blue points) and same applies
       for points above higher value in the range (here 250).  All  other  points  are  preserved
       (green points).

       A  LiDAR  pulse can have multiple returns. The first return values can be used to obtain a
       digital surface model (DSM) where e.g. canopy cover is represented. The last return values
       can be used to obtain a digital terrain model (DTM) where e.g. the forest floor instead of
       canopy cover is represented. The return_filter option allows selecting one of first,  mid,
       or  last  returns.  Return  number and number of returns in the pulse associated with each
       point are compared to determine if the point is first, mid, or last return.

       LiDAR points often come as already classified into  standardized  classes.   For  example,
       class  number  2  represents  ground.  For  other  classes see LAS format specification in
       references. The class_filter option allows selecting one or  more  classes  using  numbers
       (integers) separated by comma.

       In  varied  terrain  the  user may find that min maps make for a good noise filter as most
       LIDAR noise is from premature hits. The min map may also be useful to find the  underlying
       topography in a forested or urban environment if the cells are oversampled.

       The  user  can  use  a combination of r.in.lidar output maps to create custom raster-based
       filters, for examplee, use r.mapcalc to create a mean-(2*stddev) map. (In this example the
       user  may  want  to  include  a  lower bound filter in r.mapcalc to remove highly variable
       points (small n) or run r.neighbors to smooth the stddev map before further use.)

       Note that proper filtering of the input points in  not  only  critical  for  the  analysis
       itself but it can also speed up the processing.

   Reduction to a base raster
       For  analysis of features on the terrain surface, especially vegetation it is advantageous
       to remove the influence of the terrain on heights because the height above the terrain  is
       important  (e.g. height of a tree) rather than height of the top of the tree above the see
       level.  In this case, the base raster would be digital elevation model which  can  be  one
       derived  from  the  point cloud, or obtained in some other way. LiDAR data often come with
       precomputed DEMs (quality should be checked in  this  case)  and  there  is  often  a  DEM
       available  for a given area (fit with the point cloud, especially vertical, and resolution
       should be checked).

        Figure: This is a profile of base raster (in orange) representing digital elevation model
       and  selected  points,  e.g.  first  return, from point cloud (green dots). By default the
       points would create a digital surface model (thin brown line) but  after  reducing  the  Z
       coordinates  using  the  base  raster, the created surface is a derived from the height of
       points relative to the base raster.  The usage of base raster is not  limited  to  digital
       elevation  model.  The base raster can be any surface which has some relation to the point
       values, for example digital surface model representing top of the canopy.

   Setting extent and resolution
       Since the creation of raster maps depends on the computational region settings (extent and
       resolution), as default the current region extents and resolution are used for the import.
       When using the -e flag along with the resolution=value parameter, the region used for  the
       new  raster  will  be  based  the  point  cloud  extent and the provided resolution. It is
       therefore recommended to first use the -s flag to get the extents of the LiDAR point cloud
       to be imported, then adjust the current region extent and resolution accordingly, and only
       then proceed with the actual import.  Another option is to automatically  set  the  region
       extents  based  on  the  LAS  dataset  itself  (-e  flag)  along  with  the desired raster
       resolution. The best option is to know the point cloud  extent  ahead,  e.g.  from  tiling
       scheme, and use it. See below for details.

       Since  the  r.in.lidar  generates  a  raster  map  through binning from the original LiDAR
       points, the target computational region extent and resolution have  to  be  determined.  A
       typical  workflow would involve the examination of the LAS data’s associated documentation
       or the scan of the LAS data file with r.in.lidar’s -s (or  -g)  flag  to  find  the  input
       data’s bounds.

       Another  option is to automatically set the region extents based on the LAS dataset extent
       (-e flag) along with the desired raster resolution using the resolution parameter.

       Using the -s scan flag, the extent of the input data (and thus point density) is  printed.
       To  check  this  is recommended before performing the full import. The -g shell style flag
       prints the extent suitable as command line parameters for g.region.

       A simpler option is to automatically set the region extents based on the LAS  dataset  (-e
       flag) along with the target raster resolution using the resolution parameter. Also here it
       is recommended to verify and optimize the resulting region settings with g.region prior to
       importing the dataset.

NOTES

   Format and projection support
       The  typical  file  extensions  for  the  LAS  format  are .las and .laz (compressed). The
       compressed LAS (.laz) format can be imported only if libLAS has been compiled with  LASzip
       support.  It  is also recommended to compile libLAS with GDAL which is used to test if the
       LAS projection matches that of the GRASS location.

   LAS file import preparations
       Note that the scanning (-s or -g flags) needs to iterate over the whole point cloud.  This
       will  take  a long time for large datasets, so if the user knows the approximate extent of
       the dataset, for example because it dataset for one county or tiling scheme  is  available
       as vector polygons, it is much more advantageous to provide the extent information instead
       of retrieving it from the dataset.  The same applies to the -e flag which  also  needs  to
       perform scanning before the binning begins.

       Also  note  that  the  scanning  does  not  apply any filters, so the extent determined by
       scanning can be theoretically bigger than the extent actively  used  during  the  binning.
       This  behavior ensures that the newly created raster has always the same extent regardless
       the filters used.  However, for most cases (considering the point cloud and the resolution
       used)  there is no difference between the extent without filters applied and the extent if
       the filters would be applied.

   Memory consumption
       While the input file can be arbitrarily large, r.in.lidar  will  use  a  large  amount  of
       system  memory  (RAM)  for  large  raster  regions  (> 10000x10000 pixels).  If the module
       refuses to start complaining that there isn’t enough memory, use the percent parameter  to
       run  the  module  in  several  passes.   In addition using a less precise map format (CELL
       [integer] or FCELL [floating point]) will use less memory than a DCELL  [double  precision
       floating point] output map.  For method=n, the CELL format is used automatically.

       The mean and range methods will use average amount of memory (comparing to other methods).
       Methods such as n, min, max, and sum will use less memory,  while  stddev,  variance,  and
       coeff_var will use more.

       The memory usage for regular statistics mentioned above is based solely on region (raster)
       size.  However, the aggregate functions median, percentile, skewness and trimmean will use
       more  memory and may not be appropriate for use with arbitrarily large input files without
       a small value for the percent option because unlike the other statistics  memory  use  for
       these also depends on the number of data points.

       The default map type=FCELL is intended as compromise between preserving data precision and
       limiting system resource consumption.

EXAMPLES

       Simple example of binning of point from a LAS file into a newly created raster map  in  an
       existing location/mapset (using metric units):
       # set the computational region automatically, resol. for binning is 5m
       r.in.lidar -e -o input=points.las resolution=5 output=lidar_dem_mean
       g.region raster=lidar_dem_mean -p
       r.univar lidar_dem_mean

   Finding suitable extent and resolution
       Using  the -s scan flag, the extent of the input data (and thus point density) is printed.
       To check this is recommended before performing the full import. The -g  shell  style  flag
       prints the extent suitable as command line parameters for g.region.

       A  simpler  option is to automatically set the region extents based on the LAS dataset (-e
       flag) along with the target raster resolution using the resolution parameter. Also here it
       is recommended to verify and optimize the resulting region settings with g.region prior to
       importing the dataset.

       For the output raster map, a suitable resolution can be found by dividing  the  number  of
       input points by the area covered (this requires an iterative approach as outlined here):
       # print LAS metadata (Number of Points)
       r.in.lidar -p input=points.las
       #   Number of Point Records: 1287775
       # scan for LAS points cloud extent
       r.in.lidar -sg input=points.las output=dummy -o
       # n=2193507.740000 s=2190053.450000 e=6070237.920000 w=6066629.860000 b=-3.600000 t=906.000000
       # set computation region to this extent
       g.region n=2193507.740000 s=2190053.450000 e=6070237.920000 w=6066629.860000 -p
       # print resulting extent
       g.region -p
       #  rows:       3454
       #  cols:       3608
       # points_per_cell = n_points / (rows * cols)
       # Here: 1287775 / (3454 * 3608) = 0.1033359 LiDAR points/raster cell
       # As this is too low, we need to select a lower raster resolution
       g.region res=5 -ap
       #  rows:       692
       #  cols:       723
       #  Now: 1287775 / (692 * 723) = 2.573923 LiDAR points/raster cell
       # import as mean
       r.in.lidar input=points.las output=lidar_dem_mean method=mean -o
       # import as max
       r.in.lidar input=points.las output=lidar_dem_max method=max -o
       # import as p’th percentile of the values
       r.in.lidar input=points.las output=lidar_dem_percentile_95 \
                  method=percentile pth=95 -o
       Mean value DEM in perspective view, imported from LAS file

       Further hints: how to calculate number of LiDAR points/square meter:
       g.region -e
         # Metric location:
         # points_per_sq_m = n_points / (ns_extent * ew_extent)
         # Lat/Lon location:
         # points_per_sq_m = n_points / (ns_extent * ew_extent*cos(lat) * (1852*60)^2)

   Serpent Mound dataset
       This  example is analogous to the example used in the GRASS wiki page for importing LAS as
       raster DEM.

       The sample LAS data are in the file "Serpent  Mound  Model  LAS  Data.las",  available  at
       appliedimagery.com:
       # print LAS file info
       r.in.lidar -p input="Serpent Mound Model LAS Data.las"
       # using v.in.lidar to create a new location
       # create location with projection information of the LAS data
       v.in.lidar -i input="Serpent Mound Model LAS Data.las" location=Serpent_Mound
       # quit and restart GRASS in the newly created location "Serpent_Mound"
       # scan the extents of the LAS data
       r.in.lidar -sg input="Serpent Mound Model LAS Data.las"
       # set the region to the extents of the LAS data, align to resolution
       g.region n=4323641.57 s=4320942.61 w=289020.90 e=290106.02 res=1 -ap
       # import as raster DEM
       r.in.lidar input="Serpent Mound Model LAS Data.las" \
                  output=Serpent_Mound_Model_LAS_Data method=mean

       Figure: Elevation for the whole area of Serpent Mound dataset

   Height above ground
       The  mean  height  above  ground  of  the points can be computed for each raster cell (the
       ground elevation is given by the raster map elevation):
       g.region raster=elevation -p
       r.in.lidar input=points.las output=mean_height_above_ground base_raster=elevation method=mean
       In this type of computation, it might be advantageous to change the  resolution  to  match
       the precision of the points rather than deriving it from the base raster.

   Multiple file input
       The  file option requres a file that contains a list of file names with the full path. For
       example, a list of files in the directory /home/user/data:
       points1.laz
       points2.laz
       points3.laz
       would be lised in the file as:
       /home/user/data/points1.laz
       /home/user/data/points2.laz
       /home/user/data/points3.laz
       On Linux and OSX, this file can be automatically generated with the command:
       ls /home/user/data/*.laz > /home/user/data/filelist.txt
       On Windows:
       dir /b c:\users\user\data\*.laz > c:\users\user\data\filelist.txt
       The mean height above ground example above would then be:
       g.region raster=elevation -p
       r.in.lidar file=/home/user/data/filelist.txt output=mean_height_above_ground base_raster=elevation method=mean
       In Python, the list of files can be created using the glob Python module:
       import glob
       import gscript
       file_list_name = ’/home/user/data/filelist.txt’
       with open(, mode=’w’) as file_list:
           for path in glob.iglob(’/home/user/data/lidar/*.las’):
               file_list.write(path + "\n")
       gscript.run_command(’r.in.lidar’, file=file_list_name,
                           output=’mean_height_above_ground’,
                           base_raster=’elevation’ method=’mean’)

KNOWN ISSUES

           •   The "nan" value (as defined in C language) can leak into  coeff_var  raster  maps.
               Cause is unknown. Possible work-around is: r.null setnull=nan or r.mapcalc ’no_nan
               = if(map == map, map, null())’.

           •   Only one method can be applied for a single run and multiple  map  output  from  a
               single  run  (e.g.  method=string[,string,...] output=name[,name,...]  or n=string
               mean=string) is no supported.
       If you encounter any problems (or solutions!) please contact the GRASS Development Team.

SEE ALSO

        g.region, r.in.xyz, r.mapcalc, r.univar, v.in.lidar, r3.in.lidar, v.vect.stats
       v.lidar.correction, v.lidar.edgedetection, v.lidar.growing, v.outlier, v.surf.bspline
       Trimmed mean (Truncated  mean,  Wikipedia  article),  OpenTopography  (LiDAR  point  cloud
       repository)

REFERENCES

           •   V.  Petras,  A.  Petrasova,  J.  Jeziorska, H. Mitasova (2016): Processing UAV and
               lidar point clouds in GRASS GIS.   XXIII  ISPRS  Congress  2016  [ISPRS  Archives,
               ResearchGate]

           •   ASPRS LAS format

           •   LAS library

           •   LAS library C API documentation

AUTHORS

       Markus Metz
       Vaclav Petras, NCSU GeoForAll Lab (base_raster option, documentation)
       based on r.in.xyz by Hamish Bowman and Volker Wichmann

       Last changed: $Date: 2016-08-22 04:16:33 +0200 (Mon, 22 Aug 2016) $

SOURCE CODE

       Available at: r.in.lidar source code (history)

       Main index | Raster index | Topics index | Keywords index | Graphical index | Full index

       © 2003-2018 GRASS Development Team, GRASS GIS 7.4.0 Reference Manual