前言
采用arcpy制作arcgis的脚本工具,记录如下。
一、脚本工具的制作
制作脚本工具分为两步:
1、先编写对应功能的python脚步
2、将对应功能的脚本修改为,能自己手动选择输入输出数据的脚本
3、将修改完的脚本添加到工具箱
1、编写代码
我这个实例是用来提取特定高程的等高线,源代码如下:
# -*- coding: UTF-8 -*-
"""
@Date :2023/6/25
"""
import time
"""
1、先写一段脚本
2、对脚本进行改写
"""
import os
import arcpy
print '程序开始:' + str(time.ctime())
# 设置工作空间
arcpy.env.workspace = r'E:\arcpy_study\Arcpy实例教程(数据)_小景空间_原始\6Arcpy脚本工具的制作-提取特殊等高线'
# 输入要素
inFeatures = 'coutour.shp'
# 添加一个字段,用来标记高程是否可以整除10
filedName = "Mark" # 字段名称
filedPrecision = 2 # 字段长度
filedAlias = "整除50标记" # 字段别名 能整除50标记为1,不能整除50标记为0
# 列出所有字段
filedObject = arcpy.ListFields(inFeatures)
# 得到所有字段名,如果mark字段存在的话,就删除该字段
filedNameList = []
for filed in filedObject:
# filed.required:字段为必填项时为ture
if not filed.required:
filedNameList.append(filed.name)
print filedNameList
if filedName in filedNameList:
arcpy.DeleteField_management(inFeatures, filedName)
print '删除已有的mark字段'
# 添加字段
arcpy.AddField_management(inFeatures, filedName, "LONG", filedPrecision, "", "", filedAlias, "NULLABLE")
filed1 = "Elev"
filed2 = "Mark"
# 更新查询(为每一条记录做标记)
cursor = arcpy.UpdateCursor(inFeatures)
for row in cursor:
if((int)(row.getValue(filed1))%50 == 0):
row.setValue(filed2, 1)
else:
row.setValue(filed2, 0)
cursor.updateRow(row)
print '程序结束:' + str(time.ctime())
在原有字段的基础上,增加一个Mark
字段,用来标识这条等高线是否能被50整除,若能被50整除,则标识为1,否则为0.
在这个例子中,有一个输入要素,标识要操作的要素名称。
2、修改脚本
在源代码中,我将要修改的要素名称写死了,实际情况肯定不行,所有我要修改为自己可以手动选择要素,工作空间也不需要了。修改后的代码如下:
# -*- coding: UTF-8 -*-
"""
@Date :2023/6/26
"""
import time
import os
import arcpy
print '程序开始:' + str(time.ctime())
# 设置工作空间
# arcpy.env.workspace = r'E:\arcpy_study\Arcpy实例教程(数据)_小景空间_原始\6Arcpy脚本工具的制作-提取特殊等高线'
# 输入要素
# inFeatures = 'coutour.shp'
# 自己选择输入要素
inFeatures = arcpy.GetParameterAsText(0) # 获取第一个输入要素的文本
# 添加一个字段,用来标记高程是否可以整除10
filedName = "Mark" # 字段名称
filedPrecision = 2 # 字段长度
filedAlias = "整除50标记" # 字段别名 能整除50标记为1,不能整除50标记为0
# 列出所有字段
filedObject = arcpy.ListFields(inFeatures)
# 得到所有字段名,如果mark字段存在的话,就删除该字段
filedNameList = []
for filed in filedObject:
# filed.required:字段为必填项时为ture
if not filed.required:
filedNameList.append(filed.name)
print filedNameList
if filedName in filedNameList:
arcpy.DeleteField_management(inFeatures, filedName)
print '删除已有的mark字段'
# 添加字段
arcpy.AddField_management(inFeatures, filedName, "LONG", filedPrecision, "", "", filedAlias, "NULLABLE")
filed1 = "Elev"
filed2 = "Mark"
# 更新查询(为每一条记录做标记)
cursor = arcpy.UpdateCursor(inFeatures)
for row in cursor:
if ((int)(row.getValue(filed1)) % 50 == 0):
row.setValue(filed2, 1)
else:
row.setValue(filed2, 0)
cursor.updateRow(row)
print '程序结束:' + str(time.ctime())
因为我们只有一个输入参数,所以获取第一个输入参数的名字,取下标为0即可。
3、将脚本添加到工具箱
在文件夹目录中新建一个工具箱,接着新建脚本,将脚本名称、标签、描述填上,样式表留空,勾选存储相对路径名,勾选始终在前台运行,点击下一页,如图:
选择编写好的脚本工具,点击下一页,如图:
我们需要再这里设置输入数据和输出数据,因为我们有一个输入要素,所以要设置一个输入数据。填写显示名称和选择输入数据的数据类型,我这里的数据类型为要素类,参数属性可以不用管,和我一样就好,点击完成。如图:
4、注意事项
若运行时报错SyntaxError:EOL while scanning string literal,是因为代码中包含中文引起的,解决方法依照大佬博客:
https://zhuanlan.zhihu.com/p/371214194?utm_id=0
https://www.cnblogs.com/wodewei/p/14476061.html
两种方法都行。
二、脚本工具消息提示
脚本工具消息提示主要有三种。
1、arcpy.AddMessage(str)一般消息
运行效果如下:
2、arcpy.AddWarning(str)警告消息
运行效果如下:
3、arcpy.AddError(str)错误消息
运行效果如下:
这里要注意的是,只要程序中运行到了arcpy.AddError(str),那么会自动在最后添加脚本执行失败的提示,无论你的代码是对是错。
三、arcpy工具自动获取数据
我们使用系统的分割工具的时候,点击输入要素栏的倒三角形,会自动加载当前图层中的所有要素类,方便我们选择,如图:
我们现在要做的就是这种效果。
1、自动获取图层
这一步很简单,我们只需在设置输入参数的时候,把要素类改为要素图层即可:
这样就能自动获取图层上的要素类了。若输入的是栅格数据的话,则要选择栅格图层,等等…不一一列举了。
就算已经添加好了脚本工具也不用担心,直接右击脚本工具,依次点击属性->参数,去修改即可。
2、自动获取图层中的字段
这个也比较简单,我们新建一个输入数据,选择数据类型为字段
,并且获取自
这里我们选择第一个输入数据,这样的话,当我们选择了第一个输入数据之后,第二个数据框这里就会显示第一个输入数据的字段供我们选择:
效果如下: