前言
今天还是学习IDL,写了modis数据预处理的第一步,提取数据,数据从nasa官网下载的,网址:https://ladsweb.modaps.eosdis.nasa.gov/,实现的功能主要就是HDF文件的打开,显示,保存为ENVI可直接读取的.dat二进制数据,保存文件倒是好说,但是二进制文件,必须要有行号,列号,波段数,数据类型才能读取、写入,我不会直接写入影像,我学习ENVI,写了一个同名的.hdr文件,从而实现了在ENVI中可以直接打开保存的数据。
代码
;作者:xxin ;时间:2017.3.8 ;功能:modis HDF4文件的读取,显示,保存为能直接被ENVI打开的二进制文件。 pro read_hdf compile_opt <a href="https://www.ixxin.cn/tag/idl/" title="查看更多关于idl的文章" target="_blank">idl</a>2 file = DIALOG_PICKFILE(path = "G:\download\modis") isHdf = HDF_ISHDF(file) if isHdf eq 0 then return a = STRSPLIT(file,"\",/Extract) if STRCMP(a[-1], 'MOD15', 5 , /FOLD_CASE) eq 0 then begin Print,"数据不符合要求" return endif sd_id = HDF_SD_START(file,/READ) HDF_SD_FILEINFO,sd_id,nmfsds,atte FOR i=0,nmfsds-1 DO BEGIN sds_id=HDF_SD_SELECT(sd_id,i) HDF_SD_GETINFO,sds_id,name=n,ndims=r,type=t,natts=nats,hdf_type=h,unit=u if STRCMP(n, 'Lai_500m', 8 , /FOLD_CASE) eq 1 then BEGIN lai = sds_id endif ENDFOR HDF_SD_GETDATA,lai,laidata i = image(laidata,/order) ;HDF_SD_ATTRINFO for j = 0,atte-1 do BEGIN hdf_sd_attrinfo,sd_id,j,name=a,data=b,count=c,hdf_type=d,type=e if STRCMP(a, 'StructMetadata.0', 16 , /FOLD_CASE) eq 1 then BEGIN print,b endif endfor ;HDF_SD_ENDACCESS,lai HDF_SD_END,sd_id arr = ["ENVI","samples = 2400","lines = 2400","bands = 1","data type = 1","Interleave = bsq","file type = ENVI Standard","header offset = 0","byte order = 0","band names = {modis lai}","sensor type = Modis"] arrt = transpose(arr) result_fn = "D:\ALI.dat" mid = STRSPLIT(result_fn,".",/EXTRACT) hfn = mid[0] hdr_fn = hfn+".hdr" openw,lun,hdr_fn,/GET_LUN printf,lun,arrt free_lun,lun openw,lun,result_fn,/GET_LUN writeu,lun,laidata free_lun,lun end
效果图:
后语
程序代码凌乱,不喜勿喷。本想实现直接实现地理配准,但是问题是能读到一大堆属性,但是我不会把坐标单独取出来写入头文件,尚需继续学习呀。
打赏直接扫描二维码,打赏名单请看:https://www.ixxin.cn/about.html