IDL批量計算柵格資料平均值
阿新 • • 發佈:2020-12-31
遙感資料處理系列
一些專案及科研中遇到的小需求,一方面記錄自己的學習歷程,另一方面幫助大家學習。
ArcPy批量計算柵格資料平均值
GLDAS資料下載及處理(NC轉TIF)
ArcGIS批量裁剪柵格資料
ArcPy批量柵格重取樣
ArcPy批量裁剪柵格資料
文章目錄
前言
在使用ArcGIS的開發包函式進行柵格資料平均值計算時發現,在結果影像出現了好多的異常值?經過檢視發現是因為ArcGIS演算法的問題,所以,用IDL寫了下自己的柵格平均值計算邏輯。一、柵格資料平均值
1. 原理簡介
使用ArcGIS進行柵格資料平均值計算時,出現異常值的原因如下圖所示:
那麼問題來了:如果每個像元都有一個NoData出現過,那豈不是OutRas裡面全部都是NoData了?
我腦海裡的柵格資料平均值:對於N景影像,在(a,b)座標處有 t 景影像存在有效像元,那麼其平均值應該是多景影像在(a,b)座標處DN值的累加 除以 t
2. 程式碼
檔案組織架構:
輸入:
一個含有若干柵格資料的資料夾 inws(本例為“.tif”格式)
程式碼例項:
pro Average_Batch
;計算輸入資料夾內的 所有柵格資料的 平均值
;算整個資料夾的
compile_opt strictarr
COMPILE_OPT idl2
envi, /restore_base_save_files
envi_batch_init, log_file='batch.txt',/NO_STATUS_WINDOW
dir0='F:\LE-daily-LMB\2017' ; 輸入路徑
out_dir= 'F:\LMB\LE-year' ; 輸出路徑
files=file_search(dir0,'*.tif')
; 讀取檔案資訊。先獲取個行列數
ENVI_OPEN_FILE, files[0], r_fid=fid, /no_realize
ENVI_FILE_QUERY, fid, nl=nl, ns=ns,dims=dims,nb=nb
mapinfo=envi_get_map_info(fid=fid)
file=ENVI_GET_DATA(fid=fid,dims=dims,pos=0)
low_row=N_elements(file[0,*]);獲取行數
low_col=N_elements(file[*,0]);獲取列數
Sum = make_array(low_col,low_row,value=0.0);存有效像元的累加值
count = make_array(low_col,low_row,value=0.0);存有效像元的出現次數
Average = make_array(low_col,low_row,value=0.0);存平均值
; 遍歷資料夾內的所有柵格資料
for i=0,n_elements(files)-1 do begin
ENVI_OPEN_FILE, files[i], r_fid=fid, /no_realize
ENVI_FILE_QUERY, fid, nl=nl, ns=ns,dims=dims,nb=nb
file=ENVI_GET_DATA(fid=fid,dims=dims,pos=0)
; 單景影像的邏輯
for a=0,low_col-1 do begin;獲取列數
for b=0,low_row-1 do begin;獲取行數,應該是先列後行
if file[a,b] GT 0 then begin ;GE 大於等於運算子,左邊大於右邊則為真;GT 大於運算子;LE:小於等於運算子;LT:小於運算子
Sum[a,b] = Sum[a,b] + file[a,b] ; 有效值累加,每個像元的
count[a,b] = count[a,b] + 1 ;累加次數計數器
endif
endfor
endfor
endfor
Average = Sum / count
outfile8 = out_dir + '\' + strmid(file_basename(files[0]),0,25) + '.Average.tif' ;16 25
ENVI_WRITE_ENVI_FILE , Average , r_fid=fid , map_info=mapinfo , out_name=outfile8
end
上例可實現對輸入路徑資料夾下的所有柵格資料的平均柵格計算。
總結
ArcPy牛皮!畢業萬歲!中期快樂!
批量計算平均柵格資料,接下來要繼續探索下IDL語言,雖然它的語法有些…,同時,學習下python + GDAL,這一大殺器