IDL讀取GLASS12B02.V02GPP數據,獲取地面站點處的值

數據:GLASS12B02.V02.A2009001.2019093.hdf
語言:IDL
任務:讀取1982-2017文件夾內的所有8天時間分辨率的GPP遙感圖像數據,並找出地面站點經緯度處的像元值,用txt存儲,第0-2列爲地面站點txt原來的年份,緯度和經度,第3-48列存儲遙感圖像值。如圖:
在這裏插入圖片描述
站點txt文件內容:
在這裏插入圖片描述

代碼如下

pro read_GLASS_GPP

  time_0 = systime()
  print,'Start at: ',time_0
  start_time = systime(1)
  compile_opt idl2
  
  input1='E:\碳循環課題組組會\GPP\site_FLUXNET.txt'
  site=read_txt_data_file(input1)
  size_data=size(site,/dimensions)
  result=FLTARR(49,size_data[1,0])
  result[0,*]=site[0,*]
  result[1,*]=site[5,*]
  result[2,*]=site[6,*]
  indir='E:\碳循環課題組組會\GPP'
  ;按照txt中年份遍歷,遍歷完第一行的46景圖像數據,再啓動第二行,再去遍歷第二行對應年份的46景圖像
  for ii = 0,size_data[1,0]-1 do begin
    year = string(uint(site[0,ii]))
    index = 3;3-48列存儲第0-45景圖像上的值
    for j = 1,365,8 do begin
      if j lt 10 then begin
        doy='00'+strtrim(string(j),2)
        input=indir+'\'+strtrim(year,2)+'\GLASS12B02.V02.A'+strtrim(year,2)+strtrim(doy,2)+'.2019093.hdf'
      endif
      if (j GT 9) and (j LT 100) then begin
        doy='0'+strtrim(string(j),2)
        input=indir+'\'+strtrim(year,2)+'\GLASS12B02.V02.A'+strtrim(year,2)+strtrim(doy,2)+'.2019093.hdf'
      endif
      if J GT 99 then begin
        doy=strtrim(string(j),2)
        input=indir+'\'+strtrim(year,2)+'\GLASS12B02.V02.A'+strtrim(year,2)+strtrim(doy,2)+'.2019093.hdf'
      endif
      GRID_NAME='GLASS12B02'
      FIELD_NAME='GPP'
      work_dir = 'E:\碳循環課題組組會\GPP\'+strtrim(year,2)
      cd,work_dir
      input = 'GLASS12B02.V02.A'+strtrim(year,2)+strtrim(doy,2)+'.2019093.hdf'
      ;注意,IDL需要及時切換目錄,尤其文件不能和根目錄放一起,應該先切換文件前的根目錄,然後再將文件單獨作爲一個變量去進行函數或者進程運算。
      ;先前沒有進行這樣的操作時,在READ_MYD11C1_CMG函數部分會讀取文件錯誤。就是說在input = 'E:\碳循環課題組組會\GPP\1982\GLASS12B02.V02.A1982001.2019093.hdf'時,就會報錯
      r_data = READ_MYD11C1_CMG(input, GRID_NAME, FIELD_NAME)
      ;如果沒有該景遙感圖像,則返回-1,賦值爲-9999
      ;如果有該景遙感圖像,則函數返回正常的值
      if r_data[0,0] eq -1 then begin
        result[index,ii] = -9999
        index += 1
        ;print,input,' is an invalid file.'
      endif
      if r_data[0,0] ne -1 then begin
        ;x4爲像元緯度對應的行號
        x4=fix(abs(90-site[5,ii])/(360.0/7200.0))
        ;y4爲像元經度對應的列號
        y4=fix(abs(site[6,ii]+180)/(360.0/7200.0))
        ;第index列(index從3-48)第ii行(ii從0-1351)的值爲:
        result[index,ii] = r_data[y4,x4]
        ;print,result[index,ii]
        index += 1;該行該列的下一列存儲下一個遙感圖像值
      endif
    endfor
  endfor
  ;print,result[3,0]
  ;注意,IDL需要及時切換目錄,尤其文件不能和根目錄放一起,應該先切換文件前的根目錄,然後再將文件單獨作爲一個變量去進行函數或者進程運算。
  work_dir = 'E:\碳循環課題組組會\GPP\'
  cd,work_dir
  output1='fluxnet_site_Corresponding_to_GPP_extraction.txt'
  openw,SI1,output1,/get_lun
  printf,SI1,result
  free_lun,SI1
  end_time = systime(1)
  print,'耗時:',(end_time-start_time)/60,'  分鐘!'
  !null=dialog_message('the task is finished!',/information)
end
FUNCTION read_txt_data_file, infilename
    ;Get the number of lines
    nlines = FILE_LINES(infilename)
    ;指定一個內存號lun1
    OPENR, lun1, infilename, /GET_LUN
    ;存儲文本文檔的全部行到temp_str
    tmp_str = ''
    READF, lun1, tmp_str
    tmp = STRSPLIT(tmp_str, COUNT = col_count)
    POINT_LUN, lun1, 0
    
    ;Allocate memory
    data = DBLARR(col_count, nlines)
    
    row_count = 0L
    WHILE ~EOF(lun1) DO BEGIN
        READF, lun1, tmp_str
        IF ~STRCMP(tmp_str, '') THEN BEGIN
            tmp_str_split = STRSPLIT(tmp_str, /EXTRACT)
            data_line = DOUBLE(tmp_str_split)
            data[*, row_count] = data_line
            row_count = row_count + 1
        ENDIF        
    ENDWHILE
    FREE_LUN, lun1
    RETURN, data[*, 0 : (row_count - 1)]
END
FUNCTION READ_MYD11C1_CMG, IN_FNAME, GRID_NAME, FIELD_NAME
  compile_opt idl2
  status = EOS_GD_QUERY(in_fname, GRID_NAME, grid_info)
  IF (status NE 1) THEN BEGIN
    ;PRINT, 'Invalid hdf file.'
    RETURN, -1
  ENDIF
  ;IDL函數只有一個return,如果前面執行了return,則後面的全部語句都不再執行
  hd_id = HDF_SD_START(string(in_fname), /READ)
  sd_index = HDF_SD_NAMETOINDEX(hd_id, FIELD_NAME);返回數據集對應的索引號index
  sd_id = HDF_SD_SELECT(hd_id, sd_index);返回該文件該索引數據集的標識符sd_id
  hdf_sd_getdata,sd_id,field_data;原始數據存儲在field_data

  ;描述文件整體屬性
  ; hdf_sd_fileinfo,hd_id,datasets,attributes;有幾個數據集和幾個外圍屬性集
  ;hdf_sd_attrinfo,hd_id,attrindex,name=a,data=b,count=c,hdf_type=d,type=e

  attr_index1 = HDF_SD_ATTRFIND(sd_id, 'scale_factor')
  attr_index2 = HDF_SD_ATTRFIND(sd_id, 'add_offset')
  ;HDF_SD_ATTRINFO,數據集標識符,屬性索引,屬性值  = 變量名
  ;HDF_SD_ATTRINFO, SD_id, Attr_Index [, COUNT=variable] [, DATA=variable] [, HDF_TYPE=variable] [, NAME=variable] [, TYPE=variable]
  HDF_SD_ATTRINFO, sd_id, attr_index1, DATA = scale_factor
  HDF_SD_ATTRINFO, sd_id, attr_index2, DATA = add_offset
  HDF_SD_ENDACCESS, sd_id
  HDF_SD_END, hd_id
  r_data = field_data * scale_factor[0] + add_offset[0]
  return, r_data
END

人的選擇有千千萬,
我還是那個我,善良,真誠,正直的我! ~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章