There is an undocumented way to do this. With undocumented code, we cannot guarantee it will function the same way in the future but it seems like these routines have not changed in a while. Here is an example:
pro subset_by_evf
compile_opt idl2
;select input file to subset
fname = 'C:\Program Files\ITT\IDL70\products\envi45\data\world_dem'
envi_open_file, fname, r_fid=fid
if (fid[0] eq -1) then return
envi_file_query, fid, bnames=bnames, sname=sname
;open vector file to use for subset and get id
evf_fname = 'C:\Program Files\ITT\IDL70\products\envi45\data\vector\states_.evf'
;make sure envi vector routine is available
envi_check_save, /vector
;open the vector and get its ID
evf_open, evf_fname, vec=vec, /no_warning
evf_id = vec.id
;compute the spatial boundary based on the evf using ROI routines (undocumented routine) - this will provide the DIMS to use to subset
roi_ids = envi_get_roi_ids(fid=fid, /include_evfs)
envi_roi_compute_spatial_boundry, roi_ids, dims, fid=fid
;resize the original image by the new dimensions
envi_doit, 'resize_doit', fid=fid, dims=dims, pos=pos, $
rfact=[1.,1.], /in_memory, r_fid=sub_fid
envi_file_query, sub_fid, ns=ns, nl=nl, dims=dims
;generate a mask from the evf (undocumented routine) - you need to mask areas outside of EVF boundaries if the EVF is not a rectangle
; this is the same as using Basic Tools ->Subset data via ROIs and masking the outside of the ROI/EVF boundary
envi_mask_doit, evf_id=evf_id, evf_fid=sub_fid, ns=ns, nl=nl, and_or=0, $
/inside, /in_memory, r_fid=m_fid
;apply the mask to the subset image
out_name=sname+'_subset'
envi_mask_apply_doit, fid=sub_fid, pos=pos, dims=dims, m_fid=m_fid, m_pos=0l, $
value=-9999, out_bname=bnames, out_name=out_name
;close in memory files
envi_file_mng, id=m_fid, /remove
envi_file_mng, id=sub_fid, /remove
envi_evf_close, evf_id
end
|