zoukankan      html  css  js  c++  java
  • 【212】HDF更新数据&HDF创建

    HDF更新数据:对原有HDF数据进行数据更新,不破坏HDF的数据结构

    pro add_data_sst
      ;实现将SST增加1度,再将结果更新到SST中
      ;1. 获取SST索引
      ;2. 通过索引获取ID
      ;3. 获取SST数组
      ;4. 对数组进行操作
      ;5. 将数值进行更新
      cd, 'D:McDelfinodell-devIDL'
      file='D:McDelfinodell-devIDLA20080200505006.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文件中

    pro readandcreate
      ;实现数据的计算以及新建数据
      ;1. 读取经纬度数据
      ;2. 读取SST数据,并存到数组中
      ;3. 读取Rrs数据,并进行计算获取SD、TSM、CHL结果,存到数组中
      ;4. 新建HDF,将经纬度以及结果写入进去
      
      file='D:McDelfinodell-devIDLA20080200505006.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:McDelfinodell-devIDLsst23.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
    
  • 相关阅读:
    Search in Rotated Sorted Array
    排序
    Find Peak Element
    Search a 2D Matrix II
    Search a 2D Matrix
    Search for a Range
    nodejs编译sass模块包 node-compass,与gulp包gulp-sass使用方法
    canvas基础学习
    决定整理一下canvas的基础学习
    网页宽高clientWidth clientHeight获得数值不对的问题
  • 原文地址:https://www.cnblogs.com/alex-bn-lee/p/5780190.html
Copyright © 2011-2022 走看看