以下文字转自李旭科学网博客,文件和代码请在原网址查看http://blog.sciencenet.cn/blog-1148346-841353.html
MODIS数据通常是HDF-EOS(H4)文件,文件包含有多个数据集,如图1。已知
MOD13A3.hdf,提取其中的NDVI数据集,并以GeoTiff格式存储。参考GDAL方法,但没有找到Python+GDAL代码实例,所以网上介绍的方法没有测试成功,此外还有国外的专家制作的PyHDF软件,可以尝试。
我的代码有一个缺陷,不能自HDF文件获取其中地理参考。不过,我想到一个替代方法,MODIS产品附有行列信息(h**v**),将某一行列的文件在ENVI中另存为GeoTiff文件(
GEOREF.tif),IDL读取这个文件地理参考再存储在输出的NDVI数据集中。
这算是一个折中的办法,代码中对应GeoRef参数是为包含地理参考。
-------------------------------------------------------------------------
我写的程序是处理mod10,有需要的可直接修改文件路径,非常感谢李旭提供的geo参考思路,不然hdf直接存tif没有地理参考,无法做laystack等操作,批量裁剪和投影的话推荐大家使用envi
laystack操作将文件合并成一个,单个文件做裁剪和投影即可,非常方便无需写程序了。无法提交程序,只好贴上。pro
readhdfdata 和文件名一定要一致否则无法运行!
pro
readhdfdata
COMPILE_OPT IDL2
;主要方法参考李旭,http://blog.sciencenet.cn/blog-1148346-841353.html
filelist =
FILE_SEARCH('E:\hdf\2002', '*.HDF', COUNT=COUNT)
;寻找当前文件中后缀名为.hdf的文件,并将所有的结果存入FILELIST中
;注意数组是从0开始
;envi是从1开始
for i = 0
, count-1 do begin
print, filelist[i]
;打开HDF接口并初始化HDF接口
sd_id =
HDF_SD_START(filelist[i],/read)
Geopath='E:\hdf\MOD10A2.A2001009.h26v05.tif'
Geo=read_tiff(Geopath,
GEOTIFF=GeoRef)
;注意这里是sds_id不是sd_id
;0表示第一个数据集,数据集顺序可在mctk工具中查看,mod10只有两个数据集,此处提取的是maximum snow
extent
sds_id = HDF_SD_SELECT(sd_id,
0)
; Read the data : you can notice that here, it
is not needed to allocate the data array yourself
HDF_SD_GETDATA, sds_id, data
;HDF_SD_GETDATA, sds_id, data, start = start,
count = edges
; end access to SDS
HDF_SD_ENDACCESS, sds_id
; close the hdf file
HDF_SD_END, sd_id
;strmid字符串截取
name_write=strmid(filelist[i],11,24)
print,name_write
Write_tiff, 'E:\hdf\2002tif\'+name_write+'.tif',
data, GEOTIFF=GeoRef
endfor
END