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

GRASS 7.4.0                                                                                   r.in.lidar(1grass)