數據: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
人的選擇有千千萬,
我還是那個我,善良,真誠,正直的我! ~