IDL程式設計 利用shp檔案批量裁剪

2021-10-18 02:18:43 字數 3658 閱讀 5377

主要是在「原始碼的基礎上增加了「 envi_file_mng, id =fid,/remove」 釋放記憶體的部分。

;;;

;image_dir為影像路徑;;

;;vector_dir向量路徑;;

;;outfile_dir裁剪後結果路徑

pro bach_subset_viashp,image_dir,vector_dir,outfile_dir

compile_opt

idl2

;compole_opt是對idl編譯規則的修改,關鍵字有defint32,strictarr,

;idl2等

;defint32把預設的idl整型資料16位改為32位

;strictarr強迫陣列元素用中括號,不用小括號

;idl2則為上述二者的並。

e=envi

(/headless)

;啟動envi

image_dir=

'f:\e\data\grass_yield\2000_2018gosif\8day'

;根據檔案存放的目錄進行相應修改

image_files=

file_search

(image_dir,

'*.tif'

,count=numfiles)

;根據相應的檔案格式修改過濾條件

for i=

0,numfiles-

1do begin

image_file=image_files[i]

print,image_file

ifstrlen

(image_file) eq 0 then return

envi_open_file

, image_file, r_fid=fid, $

/no_interactive_query,

/no_realize

envi_file_query

, fid, file_type=file_type,

bnames

=bnames

,nl=nl, ns=ns,dims=dims,nb=nb

;開啟shape檔案

vector_dir=

'f:\e\data\grass_yield\shp\wgs84\minqin'

;根據檔案存放的目錄進行相應修改

shapefile=

file_search

(vector_dir,

'*.shp'

,count=numshps)

ifstrlen

(shapefile) eq 0 then return

oshp =

obj_new

('idlffshape'

,shapefile)

oshp-

>getproperty,n_entities=n_ent,attribute_info=attr_info,$

n_attributes=n_attr,entity_type=ent_type

roi_shp =

lonarr

(n_ent)

for ishp =

0,n_ent-1do

begin

entitie = oshp-

>

getentity

(ishp)

if entitie.shape_type eq

5then

begin

record =

*(entitie.vertices)

;轉換檔案座標

envi_convert_file_coordinates

,fid,xmap,ymap,record[0,

*],record[1,

*];建立roi

roi_shp[ishp]

=envi_create_roi

(ns=ns,nl=nl)

envi_define_roi

,roi_shp[ishp]

,/polygon,xpts=

reform

(xmap)

,$ypts=

reform

(ymap)

;記錄x

,y的區間,裁剪用

if ishp eq

0then

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

endif

oshp-

>destroyentity,entitie

endfor

;ishp

xmin = xmin >

0 xmax = xmax < ns-

1 ymin = ymin >

0 ymax = ymax < nl-

1;判斷輸出檔案路徑,在原檔名基礎上輸出

outfile_dir=

file_dirname

(image_file,

/mark_directory

) out_name = outfile_dir +

'\' +file_basename(image_file,'

.tif')$

+'_'

+file_basename

(shapefile,

'.shp')+

'_roi.tif'

out_dims =[-

1,xmin,xmax,ymin,ymax]

pos =

indgen

(nb)

envi_doit

,'envi_subset_via_roi_doit'

,background=

0,fid=fid,$

dims=out_dims,out_name=out_name,ns = ns, nl = nl,pos=pos,$

roi_ids=roi_shp

envi_file_mng

, id =fid,

/remove

endfor

;i=numfiles

tmp =

dialog_message

('cut is end!'

,/info)

envi_batch_exit

end

參考1:

參考2:

原始:

如何利用 bat檔案來對其它眾多檔案進行批量改名

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!批處理 如下 echo offset a total 0set prefix myfor m in do if not m mybat.bat ren m prefix m set a total total 1 echo 共有 total 個檔案...

SHELL程式設計 利用CSIDL開啟特殊資料夾

csidl描述及使用說明 csidl 表示的是windows shell中乙個特殊資料夾的標識值。這裡說的特殊資料夾指的是由windows shell所定義的資料夾,例如 我的文件 站 inernet cache資料夾 就是一些由shell指定的特殊資料夾.這些特殊資料夾可以是乙個磁碟上的物理路徑,...

SHELL程式設計 利用CSIDL開啟特殊資料夾

csidl描述及使用說明 csidl 表示的是windows shell中乙個特殊資料夾的標識值。這裡說的特殊資料夾指的是由windows shell所定義的資料夾,例如 我的文件 站 inernet cache資料夾 就是一些由shell指定的特殊資料夾.這些特殊資料夾可以是乙個磁碟上的物理路徑,...