干货ArcGIS使用Python脚本

文章来源:一氧化碳中毒   发布时间:2021-7-25 12:25:47   点击数:
  

功能描述

对于含有多个要素的矢量文件shp、栅格影像raster,按照shp中的各要素范围,逐个对raster进行提取,并保存到文件夹中

效果如图所示:

主要思路

(1)获取矢量图层、栅格图层

(2)遍历矢量图层中的要素

(3)按要素裁剪栅格

(有SpatialAnalysis-ExtractByMask;Clip_management两种方法)

注意

在裁剪影像时,可能出现栅格范围小于矢量范围的情况(如果shp*,栅格只有*)

方法1,SpatialAnalysis-ExtractByMask,虽慢,但是十分稳定,在可以按矢量范围裁剪,得到*

方法2,Clip_management虽快(约方法10倍速度),但是不太稳定,栅格缺失部分可能无法裁剪,得到*

根据个人对数据精度、速度要求,在代码中选择对应方法

代码

#-*-coding:utf-8-*-#

Time:/1/:04#

Author:ZhaoHL#

File:extractbymask.pyimportarcpyimportos,timeshp_path=rE:\rs\sample_extent.shpimg_path=rE:\rs\m08.tifsave_path=rE:\rs\testarcpy.CheckOutExtension("Spatial")defclear_folder(root_path):clearallfilesinroot_path(includefilesinsubfolders,butnotfolders):paramroot_path::return:files_list=os.listdir(root_path)forfinfiles_list:file_path=os.path.join(root_path,f)ifos.path.isdir(file_path):clear_folder(file_path)else:os.remove(file_path)print(clear+root_path)defclip_img(in_raster,clip_shp,workspace):accordingtofeaturesintheShp,extracttheratersonebyone;allresultrastersaresavedatwordspaceaccordingtotheFIDfieldinShp:paramin_raster::paramclip_shp::paramworkspace::return:ifarcpy.GetParameterAsText(0)!=:in_raster=arcpy.GetParameterAsText(0)ifarcpy.GetParameterAsText(1)!=:clip_shp=arcpy.GetParameterAsText(1)ifarcpy.GetParameterAsText(2)!=:workspace=arcpy.GetParameterAsText(2)clear_folder(workspace)arcpy.env.workspace=workspacet1=time.time()forrowinarcpy.SearchCursor(clip_shp):mask=row.getValue("Shape")FID=int(row.getValue("FID"))FID_name=str(FID).zfill(5)+.tifimg_8_path=os.path.join(workspace,FID_name)#regionmethod1:slowbutsteadymask_raster=arcpy.sa.ExtractByMask(in_raster,mask)arcpy.CopyRaster_management(in_raster=mask_raster,out_rasterdataset=img_8_path,config_keyword="DEFAULTS",background_value=,nodata_value=,onebit_to_eightbit="",colormap_to_RGB="",pixel_type="8_BIT_UNSIGNED",scale_pixel_value=None,RGB_to_Colormap=None)#endregion#regionmethod2:fastbutprobablygetnullresult#arcpy.Clip_management(in_raster,#,img_8_path,mask,0,"ClippingGeometry")#endregiont2=time.time()-t1arcpy.AddMessage(FID_name+isgeneratedsuccessfully,totaltime:+str(round(t2,2)))if__name__=="__main__":passclip_img(img_path,shp_path,save_path)

实施细节

(1)裁剪出的文件名可以与已有文件重复,考虑到可能多次裁剪重复试验,

因此调用clear_folder函数清除保留路径下的所有文件(根据情况自行使用)

(2)Clip_management可能出现空结果(可能是路径等问题),但比ExtractByMask快数倍

因此建议调试成功后使用Clip_management方法

(3)在arcmap中添加脚本

右击mytoolbox-new-toolbox,新建工具箱

右击新建的工具箱-add-script;第一页设置默认;第二页设置在scriptfile中选择python脚本文件、其余默认;第三页可以设置输入参数(可以跳过,进行默认参数训练,也可以按照4)进行设置。

(4)输入参数设置

可以直接在脚本中修改,在arcmap中跳过、不设置参数。

也可以在arcmap中按下图将3个参数均设置为可选选项,方便重复使用

本文来源CSDN作者:GISer_Lin版权归作者所有

转载自

转载请注明:http://www.lwblm.com/bzbk/12186.html