【212】HDF更新数据&HDF创建

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

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文件中

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

 

转载于:https://www.cnblogs.com/alex-bn-lee/p/5780190.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
hdf ArcGIS数据是指用于ArcGIS软件的一种数据格式。HDF是Hierarchical Data Format的缩写,它是一种用于存储和组织科学和工程数据的文件格式。ArcGIS是一套广泛使用的地理信息系统软件,提供了空间分析、地图创建数据管理等功能。 hdf ArcGIS数据通常包含大量的空间和非空间信息,如地图投影、栅格数据、矢量数据等。它可以存储各种地球科学数据,如遥感影像、气象数据、地质数据等。这些数据可以在ArcGIS软件中进行可视化分析、地图制作和数据管理等操作。 与其他数据格式相比,hdf ArcGIS数据具有一些优点。首先,它具有较高的压缩比,可以大大减小数据文件的大小,节省存储空间。其次,它具备多种层次结构,可以支持多维数据的存储和管理。此外,ArcGIS软件对hdf ArcGIS数据有很好的兼容性,能够直接读取和处理这种数据格式。 在使用hdf ArcGIS数据时,我们可以利用ArcGIS软件提供的功能进行地理信息的分析和可视化。例如,我们可以通过使用空间分析工具来探索地理数据之间的关系,进行地貌分析、环境监测等工作。此外,我们还可以利用ArcGIS软件的绘图工具制作高质量的地图,用于展示和分享分析结果。 总之,hdf ArcGIS数据是一种在ArcGIS软件中使用的数据格式,具有多层次、高效压缩等特点。它在地理信息系统领域有着广泛的应用,可以用于各种地理数据的存储、分析和可视化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值