【212】HDF更新数据&HDF创建
HDF更新数据:对原有HDF数据进行数据更新,不破坏HDF的数据结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | pro add_data_sst ;实现将SST增加1度,再将结果更新到SST中 ;1. 获取SST索引 ;2. 通过索引获取ID ;3. 获取SST数组 ;4. 对数组进行操作 ;5. 将数值进行更新 cd, 'D:\McDelfino\dell-dev\IDL' file= 'D:\McDelfino\dell-dev\IDL\A20080200505006.L2_LAC' ;打开HDF文件,获取SD ID,注意使用关键字RDWR,可以读写HDF文件。 sd_id=HDF_SD_START(file, /RDWR) ;获取SD中SST的索引 sstIndex = HDF_SD_NAMETOINDEX(sd_id, 'sst' ) ;获得SST所在索引的ID SSTSD_ID = HDF_SD_SELECT(sd_id, sstIndex) ;读取SST数据 HDF_SD_GETDATA, SSTSD_ID, SSTData ;获取sst的实际值 ;slope=0.005, intercept=0.0 realSSTData = SSTData * 0.005 + 0.0 ;处理SST数据 tempSSTData = realSSTData+1 ;从真实值返回 newSSTData = (tempSSTData - 0.0)/0.005 ;将新数据写出,更新原有数据 HDF_SD_ADDDATA, SSTSD_ID, newSSTData ;关闭SD,关闭HDF文件 HDF_SD_ENDACCESS, SSTSD_ID HDF_SD_END, sd_id end |
新建HDF文件:将原HDF中的数据进行计算,将结果写入新的HDF文件中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 | pro readandcreate ;实现数据的计算以及新建数据 ;1. 读取经纬度数据 ;2. 读取SST数据,并存到数组中 ;3. 读取Rrs数据,并进行计算获取SD、TSM、CHL结果,存到数组中 ;4. 新建HDF,将经纬度以及结果写入进去 file= 'D:\McDelfino\dell-dev\IDL\A20080200505006.L2_LAC' hdfid=HDF_SD_START(file, /rdwr) ;读取数据中的lat数据 ;通过latitude来获取相应的索引值 index=HDF_SD_NAMETOINDEX(hdfid, 'latitude' ) ;通过索引值获取ID值 varid=HDF_SD_SELECT(hdfid, index) ;通过ID值获取数组值 HDF_SD_GETDATA, varid, latdata help,latdata ;读取数据中的lon数据 index=hdf_sd_nametoindex(hdfid, 'longitude' ) varid=hdf_sd_select(hdfid, index) hdf_sd_getdata, varid, londata ;读取数据中的sst数据,有数据的进行计算,mask的部分赋值为NaN sstdata1=dindgen(1354,2040) index=hdf_sd_nametoindex(hdfid, 'sst' ) varid=hdf_sd_select(hdfid, index) hdf_sd_getdata, varid, sstdata for i=0, 1354-1 do begin for j=0, 2040-1 do begin if (sstdata[i,j] gt -32767) then begin sstdata1[i,j]=sstdata[i,j]*0.005 endif else begin sstdata1[i,j]= 'nan' endelse endfor endfor ;读取数据中的Rrs_667数据,有数据的进行SD的计算,mask的部分赋值为NaN rrs667data1=dindgen(1354,2040) sddata1=dindgen(1354,2040) index=hdf_sd_nametoindex(hdfid, 'Rrs_667' ) varid=hdf_sd_select(hdfid, index) hdf_sd_getdata, varid, rrs667data for i=0, 1354-1 do begin for j=0, 2040-1 do begin if (rrs667data[i,j] gt -32767) then begin rrs667data1[i,j]=rrs667data[i,j]*(2.0E-6) + 0.05 ;只对正数进行计算 if (rrs667data1[i,j] gt 0) then begin sddata1[i,j]=-85.666-108.807*alog10(rrs667data1[i,j])-45.591*(alog10(rrs667data1[i,j]))^2.0-6.426*(alog10(rrs667data1[i,j]))^3.0 endif else begin sddata1[i,j]= 'nan' endelse endif else begin sddata1[i,j]= 'nan' endelse endfor endfor ;读取数据中的Rrs_645数据,有数据的进行TSM的计算,mask的部分赋值为NaN rrs645data1=dindgen(1354,2040) tsmdata1=dindgen(1354,2040) index=hdf_sd_nametoindex(hdfid, 'Rrs_645' ) varid=hdf_sd_select(hdfid, index) hdf_sd_getdata, varid, rrs645data for i=0, 1354-1 do begin for j=0, 2040-1 do begin if (rrs645data[i,j] gt -32767) then begin rrs645data1[i,j]=rrs645data[i,j]*(2.0E-6) + 0.05 ;只对正数进行计算 if (rrs645data1[i,j] gt 0) then begin tsmdata1[i,j]=1.572+2172.239*rrs645data1[i,j] endif else begin tsmdata1[i,j]= 'nan' endelse endif else begin tsmdata1[i,j]= 'nan' endelse endfor endfor ;读取数据中的Rrs_488/Rrs_547数据,有数据的进行CHL的计算,mask的部分赋值为NaN rrs488data1=dindgen(1354,2040) rrs547data1=dindgen(1354,2040) chldata1=dindgen(1354,2040) index=hdf_sd_nametoindex(hdfid, 'Rrs_488' ) varid=hdf_sd_select(hdfid, index) hdf_sd_getdata, varid, rrs488data index=hdf_sd_nametoindex(hdfid, 'Rrs_547' ) varid=hdf_sd_select(hdfid, index) hdf_sd_getdata, varid, rrs547data for i=0, 1354-1 do begin for j=0, 2040-1 do begin if (rrs488data[i,j] gt -32767) then begin rrs488data1[i,j]=rrs488data[i,j]*(2.0E-6) + 0.05 rrs547data1[i,j]=rrs547data[i,j]*(2.0E-6) + 0.05 ;只对正数进行计算 if (rrs488data1[i,j] gt 0 && rrs547data1[i,j] gt 0) then begin R=alog10(rrs488data1[i,j]/rrs547data1[i,j]) chldata1[i,j]=10^(4.608-14.742*R+22.025*R^2-13.509*R^3) endif else begin chldata1[i,j]= 'nan' endelse endif else begin chldata1[i,j]= 'nan' endelse endfor endfor ;读取数据中的chlor_a数据,有数据的进行计算,mask的部分赋值为NaN chlordata1=dindgen(1354,2040) index=hdf_sd_nametoindex(hdfid, 'chlor_a' ) varid=hdf_sd_select(hdfid, index) hdf_sd_getdata, varid, chlordata for i=0, 1354-1 do begin for j=0, 2040-1 do begin if (chlordata[i,j] gt -32767) then begin chlordata1[i,j]=chlordata[i,j]*1.0 endif else begin chlordata1[i,j]= 'nan' endelse endfor endfor hdf_sd_endaccess, varid hdf_sd_end, hdfid ;新建HDF的文件路径 file= 'D:\McDelfino\dell-dev\IDL\sst23.hdf' ;以create的形式打开文件 hdfid=HDF_SD_START(file, /create) ;新建latitude变量,在HDF上显示1354列,2040行,默认是浮点型数组 sds_id=HDF_SD_CREATE(hdfid, 'latitude' , [1354, 2040], / double ) ;由于从HDF中读取的数据与实际数据存在一个中心对称的关系,因此通过两个reverse实现 ;latdata就是从其他HDF中读取的数组,将数组的结果添加到变量latitude中去 HDF_SD_ADDDATA, sds_id, reverse(reverse(latdata), 2) sds_id=HDF_SD_CREATE(hdfid, 'longitude' , [1354, 2040], / double ) HDF_SD_ADDDATA, sds_id, reverse(reverse(londata), 2) sds_id=HDF_SD_CREATE(hdfid, 'sst' , [1354, 2040], / double ) HDF_SD_ADDDATA, sds_id, reverse(reverse(sstdata1), 2) sds_id=HDF_SD_CREATE(hdfid, 'sd' , [1354, 2040], / double ) HDF_SD_ADDDATA, sds_id, reverse(reverse(sddata1), 2) sds_id=HDF_SD_CREATE(hdfid, 'tsm' , [1354, 2040], / double ) HDF_SD_ADDDATA, sds_id, reverse(reverse(tsmdata1), 2) sds_id=HDF_SD_CREATE(hdfid, 'chl' , [1354, 2040], / double ) HDF_SD_ADDDATA, sds_id, reverse(reverse(chldata1), 2) sds_id=HDF_SD_CREATE(hdfid, 'chlor_a' , [1354, 2040], / double ) HDF_SD_ADDDATA, sds_id, reverse(reverse(chlordata1), 2) HDF_SD_ENDACCESS, sds_id HDF_SD_END, hdfid end |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
2012-08-17 【072】◀▶ Android (IV) - 显示及后台