; This program was developed by Camilo D. Rennó and Lise C. Banon using IDL/ENVI language. This code can obtained in http://urlib.net/sid.inpe.br/mtc-m19/2012/09.04.02.06 ; Version: 1.0 (sep 2012) ; This program produces a hierarchical classification based on WEKA decision tree ; Input: Grid of attributes and ascii file with WEKA decision tree ; Output: Drainage network grid FUNCTION FileTmp,extension=extension if n_elements(extension) eq 0 then extension='tmp' i=10000l repeat begin file=FilePath('tmp'+strmid(strcompress(i,/rem),1)+'.'+extension,/tmp) i++ endrep until file_search(file) eq '' return,file END PRO tree_classification Envi_Select,Title='Input File',Fid=fiddata,Dims=dims,Pos=pos ;,/Band_Only if fiddata eq -1 then return ns=dims[2]-dims[1]+1 nl=dims[4]-dims[3]+1 Envi_File_Query,fiddata,Sname=sname,Bnames=bnames,Xstart=xstart,Ystart=ystart file=Dialog_PickFile(/Read,Filter=['*.tree'],/Must_Exist,get_path=path) if file eq '' then return cd,path nlines=File_Lines(file) lines=strarr(nlines) openr,fid,file,/get_lun readf,fid,lines free_lun,fid for i=0l,nlines-1 do begin temp=strsplit(lines[i],'|',/extract) temp=strtrim(temp[n_elements(temp)-1],2) temp=strsplit(temp,'(',/extract) lines[i]=strjoin(strsplit(temp[0],':',/extract),'',/single) endfor tree=strsplit(temporary(lines),' ',/extract) vars=(tree[0])[0] for i=1l,nlines-1 do vars=[vars,(tree[i])[0]] vars=vars[uniq(vars,sort(vars))] for i=0l,nlines-1 do begin temp=tree[i] ivar=where(vars eq temp[0]) temp[0]='b'+strcompress(ivar+1,/rem) tree[i]=temp endfor BandList=bnames+' ['+sname+']' FidList=replicate(fiddata,n_elements(bnames)) PosList=pos BandSelList=replicate(-1l,n_elements(vars)) for i=0l,n_elements(vars)-1 do BandSelList[i]=(where(bnames eq vars[i]))[0] VarList= vars+' <-> '+(['undefined',BandList])[BandSelList+1] Base=Widget_Base(/Column,Title='Variables to Bands Pairing') Base1=Widget_Base(Base,/Frame,/Column) Label=Widget_Label(Base1,Value='Variables used in tree classifier:') VListW=Widget_List(Base1,Value=VarList,ysize=n_elements(vars) < 20) Label=Widget_Label(Base1,Value='Available Bands List') BListW=Widget_List(Base1,Value=BandList,ysize=n_elements(BandList) < 20,Sensitive=0) Base2=Widget_Base(Base,/Frame,/Row) OKW=Widget_Button(Base2,Value='OK',Xsize=70,Sensitive=min(BandSelList) ne -1) CancelW=Widget_Button(Base2,Value='Cancel',Xsize=70) Widget_Control,Base,/Realize While Widget_Info(Base,/Valid) do begin ev=Widget_Event(Base,bad_id=bad_id) if bad_id ne 0 then break Case ev.id of VListW: begin vsel=ev.index Widget_Control,BListW,Set_List_Select=BandSelList[vsel],/Sensitive end BListW: begin BandSelList[vsel]=ev.index VarList= vars+' <-> '+(['undefined',BandList])[BandSelList+1] VarListSel=Widget_Info(VListW,/List_Select) VarListTop=Widget_Info(VListW,/List_Top) Widget_Control,VListW,Set_List_Top=VarListTop,Set_List_Select=VarListSel,Set_Value=VarList Widget_Control,OKW,Sensitive=min(BandSelList) ne -1 end Else:if (ev.id eq CancelW) or (ev.id eq OKW) then Widget_Control,Base,/Destroy Endcase EndWhile if ev.id ne OKW then return ;classifying... tree2=List(tree[0]) k=1l for i=1l,nlines-1 do begin tree2.Add,tree[i],0 if (tree2[0])[1] eq '>' then begin for j=1l,n_elements(tree2)-1 do begin if ((tree2[0])[0] eq (tree2[j])[0]) and ((tree2[0])[2] eq (tree2[j])[2]) then begin tree2.Remove,lindgen(j)+1 break endif endfor endif if n_elements(tree2[0]) eq 4 then begin if (tree2[0])[3] ne 0 then begin boolexpress='(' BandSel=long(strmid((tree2[0])[0],1)) for j=n_elements(tree2)-1,1,-1 do begin BandSel=[BandSel,long(strmid((tree2[j])[0],1))] boolexpress+='('+(tree2[j])[0]+((tree2[j])[1] eq '>'?' gt ':' le ')+(tree2[j])[2]+') and ' endfor if (tree2[0])[3] ne '1' then boolexpress=(tree2[0])[3]+'b*'+boolexpress boolexpress+='('+(tree2[0])[0]+((tree2[0])[1] eq '>'?' gt ':' le ')+(tree2[0])[2]+'))' BandSel=BandSel(uniq(BandSel,sort(BandSel)))-1 envi_doit,'math_doit',fid=FidList[BandSelList[BandSel]],dims=dims,pos=PosList[BandSelList[BandSel]],exp=boolexpress,out_name=FileTmp(),r_fid=fidtmp,/no_realize temp=Envi_Get_Data(fid=fidtmp,dims=dims,pos=0) envi_file_mng,id=fidtmp,/remove,/delete if k eq 1 then imgclass=temporary(temp) else imgclass+=temporary(temp) k++ endif tree2.Remove,[0] endif endfor Base=Widget_Auto_Base(Title='Drainage') Base1=Widget_Base(Base,/Column,/Frame) OutFM=Widget_OutFM(Base1,Uvalue='outf',Func='Envi_Out_Check',/Auto) result=Auto_Wid_Mng(Base) if result.accept eq 0 then return if result.outf.in_memory eq 1 then begin Envi_Enter_Data,imgclass,bnames='Drainage',Map_Info=Envi_Get_Map_info(fid=fiddata) endif else begin Openw,fid,result.outf.name,/Get_Lun Writeu,fid,imgclass Free_Lun,fid Envi_Setup_Head,Fname=result.outf.name,ns=ns,nl=nl,nb=1,$ Data_Type=size(imgclass,/Type),bnames='Drainage',/Write,/Open,$ interleave=0,Map_Info=Envi_Get_Map_info(fid=fiddata) endelse print,'end' END