arcgis构造工具怎么找,arcgis开发工具
从ArcGIS版开始,我们可以创建python工具箱自定义脚本工具,与上一篇文章提到的标准工具箱进行对比。具有独特的优势,并总结了它们之间的具体差异。看这篇文章。
认识 Python工具箱Python工具箱(。pyt)是一个简单的文本文件,可以在任何文本编辑器或任何Python IDE中创建、查看和编辑。为确保ArcGIS正确识别Python工具箱,工具箱类的名称必须为Toolbox。在Toolbox类的__init__方法中定义工具箱的属性。这些属性包括别名、标签和描述。我们可以根据帮助文档中的模板来构建Python工具箱模板。
以下代码创建了一个包含工具(名为tool)的Python工具箱:
import arcpy class Toolbox(object):def _ _ init _ _(self): 定义工具箱(工具箱的名称是。pyt文件)。 self . label= Toolbox self . alias= #与此工具箱相关联的工具类列表self . tools=[Tool]class Tool(object):def _ _ init _ _(self): 定义工具(工具名称是类的名称)。 self . label= Tool self . description= self . canruninbackground=False def getparameter info(self): 定义参数定义 params=None return params def is licensed(self): 设置是否授权工具执行。 return True def update Parameters(self,parameters): 在执行内部验证之前修改参数的值和属性。每当参数发生更改时都会调用此方法。return def updateMessages(self,parameters): 修改由每个工具参数的内部验证创建的消息。在内部验证后调用此方法。 return def execute (self,parameters,messages): 工具的源代码。返回
动手做做现在我将基于这个模板编写一个简单的脚本工具箱。需求是批量切割。希望可以只提供一个工作空间、a裁剪区域面之类的文件夹或数据库,批量剪切工作区的所有数据,忽略网格或矢量,全部一起剪切。
让脚本开始吧……
1创建工具箱工具箱的名称是。pyt文件。通常,当我们向ArcToolbox窗口添加工具时,会显示工具箱的标签。在Toolbox类的__init__方法中定义属性,例如:alias、label和description。
随着工具类被添加到。pyt,工具箱的工具属性必须设置为类,包含所有定义的工具列表。比如你需要做三个工具:ATool,ATool,CTool。不是写三个脚本,而是需要创建三个类,然后把类名放到列表中,self.tools = [ATool,ATool,CTool]。
在这里,我只定义了一个工具类ClipWorkspace来解释构建过程:
来源名称:clipworkspace.pythauthor作者:美丽的路灯:python工具批量裁剪同一工作空间中的空间数据。 import arcpy #类名必须是 Toolbox .class Toolbox(object):def _ _ init _ _(self):self . label= Clip Workspace Toolbox self . alias= #与此工具箱关联的工具类列表self . tools=[Clip Workspace]class Clip Workspace(object):……
您已经可以在ArcGIS Desktop中看到该工具箱的原型:
2定义工具下面是完善工具的代码。我以ClipVectorWorkspace为例。
每个工具类至少应包括__init__和execute个方法。此外,您还可以选择使用getParameterInfo、isLicensed、updateParameters和updateMessages方法向工具的行为添加其他控件。
工具类中的__init__方法是标准的Python类初始化方法。对于Python工具箱中的工具,__init__方法用于设置工具的属性,如工具的注记、描述、是否允许在后台运行等。
以下示例创建工具ClipVectorWorkspace:
class clip workspace(object):def _ _ init _ _(self):self . label= clip workspace self . description=批量剪辑同一工作区中的空间数据。Self.canruninbackground=true有了工具的构造函数,我们继续看看如何为工具定义参数。在Python工具箱中(。pyt),可以在工具类的getParameterInfo方法中创建一个Parameter对象,设置对象的属性来定义工具参数。Parameter属性中的datatype
包含的类型可以在帮助文档中查询,点这里。
本例中的参数是输入工作区、剪辑区和输出工作区。
def getParameterInfo(self): #参数定义#第一个参数-输入工作空间param0=arcpy。parameter(display name= Input Workspace ,name=inWorkspace ,datatype=DEWorkspace ,parameterType=Required ,direction=Input) #第二个参数-裁剪区域param1=arcpy。parameter(display Name=Clip Area ,name= Clip Area ,datatype= DEFeatureClass ,parameterType=Required ,direction=Input) #第三个参数-输出工作空间param2=arcpy。parameter(display Name= Output Workspace ,Name= outworkspace ,datatype= de workspace ,parametertype= required ,direction= input )params=[param 0,param1,param2] return paramsPS:在代码中,如果仔细看,你可能会奇怪为什么输出工作空间的方向是输入而不是输出。因为工具的最终输出是要素类或栅格,所以输出工作空间也用作工具的输入参数。如果你不在乎,你可以忽略这些细节.继续了解工具构建过程。
以下是工具的具体执行部分,当然也有一些消息帮助你了解工具的执行状态:
定义执行(自身,参数,消息): 工具的源代码在工作空间中中的工具参数=参数[0].valueAsText arcpy .添加消息(# # #输入工作空间为{0})。format(inWorkspace))剪辑区域=参数[1].valueAsText arcpy .添加消息(# # #剪辑区域为{0})。format(clip area))out workspace=parameters[2].valueAsText arcpy .添加消息(# # #超出工作区为{0})。格式(outWorkspace)) #按批处理裁剪要素arcpy。环境。workspace=工作空间#裁剪矢量要素类=arcpy .ListFeatureClasses() arcpy .AddMessage("输入工作空间包含{0}"。要素类:arcpy中文件比较的格式(要素类))。AddMessage("剪辑{0}"。格式(fc)) arcpy .Clip_analysis(fc,ClipArea,os.path.join(outWorkspace,fc)) arcpy .add message(“{ 0 }”已被剪辑格式(OS。路径。join(out workspace,fc))#裁剪栅格栅格=arcpy .ListRasters() arcpy .AddMessage("输入工作空间包含{0}"。栅格中栅格的格式(栅格)):arcpy .AddMessage("剪辑{0}"。格式(栅格)arcpy .clip _ management(in _ Raster=Raster,rectangle= ,out _ Raster=OS。路径。join(out workspace,Raster),in_template_dataset=ClipArea,nodata_value= ,clipping _ geometry=裁剪几何,MAINTAIN _ clipping _ EXTENT= NO _ MAINTAIN _ EXTENT )arcpy .add message(“{ 0 }”已被剪辑格式(OS。路径。连接(超出工作空间,栅格)))返回
到这里,工具的核心部分已经完成,执行下试试。
好吧,应该是预期的结果:
3完善我们发现不像标准工具箱中的脚本工具和脚本文件本身是散列存储的,python工具箱以及其中的所有工具的代码都在这一个漂亮的小东西(漂亮的小东西)文件中,维护起来便利了不少。如果想在工具箱中继续添加工具,只要继续增加一个工具类即可。
经过前两步的过程,工具已经可以拿去使用。如果为了工具更友好,还可以继续调整下代码,以便遇到异常的时候,让用户了解更详细的原因,这里就再往下进行了。工具分享给别人,最后只差要丰富下工具文档了,同样在计算机编程语言工具的项目说明中编辑。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。