分享

IDL下实现不规则裁剪(调用ENVI函数)

 siotutu 2011-03-23
【转】 IDL下实现不规则裁剪(调用ENVI函数)
2011-03-16 14:49
转载自 lianyi_dyq
最终编辑 lianyi_dyq


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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多