24小时热门版块排行榜    

查看: 2308  |  回复: 6

zzahkj

木虫 (著名写手)

[求助] IDL批量求取某坐标点DN值 已有3人参与

我的数据如下:
TIFF格式——含有很多波段
我自己试着写的代码如下
CODE:
;批量读取点的DN值
pro txtpoints
  envi,/restore_base_save_files
  imges=dialog_pickfile(/read,/multiple_files,filter='*.tif',title='please choose your images',path='C:\Users\BDQS\Desktop\zz');读取影像文件路径
  n= N_ELEMENTS(imges);打开影像的个数
  FOR i=0,n-1 do begin;对每个影像,读取指定坐标下的DN值
    envi_open_data_file,imges(i),/IMAGINE,r_fid=fid;
    ENVI_FILE_QUERY, fid, dims=dims, nb=nb ,nl=nl,ns=ns,FNAME=fname;读取影像基本信息,获取行列数
     for curBand =0,nb-1 do begin
      xmap=84.4
      ymap=43.266667   
      ENVI_CONVERT_FILE_COORDINATES,fid,xf,yf,xmap,ymap
      yf=nl-round(yf)
      xf=round(xf)-1
      dims=[-1,xf,xf,yf,yf]
      pointArray(curBand).fname=fname
      pointArray(curBand).data = ENVI_GET_DATA(fid=fid, dims=dims, pos=curBand)
     endfor     
  ENDFOR
  outfile='E:\zz.txt'
  openw,lun,outfile,/get_lun,width=9999999
  printf,lun,pointArray,format='(17a)'
  free_lun,lun
  print,'completed

end

运行出现下列错误
txtpoints

      pointArray(curBand).data = ENVI_GET_DATA(fid=fid, dims=dims, pos=curBand)
                                                   ^
% Syntax error.
  At: C:\Users\BDQS\Desktop\txtpoints.pro, Line 17
% 1 Compilation error(s) in module TXTPOINTS.
% Attempt to call undefined procedure/function: 'TXTPOINTS'.
% Execution halted at: $MAIN$      

代码写得好像也不对,哪位大神帮我改改?非常感谢!
回复此楼
不要迷恋哥,哥只是一个过客!
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

Liwenkai

铜虫 (初入文坛)

【答案】应助回帖

感谢参与,应助指数 +1
非得IDL吗,arcgis也可以啊
2楼2014-07-03 19:00:08
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

Liwenkai

铜虫 (初入文坛)

【答案】应助回帖

求助一些seadas的资料,网上好难找
3楼2014-07-03 19:02:32
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zzahkj

木虫 (著名写手)

引用回帖:
2楼: Originally posted by Liwenkai at 2014-07-03 19:00:08
非得IDL吗,arcgis也可以啊

ArcGIS如何批量 一个TIFF文件有365个波段,多个TIFF文件
不要迷恋哥,哥只是一个过客!
4楼2014-07-03 20:55:26
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zzahkj

木虫 (著名写手)

引用回帖:
3楼: Originally posted by Liwenkai at 2014-07-03 19:02:32
求助一些seadas的资料,网上好难找

海洋遥感软件?你做海洋遥感?
不要迷恋哥,哥只是一个过客!
5楼2014-07-03 20:56:05
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

潇湘es

新虫 (小有名气)

【答案】应助回帖

感谢参与,应助指数 +1
;不会,我这里有一个批处理模板,你看着修改下
;---------------------------------------------------------------
;+
;escription:
;   ENVI二次开发的批处理模版
;   默认为数据格式转换为tiff格式
;
; Author: DYQ
;-
;析构函数
PRO ENVI_BATCH_TEMPLATE_CLEANUP,tlb
  WIDGET_CONTROL,tlb,get_UValue = pState
  PTR_FREE,pState
END
;事件响应函数
PRO ENVI_BATCH_TEMPLATE_EVENT,event
  COMPILE_OPT idl2
  WIDGET_CONTROL,event.TOP, get_UValue = pState
  
  ;关闭事件
  IF TAG_NAMES(event, /Structure_Name) EQ 'WIDGET_KILL_REQUEST' THEN BEGIN
    ;
    status = DIALOG_MESSAGE('关闭?',/Question)
    IF status EQ 'No' THEN RETURN
    ;销毁指针
    ; PTR_FREE, pState
    WIDGET_CONTROL, event.TOP,/Destroy
    RETURN;
  ENDIF
  ;根据系统的uname进行判断点击的组件
  uName = WIDGET_INFO(event.ID,/uName)
  ;
  CASE uname OF
    ;打开文件
    'open': BEGIN
      files = DIALOG_PICKFILE(/MULTIPLE_FILES, $
        title = !SYS_Title+' 打开文件', $
        path = (*pState).ORIROOT)
      IF N_ELEMENTS(files) EQ 0 THEN RETURN
      ;设置显示文件
      WIDGET_CONTROL, (*pState).WLIST, set_value = files
      (*pState).INPUTFILES = PTR_NEW(files)
      (*pState).ORIROOT = FILE_DIRNAME(files[0])
      ;重置进度条进度
      IDLITWDPROGRESSBAR_SETVALUE,(*pState).PRSBAR,0
      
    END
    ;退出
    'exit': BEGIN
      status = DIALOG_MESSAGE('关闭?',$
        title = !SYS_Title, $
        /Question)
      IF status EQ 'No' THEN RETURN
      WIDGET_CONTROL, event.TOP,/Destroy
    END
    ;关于
    'about': BEGIN
      void = DIALOG_MESSAGE(!SYS_Title+' V1.0'+STRING(13b)+'欢迎使用,问题讨论请去bbs.esrichina-bj.cn!' ,/information)
    END
    ;
    ;路径选择按钮
    'filepathsele': BEGIN
      WIDGET_CONTROL, event.ID,get_value = value
      WIDGET_CONTROL,(*pState).WSELE, Sensitive= value
      WIDGET_CONTROL,(*pState).OUTPATH, Sensitive= value
    END
    ;选择输出路径
    'selePath' : BEGIN
      outroot = DIALOG_PICKFILE(/dire,title = !SYS_Title)
      WIDGET_CONTROL,(*pState).OUTPATH,set_value = outRoot
    END
   
    ;功能执行
    'execute': BEGIN
      ;获取选择的方法
      WIDGET_CONTROL,(*pState).BGROUP, get_Value = mValue
      IF PTR_VALID((*pState).INPUTFILES) EQ 0 THEN RETURN
      ;初始化ENVI
      ENVI, /restore_base_save_files
      ENVI_BATCH_INIT,/NO_Status_Window
      
      ;获取文件名
      files = *((*pState).INPUTFILES)
      per = 100./N_ELEMENTS(files)
      ;判断是否需要选择路径
      IF mValue NE 0 THEN BEGIN
        ;构建输出文件名
        WIDGET_CONTROL, (*pState).OUTPATH,get_value= outfiledir
        IF (outfiledir[0] EQ ' ') THEN  outfiledir = DIALOG_PICKFILE(/dire, title =!SYS_Title+' 输出路径')
      ENDIF  ELSE outfiledir = FILE_DIRNAME(files[0])
      
      FOR i=0,N_ELEMENTS(files)-1 DO BEGIN
        ;构建输出文件名
        fileName = FILE_BASENAME(files)
        pointPos = STRPOS(fileName,'.')
        ;查找文件名中点的位置
        IF pointPos[0] NE -1 THEN BEGIN
          fileName= STRMID(fileName,0,pointPos)
        ENDIF
        out_name = outfiledir+PATH_SEP()+fileName+'.tiff'
        
        ENVI_OPEN_FILE, files, r_fid=fid
        IF (fid EQ -1) THEN BEGIN
          tmp = DIALOG_MESSAGE(files+'文件读取错误',$
            title = !sys_title, /error)
          CONTINUE
        ENDIF
        ;文件信息
        ENVI_FILE_QUERY, fid, dims=dims, nb=nb,bnames = bnames
        ;设置tiff文件输出参数
        ;如果波段小于3个
        IF nb LE 3 THEN bandList = INDGEN(nb)ELSE $
          bandList = [3,2,1]
        ;调用ENVI功能函数另存数据
        ENVI_OUTPUT_TO_EXTERNAL_FORMAT,fid = fid,dims = dims, out_name=out_name,pos = bandList, $
          out_bname=bnames[bandlist],/TIFF
        ;输出完成
        ENVI_FILE_MNG, id=fid, /remove
        ;设置进度条
        IDLITWDPROGRESSBAR_SETVALUE,(*pState).PRSBAR,(i+1)*per
      ENDFOR
      void = DIALOG_MESSAGE('处理完成 ',title = !sys_title,/infor)
      ;关闭ENVI二次开发模式
      ENVI_BATCH_EXIT
    END
    ELSE:
  ENDCASE
END
;
;--------------------------
;ENVI二次开发批处理模版
PRO ENVI_BATCH_TEMPLATE
  ;
  COMPILE_OPT idl2
  ;初始化组件大小
  sz = [600,400]
  ;设置系统变量,可方便修改系统标题
  DEFSYSV,'!SYS_Title','ENVI批处理模版'
  ;创建界面的代码
  tlb = WIDGET_BASE(MBAR= mBar, $
    /COLUMN , $
    title = !SYS_Title, $
    /Tlb_Kill_Request_Events, $
    tlb_frame_attr = 1, $
    Map = 0)
  ;创建菜单
  fMenu = WIDGET_BUTTON(mBar, value ='文件',/Menu)
  wButton = WIDGET_BUTTON(fMenu,value ='打开数据文件', $
    uName = 'open')
  fExit = WIDGET_BUTTON(fMenu, value = '退出', $
    uName = 'exit',/Sep)
  eMenu = WIDGET_BUTTON(mBar,value ='功能',/Menu)
  wButton = WIDGET_BUTTON(eMenu,$
    value ='运行批处理', $
    uName = 'execute')
  hMenu =  WIDGET_BUTTON(mBar, value ='帮助',/Menu)
  hHelp = WIDGET_BUTTON(hmenu, value = '关于', $
    uName = 'about',/Sep)
  ;上面的输入base
  wInputBase = WIDGET_BASE(tlb, $
    xSize =sz[0], $
    /Frame, $
    /Align_Center,$
    /Column)
   
   
  wLabel= WIDGET_LABEL(wInputBase, $
    value ='文件列表')
  wList = WIDGET_LIST(wInputBase, $
    YSize = sz[1]/(2*15),$
    XSize = sz[0]/8)
   
  ;输出路径设置
  wLabel= WIDGET_LABEL(tlb, $
    value ='输出参数设置')
   
  ;输出参数控制界面
  wSetBase = WIDGET_BASE(tlb, $
    xSize =sz[0], $
    /Row)
  values = ['源文件路径', $
    '另选择路径']
  bgroup = CW_BGROUP(wSetBase, values, $
    /ROW, /EXCLUSIVE, $
    /No_Release, $
    SET_VALUE=1, $
    uName = 'filepathsele', $
    /FRAME)
  outPath = WIDGET_TEXT(wSetBase, $
    value =' ', $
    xSize =30, $
    /Editable, $
    uName = 'outroot')
  wSele = WIDGET_BUTTON(wSetBase, $
    value ='选择路径', $
    uName ='selePath')
  ;
  ;执行按钮base
  wExecuteBase = WIDGET_BASE(tlb,$
    /align_center,$
    /row)
  wButton = WIDGET_BUTTON(wExecuteBase, $
    ysize =40,$
    value ='打开数据文件', $
    uName = 'open')   
  wButton = WIDGET_BUTTON(wExecuteBase,$
    value ='运行批处理', $   
    uName = 'execute')
  ;状态栏,仅显示进度条
  wStatus = WIDGET_BASE(tlb,/align_right)
  prsbar = IDLITWDPROGRESSBAR( wExecuteBase ,$
    title ='进度', $
    CANCEL =0)
  ;结构体传递参数
  state = {wButton:wButton, $
    tlb : tlb, $
    oriRoot: '', $
    outPath: outPath, $
    wSele : wSele, $
    bgroup : bgroup , $
    inputFiles : PTR_NEW(), $
    prsbar : prsbar , $
    wList : WLIST }
   
  pState = PTR_NEW(state,/no_copy)
  ;操作界面居中
  CENTERTLB,tlb
  ;
  WIDGET_CONTROL, tlb,/Realize,/map,set_uValue = pState
  XMANAGER,'ENVI_Batch_Template',tlb,/No_Block,$
    cleanup ='ENVI_Batch_Template_Cleanup'
END
6楼2014-07-04 11:36:27
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

hyPang

铜虫 (小有名气)

【答案】应助回帖

不知道你在
envi,/restore_base_save_files 之后加
envi_batch_init
会不会管事
路虽远我用心永恒
7楼2015-11-21 14:03:21
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 zzahkj 的主题更新
信息提示
请填处理意见