1. 程式人生 > 其它 >【IDL程式碼庫】如何用IDL獲取柵格範圍平均海拔

【IDL程式碼庫】如何用IDL獲取柵格範圍平均海拔

FLAASH已提供IDL介面(http://blog.sina.com.cn/s/blog_764b1e9d0102xxrk.html),但在FLAASH大氣校正中需要輸入研究區平均海拔,我們已經介紹過如何利用ENVI的統計功能獲取研究區高程(http://blog.sina.com.cn/s/blog_764b1e9d0101drqg.html),下面介紹如何一種使用IDL獲取高程方法,以下為功能原始碼及測試程式碼:

  ;+ ; :description: ; :獲取柵格範圍的平均海拔,單位為Km ; 失敗則返回-1,否則返回浮點型柵格範圍平均海拔 ; :author: Hanzt ; :2017-11-28
; - function Get_Raster_Msl,raster     ;編譯規則優化   compile_opt idl2   ;獲取envi物件   if isa(e,'envi'then e=envi(/current) else e=envi()     ;獲取ENVI自帶~900m解析度DEM資料絕對路徑(如果有更高解析度DEM也可替換)  root_Dir=e.root_dir  demFile=filepath('GMTED2010.jp2',$    root_Dir=root_Dir,subdirectory=['data'])     ;如果DEM不存在,則手動選DEM資料
  if ~file_test(demfile) then begin    title='Select a DEM file which covered the extent of the input raster.'    demFile=envi_pickfile(title=title)    if demFile eq '' then return,-1   endif     ;開啟DEM,並記錄錯誤資訊err0  demRaster=e.openraster(demFile,error=err0)     ;獲取柵格行列數  spatialref1=raster.spatialref
 ns=raster.ncolumns  nl=raster.nrows      ;獲取柵格四個角點投影座標,mapx,mapy  spatialref1.convertfiletomap,[0,ns,ns,0],[0,0,nl,nl],mapx,mapy  coordSys1=envicoordsys(coord_sys_str=spatialref1.coord_sys_str)     ;將mapx,mapy轉換到DEM柵格投影座標,用於DEM裁剪  spatialref2=demraster.spatialref  coordSys2=envicoordsys(coord_sys_str=spatialref2.coord_sys_str)  coordSys1.convertmaptomap,mapx,mapy, Map2X, Map2Y, coordSys2     ;獲取範圍最值  x_max=max(Map2X,min=x_min)  y_max=max(Map2Y,min=y_min)     ;獲取裁剪範圍  sub_rect=[x_min,y_min,x_max,y_max]     ;用柵格範裁剪DEM資料  rasterSub=envisubsetraster( $    demRaster,               $    spatialref=spatialref2,  $    sub_rect=sub_rect,       $    error=err1)     ;如果裁剪失敗,則返回-1   if rasterSub eq !null then begin    msg='No intersections between the input raster and the dem raster.'    !null=dialog_message(msg,/info)    return,-1   endif     ;裁剪後DEM統計  Statistics =ENVIRasterStatistics(rasterSub,error=err2)     ;如果失敗返回-1,否則返回平高程   if err0 ne '' || err1 ne '' || err2 ne '' then $    return,-1 else $    return,float(Statistics['MEAN']/1000) end     ;測試程式碼 pro test_Get_Raster_Msl   compile_opt idl2   if isa(e,'envi'then e=envi(/current) else e=envi()  file='C:\Program Files\Exelis\ENVI53\data\qb_boulder_msi'  raster=e.openraster(file)  msl=get_raster_msl(raster)     ;如果成功則控制檯列印   if msl.typecode eq 4 then  print,'Mean Sea Leavel:',msl   end