遥感二次开发语言IDL——课本实例

系列文章目录

例如:第一章



前言

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


一、pandas是什么?

1.ROI掩膜函数

代码如下:

pro process_mask, evf_id,fid,o_fn=o_fn
;基于EVE文件对遇感图像进行掩膜运算
方法指数来的
;参数evf_id为矢量文件id号,fid 为遥感图像fid号
;关键字o_fn 为掩膜结果图像的文件名
;首先基于图像尺寸创建ROI文件
;envi_file_query根据fid进行文件属性查询函数
envi _file_query,fid,ns=ns,nl=nl,nb=nb, dims=dims
;创建ROI掩膜
roi_id_mask=envi_create roi(ns=ns,nl=nl, name='mask', color=l)
;获取EVE各个节点的坐标值来创建ROI多边形
envi_evf_info,evf_id,num_recs=nrecs
for i=0,nrecs-1 do begin
	record=envi_evf_read_record(evf_id,i)
	;数组转置
	xmap=transpose(record[0,*])
	ymap=transpose(record[1*])
	;envi_convert_file_coordinates:
	;routine,不带返回值,图上某些点的矩阵坐标与空间坐标之间的转换(在有空间信息的情况			
	;下)。示例:envi_convert_file_coordinates, fid, xf, yf, xmap, ymap, /to_map               
	;(xf,yf为矩阵的坐标,xmap,ymap为空间坐标)
	envi_convert_file_coordinates, fid,xf,yf,xmap,ymap
	;定义ROI
	envi_define_roi,roi_id_mask,/polygon,xpts=xf,ypts=yf
endfor
;将ROI转换为图像,设定ROI对应类别的像元值为 1,即为Mask
envi_doit,'envi_roi_to_image_doit', fid=fid, r_fid=fid_mask,$
roi_ids=roi_id_mask,out_name='Mask',class_values=1
;执行掩膜运算
envi_doit, 'envi_mask_apply_doit', fid=fid, m_fid=fid_mask,$
m_pos=0, out_name=o_fn, dims=dims, pos=indgen(nb), value=0

;删除中间文件
envi_file_mng,id=fid, /remove, /delete
envi_file_mng,id=fid_mask, /remove, /delete

2.影像镶嵌函数

代码如下:

function  process_mosaic,fns
;根据文件名数组进行空间镶处理,返回结果为镶嵌完数据的 fid号
;参数fns为文件名数组
  fnums=n_elements(fns)
  dimss=lonarr(5,fnums) ;空间范围存储数组
  fids=lonarr(fnums) ;文件fid 号存储数组
  ;打开每一景数据,获取其 fid 号、空间范围
  for i=0,fnums-1 do begin
    envi_open_file,fns[i],r_fid-fid
    envi_file_query, fid, nb=nb, dims=dims, data_type=data_type
    fids[i]=fid
    dimss[*,i]=dims ;空间子集
  endfor
  ;波段范围存储数组
  poss=intarr(nb,fnums)
  for i=0,fnums-1 do poss[*,i]=indgen(nb)
  ;像元分辨率
  map_info=envi_get_map_info(fid=fid)
  pixel_size=map_info.ps
  ;调用georef_mosaic_setup计算镶嵌所需的关键字 xsize、ysize、x0、y0
  georef_mosaic_setup, fids=fids, dims=dimss, map_info=map_info,$
  out_ps=pixel_size,xsize=xsize,ysize=ysize,x0=x0,y0-y0
;  镶嵌操作
  see_through_val=bytarr(fnums)
  use_see_through=see_through_val+1
  envi_doit,'mosaic_doit',fid=fids,dims=dimss,pos=poss,$
  r_fid=fid_mosaic, out_name='mosaiced_data',/georef, $
  map_info=map_info, see_through_val=see_through_val, $
  use_see_through=use_see_through, background=0,out_dt=data_type, $
  pixel_size=pixel_size,xsize=xsize,ysize=ysize,x0=x0,y0=y0
  
 return,fid_mosaic
end

3.计算镶嵌所需的关键字

代码如下:

;*************************************************
; IDL官网提供的georef_mosaic_setup 程序
; 用于计算镶所需的关键字xsize、ysize、x0、y0
PRO GEOREF_MOSAIC_SETUP, fids = fids, dims = dims, out_ps = out_ps, $
    xsize = xsize, ysize = ysize, x0 = x0, y0 = y0, map_info = map_info
  COMPILE_OPT strictarr, hidden
  
  ; Some basic error checking
  IF KEYWORD_SET(dims) THEN $
    IF N_ELEMENTS(fids) NE N_ELEMENTS(dims[0, *]) THEN dims = 0
  ;
  IF N_ELEMENTS(fids) LT 2 THEN BEGIN
    xsize = -1
    ysize = -1
    x0 = -1
    y0 = -1
    RETURN
  ENDIF
  
  ; If no DIMS passed in
  nfiles = N_ELEMENTS(fids)
  IF (KEYWORD_SET(dims) EQ 0) THEN BEGIN
    dims = FLTARR(5, nfiles)
    FOR i = 0, nfiles - 1 DO BEGIN
      ENVI_FILE_QUERY, fids[i], dims = tmp_dims
      dims[*, i] = tmp_dims
    ENDFOR
  ENDIF
  
  ; Compute the size of the output mosaic (xsize and ysize)
  ; Store the map coords of the UL corner of each image since you'll need it later
  UL_corners_X = DBLARR(nfiles)
  UL_corners_Y = DBLARR(nfiles)
  east = -1e34
  west = 1e34
  north = -1e34
  south = 1e34
  FOR i = 0, nfiles - 1 DO BEGIN
    pts = [[dims[1, i], dims[3, i]], $ ; UL
      [dims[2, i], dims[3, i]], $ ; UR
      [dims[1, i], dims[4, i]], $ ; LL
      [dims[2, i], dims[4, i]]] ; LR
    ENVI_CONVERT_FILE_COORDINATES, fids[i], pts[0, *], pts[1, *], xmap, ymap, /to_map
    UL_corners_X[i] = xmap[0]
    UL_corners_Y[i] = ymap[0]
    east  = east > MAX(xmap)
    west = west < MIN(xmap)
    north = north > MAX(ymap)
    south = south < MIN(ymap)
  ENDFOR
  xsize = east - west
  ysize = north - south
  xsize_pix = ROUND(xsize/out_ps[0])
  ysize_pix = ROUND(ysize/out_ps[1])
  
  ; to make things easy, create a temp image that's got a header
  ; that's the same as the output mosaic image
  proj = ENVI_GET_PROJECTION(fid = fids[0])
  map_info = ENVI_MAP_INFO_CREATE(proj = proj, mc = [0, 0, west, north], ps = out_ps)
  temp = BYTARR(10,10)
  ENVI_ENTER_DATA, temp, map_info = map_info, /no_realize, r_fid = tmp_fid
  
  ; find the x and y offsets for the images
  x0 = LONARR(nfiles)
  y0 = LONARR(nfiles)
  FOR i = 0, nfiles - 1 DO BEGIN
    ENVI_CONVERT_FILE_COORDINATES, tmp_fid, xpix, ypix, UL_corners_X[i], UL_corners_Y[i]
    x0[i] = ROUND(xpix)
    y0[i] = ROUND(ypix)
  ENDFOR
  
  ; delete the tmp file
  ENVI_FILE_MNG, id = tmp_fid, /remove, /no_warning
END

4.执行批量镶嵌、裁剪、掩膜

代码如下(示例):

pro process_mosaic_clip_mask
;envi函数在envi帮助文档中查找
;对逐日数据并给予矢量数据进行裁剪
  t1 = systime(1) ;程序开始时间
;  *************** 打开矢量数据****************
;  设置数据所在路径
  work_dir = dialog_pickfile(title = '选择文件所在路径',/directory)
  cd, work_dir
;  打开边界数据
  fn_boundary = dialog_pickfile(filter = '*.evf', title = '选择矢量数据')
  evf_id = envi_evf_open(fn_boundary)
;  *****************统计矢量数据的空间范围**************
  
  envi_evf_info, evf_id, num_recs = nrecs,projection = proj
  corner = dblarr(4, nrecs) ;四列对应于横坐标的最大最小值,与纵坐标的最大最小值
  for i=0, nrecs-1 do begin
  ;  获取每条记录的空间范围
    record = envi_evf_read_record(evf_id, i)
    corners[0,i] = min(record[0,*]);横坐标最小值
    corners[1,i] = min(record[0,*]);横坐标最大值
    corners[2,i] = min(record[1,*]);纵坐标最小值
    corners[3,i] = min(record[1,*]);纵坐标最大值
  endfor
  ;计算所有矢量记录的横、纵坐标的最小值最大值
  UL_xmap = min(corners[0,*])
  UL_ymap = max(corners[3,*])
  LR_xmap = min(corners[1,*])
  LR_ymap = max(corners[2,*])
;  ****************逐日循环,进行镶嵌、裁剪和掩膜等预处理*********************************
  for i_day = 1, 365 do begin
;    获取当前日的所有遥感数据文件名
    ft = 'Day'+string(i_day,format = 'i3.3')
    fns = file_search(ft + '*.{hdr,HDR}',count = fnums)
    ENVI_fns = strarr(fnums)
    for i=0, fnums-1 do begin
      ENVI_fns[i] = strmid(fns[i], 0,strlen(fns[i])-4)
    endfor
    
;    完成当日所有遥感数据镶嵌
    fid_mosaiced = process_mosaic(ENVI_fns)
    envi_file_query, fid_mosaiced,ns = ns, nl = nl, nb = nb
;  获取裁剪范围
  envi_convert_file_coordinates, fid_mosaiced, xf_UL, yf_UL, UL_xmap, UL_ymp
  envi_convert_file_coordinates, fid_mosaiced, xf_LR, yf_LR, LR_xmap, LR_ymp
  dims = [-1,floor(xf_UL),ceil(xf_LR),floor(yf_UL),ceil(yf_LR)]
;  执行裁剪操作
  pos=indgen(nb)
  envi_doit,'resize_doit', fid=fid_mosaiced,r_fid=fid_cliped,$
  dims=dims,pos=pos,rfact=[11],out_name='cliped_data'
  envi_file_query,fid_cliped,ns=ns,nl=nl,data_type=data_type
  map_info=envi_get_map_info(fid=fid_cliped)
; 删除中间文件
  envi_file_mng, id=fid_mosaiced, /remove, /delete
; 执行掩膜操作
  process_mask,evf_id,fid_cliped,o_fn='Result_i'+ft
endfor
t2 = systime(1);程序结束时间
print, '耗时(分钟):', (t2-t1)/60

end


总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云朵不吃雨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值