赞
踩
ArcMap内置了python2的环境,我们可以在ArcMap中通过python脚本来运行地理处理工具
import arcpy
arcpy.gp.Times_sa(r"xxx.tif", 0.0001, r"xxx.tif")
inraster = r"S:\tut\0206\data\2010M1NDVI_int16.tif"
factor = 0.0001
outraster = r"S:\tut\0206\data\2010M1_NDVI_v2.tif"
arcpy.gp.Times_sa(inraster, factor, outraster)
import arcpy
inraster = r"S:\tut\0203\year NDVI\2010.tif"
mask = r"S:\tut\0204\subzone.shp"
outraster = r"S:\tut\0203\year NDVI\clip_2010.tif"
arcpy.Clip_management(inraster, "#", outraster, mask, "#", "ClippingGeometry")
python基本语法 + arcpy调用地理处理工具 = 批处理代码
nums = [1,2,3,4,5] # nums = list(range(1,6)
for num in nums:
print(num)
import os # 导入os库
in_folder = r"xxx" # 输入:文件夹的路径
for i in os.listdir(in_folder): # 遍历文件夹中的所有文件名
if i.endswith(".tif"): # 如果文件名以tif结尾
print(i) # 打印
import os # 导入os库
in_folder = r"xxx" # 输入:文件夹的路径
for filename in os.listdir(in_folder):
if filename.endswith(".tif"):
print(os.path.join(in_folder, filename))
与其他编程语言不同(代码缩进仅出于可读性的考虑),python中的缩进十分重要,若缩进使用错误,会报语法错误。
num = 25
if num >= 20:
print('这个数字大于等于'+ str(num)+'.')
else num < 20:
print('这个数字小于' + str(num) + '.')
C是用 //,而python中用 # 进行单行注释,如
in_folder = r"xxx" # 输入:待处理栅格文件所在的文件夹路径
在ArcMap调用python代码的过程,建议尽量避免在代码中出现中文字符(即使是注释部分)。
# params in_path = r"xxx" # str out_path = r"xxx" # str prefix = "xx" # str rasters = [os.path.join(in_path,i) for i in os.listdir(in_path) if i.endswith(".tif")] nums = len(rasters) num = 1 for raster in rasters: raster_name = os.path.split(raster)[1] out_raster = os.path.join(out_path, prefix + raster_name) if not os.path.exists(out_raster): try: # 这里插入要批量执行的地理处理相关的代码 arcpy.AddMessage("%d/%d | %s completed" % (num, nums, out_raster)) except Exception as err: arcpy.AddMessage("%d/%d | %s errored, %s" % (num, nums, out_raster, err)) else: arcpy.AddMessage("%d/%d | %s already exists" % (num, nums, out_raster)) num = num + 1
练习:根据通用模板,实现批量乘功能
需要对某个文件夹中的所有栅格执行某个工具,共三步:
复制模板
修改 输入文件夹、输出文件夹、文件名前缀这三个变量
```python
# params
in_path = r"xxx" # str
out_path = r"xxx" # str
prefix = "xx" # str
添加核心语句(python 调用某个地理处理工具的语句)
# 例如
arcpy.gp.Times_sa(raster, 0.0001, out_raster)
该部分建议配合视频讲解一起看,让ArcMap变得更加强大,用Python编写自定义脚本工具箱
除了上述利用python脚本使用任何可用的工具以外,我们也可以创建自己的自定义工具。这些自定义工具可以用于执行特定的地理处理任务,并且更容易共享(有界面)。
ArcMap中创建工具箱有两种方法,分别为
可以在ArcToolbox的 自定义工具箱(.tbx) 中创建自定义的地理处理脚本工具,步骤主要有:
创建自定义工具箱(.tbx)
创建python脚本文件(.py)
核心:使用arcpy中的GetParameterAsText()函数来接受用户的动态输入
#!/usr/bin/python # -*- coding: UTF-8 -*- import arcpy from arcpy import env import os import time import sys reload(sys) sys.setdefaultencoding('utf8') tifs = arcpy.GetParameterAsText(0) masks = arcpy.GetParameterAsText(1) out_dir = arcpy.GetParameterAsText(2) tifs = tifs.split(";") masks = masks.split(";") names = [os.path.splitext(os.path.basename(mask))[0] for mask in masks] size = len(tifs) * len(masks) num = 1 for i, mask in enumerate(masks): # create a new folder named by mask's name new_folder = out_dir + os.sep + names[i] if not os.path.exists(new_folder): os.mkdir(new_folder) else: arcpy.AddMessage("Folder {0} already exists. Please check it.".format(new_folder)) for tif in tifs: s = time.time() cliped_tif = os.path.join(new_folder, "{0}_{1}".format(names[i],os.path.split(tif)[1])) if not os.path.exists(cliped_tif): arcpy.Clip_management(tif, "#", cliped_tif, mask, "#", "ClippingGeometry") e = time.time() arcpy.AddMessage("{0}/{1} | {2} Completed, time used {3}s".format(num, size, cliped_tif, e - s)) else: e = time.time() arcpy.AddMessage("{0}/{1} | {2} already exists.".format(num, size, cliped_tif)) num += 1
python工具箱(.pyt)与ArcToolbox中的工具箱(.tbx)类似,但它完全是用python创建的,下面展示了pyt文件的代码模板
import arcpy class Toolbox(object): def __init__(self): """Define the toolbox (the name of the toolbox is the name of the .pyt file).""" self.label = "Toolbox" self.alias = "" # List of tool classes associated with this toolbox self.tools = [Tool] class Tool(object): def __init__(self): """Define the tool (tool name is the name of the class).""" self.label = "Tool" self.description = "" self.canRunInBackground = False def getParameterInfo(self): """Define parameter definitions""" params = None return params def isLicensed(self): """Set whether tool is licensed to execute.""" return True def updateParameters(self, parameters): """Modify the values and properties of parameters before internal validation is performed. This method is called whenever a parameter has been changed.""" return def updateMessages(self, parameters): """Modify the messages created by internal validation for each tool parameter. This method is called after internal validation.""" return def execute(self, parameters, messages): """The source code of the tool.""" return def postExecute(self, parameters): """This method takes place after outputs are outputs are processed and added to the display.""" return
python脚本工具箱 (.pyt) 将参数、验证代码以及源代码封装在一起,在代码管理和版本控制方面更友好。
如果想在pycharm中调用arcpy中的函数,添加下列代码:
import sys
arcpy_path = [r'C:\Program Files (x86)\ArcGIS\Desktop10.2\arcpy',
r'C:\Program Files (x86)\ArcGIS\Desktop10.2\bin',
r'C:\Program Files (x86)\ArcGIS\Desktop10.2\ArcToolbox\Scripts']#修改成Arcgis安装对应路径
sys.path.extend(arcpy_path)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。