sav文件下载地址:http://www./zh-cn/files/acd6a98c-72b4-11df-b896-0015c55db73d/ PRO ResizeViaEvf, filename = filename, $ evfName = evfName, $ outName = outName compile_opt idl2
;打开栅格数据 ENVI_OPEN_FILE, fileName,r_fid = fid ;获取相关信息 ENVI_FILE_QUERY,fid, ns = ns,nl = nl, $ nb = nb, dims = dims, BNAMES= BNAMES ;打开矢量文件 evf_id = ENVI_EVF_OPEN(evfName) ;获取相关信息 ENVI_EVF_INFO, evf_id, num_recs=num_recs, $ data_type=data_type, projection=projection, $ layer_name=layer_name roi_ids = LONARR(num_recs)
;读取各个记录的点数 FOR i=0,num_recs-1 DO BEGIN record = ENVI_EVF_READ_RECORD(evf_id, i) ;转换为文件坐标 ENVI_CONVERT_FILE_COORDINATES,fid,xmap,ymap,record[0,*],record[1,*] ;创建ROI roi_id = ENVI_CREATE_ROI(color=4, $ ns = ns , nl = nl) ENVI_DEFINE_ROI, roi_id, /polygon, xpts=REFORM(xMap), ypts=REFORM(yMap) roi_ids[i] = roi_id ;记录XY的区间,裁剪用 IF i EQ 0 THEN BEGIN xmin = ROUND(MIN(xMap,max = xMax)) yMin = ROUND(MIN(yMap,max = yMax))
ENDIF ELSE BEGIN xmin = xMin < ROUND(MIN(xMap)) xMax = xMax > ROUND(MAX(xMap)) yMin = yMin < ROUND(MIN(yMap)) yMax = yMax > ROUND(MAX(yMap)) ENDELSE ENDFOR xMin = xMin >0 xmax = xMax < ns-1 yMin = yMin >0 ymax = yMax < nl-1 ;创建掩膜,裁剪后掩 ENVI_MASK_DOIT,$ AND_OR =1, $ /IN_MEMORY, $ ROI_IDS= roi_ids, $ ;ROI的ID ns = ns, nl = nl, $ /inside, $ ;区域内或外 r_fid = m_fid out_dims = [-1,xMin,xMax,yMin,yMax] ENVI_MASK_APPLY_DOIT, FID = fid, POS = INDGEN(nb), DIMS = out_dims, $ M_FID = m_fid, M_POS = [0], VALUE = 0, $ out_name = outName, OUT_BNAME= BNAMES+' Resized' 掩膜文件ID移除 ENVI_FILE_MNG, id =m_fid,/remove END
PRO TEST_RESIZEVIAEVF COMPILE_OPT idl2 ;获取当前路径 IF (FLOAT(!version.RELEASE) LT 7) THEN BEGIN curPath = SOURCEROOT() ENDIF ELSE BEGIN curPath = FILE_DIRNAME(ROUTINE_FILEPATH('TEST_RESIZEVIAEVF')) ENDELSE ; ;测试数据带投影 ; fileName = curpath+PATH_SEP()+'bhtmsat.img' ; evfName = curpath+PATH_SEP()+'bhtmsat.evf' ; outName = curpath+PATH_SEP()+'bhtmsat_resize.img' ; ;测试数据无投影 fileName = curpath+PATH_SEP()+'test.img' evfName = curpath+PATH_SEP()+'test.evf' outName = curpath+PATH_SEP()+'test_resize.img'
;调用函数 ResizeViaEvf, filename = filename, $ evfName = evfName, $ outName = outName END
FUNCTION SOURCEROOT COMPILE_OPT StrictArr HELP, Calls = Calls UpperRoutine = (StrTok(Calls[1], ' ', /Extract))[0] Skip = 0 CATCH, ErrorNumber IF (ErrorNumber NE 0) THEN BEGIN CATCH, /Cancel ThisRoutine = ROUTINE_INFO(UpperRoutine, /Functions, /Source) Skip = 1 ENDIF IF (Skip EQ 0) THEN BEGIN ThisRoutine = ROUTINE_INFO(UpperRoutine, /Source) IF (thisRoutine.Path EQ '') THEN BEGIN MESSAGE,'',/traceback ENDIF ENDIF CATCH,/cancel IF (STRPOS(thisroutine.path,PATH_SEP()) EQ -1 ) THEN BEGIN CD, current=current sourcePath = FILEPATH(thisrouitine.path, root=current) ENDIF ELSE BEGIN sourcePath = thisroutine.path ENDELSE Root = STRMID(sourcePath, 0, STRPOS(sourcePath, PATH_SEP(), /Reverse_Search) + 1) RETURN, Root END
|