4582
				
			
			
			How to change values in a LAS file using the ENVI Lidar programming interface (API)
			
			
		
		
		
			
			
		
			ENVI LiDAR is an interactive geospatial software environment that lets you create realistic 3D visualizations and easily extract important features and products from raw LiDAR point cloud data. The elevation information contained within LiDAR can be used to create Digital Elevation Models (DEMs), or be included in your geospatial products like line-of-sight or right-of way analyses.
Occasionally, it might be desirable to alter the values contained in a Lidar .LAS format file such as elevation (z) or attribute (RGB, class).  ENVI LiDAR's API can be used to edit and write out a new .LAS file with the desired changes.  The following code examples alter the data within a .LAS file by 1) adding a constant value to the elevations within the file and 2) setting the RGB value of a classified .LAS.  The first example code uses the sample .LAS dataset that is contained in the ENVI LiDAR distribution. The second example uses a classified .LAS file.
;-------------------------------
; Example code that changes the elevation (z) values in a .LAS file by adding a constant
PRO AddConstantZValue
  COMPILE_OPT idl2
  e = e3de(/headless)
  lasFileName = 'C:\ProgramFiles\Exelis\ENVILiDAR51\DataSample\DataSample.las'
  ;Directly read the input LAS filecontaining classification values
  oLidar = e.openlidar(lasFileName,/DIRECT_READ)  
  startIndex = 0
  blockSize = 500000
  allClass = MAKE_ARRAY(blockSize, /BYTE)
  increaseZby = 10  
  ; create the E3DLidarWriter
  outFileName = 'C:\Temp\IncreasedZby10.las'
  writer = E3DLidar(outFileName,/OVERWRITE)
    allread = 0
  ;Cycle through the points
  WHILE (allread eq 0) DO BEGIN
    pointsInRange = oLidar.GetPointsInRange(startIndex,blockSize, $
                           ALL_ATTRIBS=ALL_ATTRIBS, $
                           COUNT=nPointsRead)
    ;increase the z value byincreaseZby
    pointsInRange[2,*] = pointsInRange[2,*] + increaseZby
    ;write the updatedpoint values and all attributes
    writer.WritePoints, pointsInRange,ALL_ATTRIBS=all_attribs
    startIndex += nPointsRead
    IF (nPointsRead LT blocksize) THEN allread = 1 
  ENDWHILE
  ;Save and close output LAS file
  writer.SAVE
  writer.CLOSE
  e.CLOSE
END
;--------------------------
; Example code that changes an attribute value in a .LAS file by assigning an RGB value to a class
PRO setRGBbyLASclass
  COMPILE_OPT idl2
  e = e3de(/headless)
 
 ;Specify the classified input LASfile name
  lasFileName = 'C:\temp\classifiedPointcloud.las'
  ;Directly read (don’t create a project) the input LAS file containing classification values
  oLidar = e.openlidar(lasFileName,/DIRECT_READ)
  startIndex = 0
  blockSize = 500000
  allClass = MAKE_ARRAY(blockSize, /BYTE)
  ; create the output file
  outFileName = FILE_DIRNAME(lasFileName) + '\RGBbyClassification.las'
  writer = E3DLidar(outFileName,/OVERWRITE)
  allread = 0
  ;Cycle through the points, setting the RGBvalue based on
  ;classification values of the points
  WHILE (allread eq 0) DO BEGIN
    pointsInRange = oLidar.GetPointsInRange(startIndex,blockSize, $
                           ALL_ATTRIBS=ALL_ATTRIBS, $
                           COUNT=nPointsRead)
   ;*ALL_ATTRIBS.CLASSIFICATIONS returns the classification codes stored in
    ; the las file
    inClass = *ALL_ATTRIBS.CLASSIFICATIONS
    IF (nPointsRead LT blocksize) THEN allread = 1 
    allClass =[allClass,inClass]
    uniqAllClass = allClass[UNIQ(allClass, SORT(allClass))]
    rgb = MAKE_ARRAY(3,nPointsRead, /BYTE)
    FOREACH i, uniqAllClass DO BEGIN
      CASE i OF
        ;Unprocessed
        0: BEGIN
            index = WHERE(inClass EQ 0)
            red=190
            green=190
            blue=190
            rgb[0,index] = red
            rgb[1,index] = green
            rgb[2,index] = blue
          END
       ;Unclassified
        1: BEGIN
            index = WHERE(inClass EQ 1)
            red=255
            green=255
            blue=255
            rgb[0,index] = red
            rgb[1,index] = green
            rgb[2,index] = blue
          END
        ;Terrain
        2: BEGIN
            index = WHERE(inClass EQ 2)
            red=255
            green=177
            blue=100
            rgb[0,index] = red
            rgb[1,index] = green
            rgb[2,index] = blue
          END
        ;Near Terrain
        3: BEGIN
            index = WHERE(inClass EQ 3)
            red=128
            green=255
            blue=0
            rgb[0,index] = red
            rgb[1,index] = green
            rgb[2,index] = blue
          END
        ;Trees
        5: BEGIN
            index = WHERE(inClass EQ 5)
            red=0
            green=147
            blue=0
            rgb[0,index] = red
            rgb[1,index] = green
            rgb[2,index] = blue
          END
        ;Buildings
        6: BEGIN
            index = WHERE(inClass EQ 6)
            red=217
            green=217
            blue=0
            rgb[0,index] = red
            rgb[1,index] = green
            rgb[2,index] = blue
          END
       ;Power lines
        14: BEGIN
             index = WHERE(inClass EQ 14)
             red=255
             green=100
             blue=255
             rgb[0,index] = red
             rgb[1,index] = green
             rgb[2,index] = blue
           END
        ;Power poles
        15: BEGIN
             index = WHERE(inClass EQ 15)
             red=160
             green=80
             blue=0
             rgb[0,index] = red
             rgb[1,index] = green
             rgb[2,index] = blue
           END
        ELSE: PRINT, 'Bad value'
      ENDCASE
    ENDFOREACH
    writer.WritePoints, pointsInRange,ALL_ATTRIBS=all_attribs, RGB=rgb
    startIndex += nPointsRead
  ENDWHILE
  ;Save and close output LAS file
  writer.SAVE
  writer.CLOSE
  e.CLOSE
END
Reviewed 8/25/2014 MM