X
2326

How to use ENVIPixelwiseBandMathRasterTask on all bands in a file

This Help Article provides an example of how to perform 'file math' (a math expression on all bands in a file) using ENVI's ENVIPixelwiseBandMathRasterTask.  This is the new method for performing Band Math in ENVI on a single file. 

In some cases it may be necessary to use ENVI Classic's MATH_DOIT.  For example, if the equation uses bands from more than one file (raster), then you will need to use the ENVI Classic method.  If you are interested in using the ENVI Classic method for performing 'file math', please see this help article:

http://www.harrisgeospatial.com/Support/SelfHelpTools/HelpArticles/HelpArticles-Detail/TabId/2718/ArtMID/10220/ArticleID/19007/3893.aspx

The following example shows how to apply a simple equation to each band in a file using ENVIPixelwiseBandMathRaster:

;===============================================

pro newFileMath
  compile_opt idl2
  
  ; Start the application
  e = ENVI()

  ; Open an input file
  file = FILEPATH('qb_boulder_msi', ROOT_DIR=e.ROOT_DIR, $
    SUBDIRECTORY = ['data'])
  raster = e.OpenRaster(file)
  spatialref=raster.spatialref

  ;create a list to collect the output rasters
  aggregator = List()
  
 ; Get the task from the catalog of ENVITasks
  Task = ENVITask('PixelwiseBandMathRaster')
   
  ;loop through the bands
  for i=0, raster.nbands-1 do begin
    
    Subset = ENVISubsetRaster(Raster, BANDS=i)
  
  ; Define inputs
    Task.INPUT_RASTER = Subset
     
    ; Add expression, update in loop
    Task.expression = 'b1/10.0'
     
    ; Define outputs
    Task.OUTPUT_RASTER_URI = e.GetTemporaryFilename()
     
    ; Run the task
    Task.Execute
    
    ; Aggregate the resulting rasters into the list
    aggregator.Add, task.output_raster, /EXTRACT

 endfor
 
  ; Get the task from the catalog of ENVITasks
    task_2 = ENVITask('BuildBandStack')
    
    ;Pass the list of rasters to stack
    task_2.input_rasters = aggregator.ToArray()
    
    ;Pass the spatial reference
    task_2.spatial_reference = spatialref
    
    ;Set a unique output file name
    task_2.output_raster_uri = 'C:\temp\BM_'+ file_basename(raster.AUXILIARY_URI[0], '.hdr')
    
    ;Run the task
    task_2.Execute

  ; Get the collection of objects currently in the Data Manager
    DataColl = e.Data
    
    ; Add the output to the Data Manager
    DataColl.Add, Task_2.Output_Raster
  
    view = envi.GetView()
    layer = view.CreateLayer(task_2.output_raster)
    
    ;clean up temp files
    for i=0, raster.nbands-1 do begin
      dataRaster=aggregator[i]
      fileURI=dataRaster.uri
      fileURIhdr=dataRaster.AUXILIARY_URI[0]
      dataRaster.close
      File_delete, fileURI
      File_delete, fileURIhdr
    endfor
  
end

;===============================================

Created by MM on 12/12/2017

Review by PS on 12/18/2017