;+
; :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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理