Re: Getting mean from HDF SD files - stack in envi or read into IDL array? [message #61162 is a reply to message #61071] |
Sat, 05 July 2008 11:58   |
bulrushmower
Messages: 19 Registered: February 2008
|
Junior Member |
|
|
On Jul 5, 10:46 am, kathryn.davi...@googlemail.com wrote:
> On Jul 5, 4:33 pm, bulrushmo...@gmail.com wrote:
>
>
>
>
>
>> On Jul 4, 8:41 am, kathryn.davi...@googlemail.com wrote:
>
>>> Hi
>
>>> I am extremely new to IDL (2 weeks!) and have previously only used
>>> envi on a small scale.
>
>>> I want to read one SD dataset from from a each of a huge number of
>>> MODIS files and having looked at IDL and envi batch routines can't
>>> decide which is the best way. Bear in mind my limited knowledge and a
>>> very short timeframe.... Should I write an envi batch programme and
>>> create a big (3000bands +) envi file or should I put straight into the
>>> an IDL array. I need to get a mean value (one image or array) and
>>> even if it is easier in envi batch mode, would the routine
>>> ENVI_SUM_DATA_DOIT with the Mean option deal with the missing
>>> values???
>
>>> Looking at IDL I have managed to open HDF file from command line, read
>>> in appropriate data set to an array but how then could I build 3D
>>> array from absolutely loads of 2D arrays.
>
>>> Big questions I know - I am desperate to do this in a short time.
>
>>> Any help on any aspect much appreciated.
>
>>> K
>
>> Tell me more about how many bands you have in HDF file and how many
>> bands you want to read into IDL?- Hide quoted text -
>
>> - Show quoted text -
>
> Well I am going to be using around 3-4000 MODIS HDF files but I only
> want one band (the first) from each i.e. the Land Surface
> Temperature. Since my last post I have thought about creating a huge
> multiband file in ENVI and then exporting as a variable to IDL (if the
> ENVI_SUM_DOIT doesn't work for the mean, as it may not deal with
> missing values very well, I need them to not be counted as opposed to
> counting as zero). However that means extracting the SD dataset from
> all of the HDF files, converting them to ENVI standard files to build
> multi-band image. I hope the data values are not corrupted by being
> converted to ENVI standard. Also I could create an image stack in
> iIMAGE or mess about with iDataManager in some way but they do not
> seem to like reading ENVI standard files and keep asking me to fill in
> binary information - will the data values still be OK?
>
> Thanks
>
> Kathryn- Hide quoted text -
>
> - Show quoted text -
The simplest way to do it:
I am assuming you have IDL and ENVI, initiate batch mode by doing the
following
1. define the file directory
2. read them into IDL using envi_open_data_file
3. get their mean by
4. print them into a txt file
Try this code
Pro Mean_HDF
envi, /restore_base_save_files
envi_batch_init, log_file='batch.txt'
; Open the file directory and searh for HDF files to read, then
select the directory manually
files=file_search(dialog_pickfile(/dir),'*.HDF', count=numFiles);
or you can use files=file_search('D:\MODIS\*.hdf', count=numFiles)
; loop for the whole data set in the directory
FOR K = 0, numFiles-1 do begin
; get the file name only without file directory for final
output filename
fname = file_basename(files[K])
;select input file directory to subset
hdf_bands = 1 ; determines the HDF dataset bands to read
;start looping through opening bands from HDF
for i = 0, hdf_bands -1 do begin
envi_open_data_file, files[K], r_fid=fid, /hdf_sd,
hdfsd_dataset=i, hdfsd_interleave=0
;query new file for ns, nl, dims;
envi_file_query, fid, dims=dims, bnames=bnames, ns=ns,
nl=nl, nb=nb
pos=0
;get the mean of the data
result = MEAN(fid)
endfor
;if you want to export the results in screen do as
print, results
;if you want to export them into a txt file
OpenW, Lun, 'D:\test.txt', /get_lun
str= fname
printf,lun,str
endFOR
End
|
|
|