Re: Getting mean from HDF SD files - stack in envi or read into IDL array? [message #61161 is a reply to message #61071] |
Sat, 05 July 2008 12:45   |
bulrushmower
Messages: 19 Registered: February 2008
|
Junior Member |
|
|
On Jul 5, 1:58 pm, bulrushmo...@gmail.com wrote:
> 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- Hide quoted text -
>
> - Show quoted text -
I wonder if you are trying to get mean of each band you read or the
mean of thousands of bands over each pixel.
If you want to read just band you can get rid of the inside loop from
above code. Let me know I will help you figure out.
|
|
|