近期使用arcpy的坑

如有交流想法或指正请联系q775915005

1.使用pycharm出现:FNP preptool has not been run on this executable或者运行arcpy(打开arcpy.mapping)一直没有运行结果:

出现这些问题可以尝试清理对应mxd文件的缓存(本人主要因为加载在线影像图,缓存过多),或者将arcpy.mapping.MapDocument(ur"F:\arcgis\白云\景泰街道.mxd")中的路径提出来
mxd_fullpath = ur"F:\arcgis\白云\景泰街道.mxd"
mxd = arcpy.mapping.MapDocument(mxd_fullpath)
或者mxd文档中有其他插入对象,excel等也会导致无法运行arcpy.mapping
后可以正常运行。

2.上一期关于(arcpy运行图例项)里说有些函数无法使用路径的ur,后来修改(将路径放在:

mxdpathname = ur"F:\arcgis\白云"
mxd_fullpath = os.path.join(mxdpathname, u"景泰街道.mxd")
mxd = arcpy.mapping.MapDocument(mxd_fullpath)

后就成功

再然后又可以直接用ur:

mxd = arcpy.mapping.MapDocument(ur"F:\arcgis\白云\景泰街道.mxd")

神奇!

3.# "Legend Items"注意这里用英文,而不是样式管理器中显示的中文

arcpy.mapping.ListStyleItems("USER_STYLE", "Legend Items", u"图例项宋体25")[0]

4.关于图例项legend.adjustColumnCount()调整列数

lyrFile = arcpy.mapping.Layer(ur"F:\集聚区.lyr")
lyrFile1 = arcpy.mapping.Layer(ur"F:\地级.lyr")
arcpy.mapping.AddLayer(df, lyrFile, "BOTTOM")
arcpy.mapping.AddLayer(df, lyrFile1, "BOTTOM")

styleItem = arcpy.mapping.ListStyleItems("USER_STYLE", "Legend Items", u"图例项宋体25")[0]

lyrFile2 = arcpy.mapping.Layer(ur"F:\县级_按白云区界修改线.lyr")
lyrFile3 = arcpy.mapping.Layer(ur"F:\镇界最终R纠正84镇.lyr")
arcpy.mapping.AddLayer(df, lyrFile2, "BOTTOM")
arcpy.mapping.AddLayer(df, lyrFile3, "BOTTOM")

legend.adjustColumnCount(2)
lyrFile4 = arcpy.mapping.Layer(ur"F:\镇界包络矩形.lyr")
lyrFile5 = arcpy.mapping.Layer(ur"F:\JJQ2_Erase1_Id镇街.lyr")
arcpy.mapping.AddLayer(df, lyrFile4, "BOTTOM")
arcpy.mapping.AddLayer(df, lyrFile5, "BOTTOM")

 将位置"BOTTOM"改为"TOP"后:

 但:

lyrFile = arcpy.mapping.Layer(ur"F:\集聚区.lyr")
lyrFile1 = arcpy.mapping.Layer(ur"F:\地级.lyr")
arcpy.mapping.AddLayer(df, lyrFile, "TOP")
arcpy.mapping.AddLayer(df, lyrFile1, "TOP")

legend.adjustColumnCount(2)
lyrFile2 = arcpy.mapping.Layer(ur"F:\县级_按白云区界修改线.lyr")
lyrFile3 = arcpy.mapping.Layer(ur"F:\镇界最终R纠正84镇.lyr")
arcpy.mapping.AddLayer(df, lyrFile2, "TOP")
arcpy.mapping.AddLayer(df, lyrFile3, "TOP")

 发现写legend.adjustColumnCount(2)时,将已加的图例分为两列,后面再增加的就在第一列继续增加,如果分为3列,就在最后写legend.adjustColumnCount(3)

lyrFile = arcpy.mapping.Layer(ur"F:\集聚区.lyr")
lyrFile1 = arcpy.mapping.Layer(ur"F:\地级.lyr")
arcpy.mapping.AddLayer(df, lyrFile, "TOP")
arcpy.mapping.AddLayer(df, lyrFile1, "TOP")

lyrFile2 = arcpy.mapping.Layer(ur"F:\县级_按白云区界修改线.lyr")
lyrFile3 = arcpy.mapping.Layer(ur"F:\镇界最终R纠正84镇.lyr")
arcpy.mapping.AddLayer(df, lyrFile2, "TOP")
arcpy.mapping.AddLayer(df, lyrFile3, "TOP")

lyrFile4 = arcpy.mapping.Layer(ur"F:\镇界包络矩形.lyr")
lyrFile5 = arcpy.mapping.Layer(ur"F:\JJQ2_Erase1_Id镇街.lyr")
arcpy.mapping.AddLayer(df, lyrFile4, "TOP")
arcpy.mapping.AddLayer(df, lyrFile5, "TOP")
legend.adjustColumnCount(3)

 最后发现只能用legend.adjustColumnCount()调整列数,在arcmap中只能在插入图例时设置,插入后就无法改变列数。

最后另外发现插入2个图层组后,图例不能分为2列,只能分为3列,同理插入3个图层组只能分为2列!(可能是识别图层组的问题),针对图层组,慎用调整图例列,1个图层组有时可分两列图例,有时又不能。

5.只有arcpy.mapping.MapDocument和arcpy.mapping.Layer能直接使用路径作为参数,其他如arcpy.mapping.ListLayers和arcpy.mapping.ListDataFrames均需使用mxd或者lyr对象作为参数。


<think>嗯,用户需要的是关于在ArcGISPro的Python工具箱中使用ToolValidator类设置动态参数的详细指导。结合之前提供的引用内容,重点在引用[1]中提到了ToolValidator的作用,但具体用法需要展开。用户的问题很专业,可能是GIS开发人员或自动化工具创建者,需要实现参数联动(比如根据用户选择的字段类型,动态显示不同选项)。引用[1]只提到"可以用ToolValidator自定义行为",没给代码示例,而引用[2][3][4]的脚本案例都是工具实现而非参数验证。因此需要补充核心知识点:1.关键类是ToolValidator,需覆盖initializeParameters()和updateParameters()方法2.动态参数的典型场景包括:-字段下拉菜单根据输入要素动态更新(如几何类型过滤)-参数启用/禁用状态切换(如勾选复选框才显示高级选项)3.注意参数索引从0开始计数用户可能需要实际代码模板,所以考虑提供参数联动案例(主参数选点/线/面,次级参数显示对应字段类型)。同时要强调updateMessages()验证逻辑的必要性——因为引用[1]提到"参数属性控制输入与预期一致"。另外提醒测试细节:工具验证类仅在ArcGISPro打开工具箱时编译,修改后需要重启应用——很多开发者卡在这个里(引用[2]网友遇到的兼容性问题也佐证了环境特殊性)。最后需区分动态参数和独立脚本的参数校验差异(如引用[3]的txt转换工具就不需要ToolValidator),避免用户混淆使用场景。</think> 以下是关于在 ArcGIS Pro Python 工具箱中使用 `ToolValidator` 类设置动态参数的完整指南,结合引用文献和最佳实践整理: --- ### **一、ToolValidator 的核心作用** 在 Python 工具箱(`.pyt`)中,`ToolValidator` 类用于**动态控制参数行为**: - 参数值实时过滤(如字段类型限制) - 参数间联动更新(如根据输入图层动态更新字段列表) - 实时校验输入有效性(如范围检查) - 自定义提示消息(错误/警告) ▶︎ 引用文献指出:*"ToolValidator 类可进一步自定义工具行为"[^1]*。 --- ### **二、动态参数设置步骤** #### **1. 定义参数基础属性** 在工具箱的 `getParameterInfo` 方法中声明参数: ```python def getParameterInfo(self): param0 = arcpy.Parameter( name="input_layer", # 参数名称(脚本内部变量) displayName="输入要素", # 界面显示名称 datatype="GPFeatureLayer", # 数据类型(要素类、表等) parameterType="Required", # 参数类型:Required/Optional/Derived direction="Input" # 方向:Input/Output ) param1 = arcpy.Parameter( name="target_field", displayName="目标字段", datatype="Field", parameterType="Required", direction="Input" ) # 设置字段参数的依赖关系 param1.parameterDependencies = [param0.name] # 依赖于输入要素 return [param0, param1] ``` #### **2. 实现 ToolValidator 类** 在 `.pyt` 文件中创建子类: ```python import arcpy class ToolValidator: def __init__(self): self.params = arcpy.GetParameterInfo() def initializeParameters(self): # 初始化参数默认值(可选) self.params[1].enabled = False # 初始禁用字段参数 return def updateParameters(self): # 动态更新参数逻辑(核心) if self.params[0].value: # 当输入要素存在值时 self.params[1].enabled = True # 启用字段参数 # 动态过滤字段类型(仅显示文本型字段) if self.params[0].valueAsText: fields = arcpy.ListFields(self.params[0].valueAsText) text_fields = [f.name for f in fields if f.type == "String"] self.params[1].filter.list = text_fields # 设置下拉选项 return def updateMessages(self): # 参数值校验逻辑(例如检查字段值唯一性) if self.params[1].value: unique_check = arcpy.CheckFieldValueUniqueness( self.params[0].value, self.params[1].valueAsText ) if not unique_check: self.params[1].setErrorMessage("该字段值不唯一!") return ``` --- ### **三、关键动态功能详解** | **功能** | **实现方法** | **应用场景示例** | |------------------------|---------------------------------------|----------------------------------| | **参数联动显隐** | `param.enabled = True/False` | 根据输入要素类型显示/隐藏字段参数 | | **动态过滤选项** | `param.filter.list = ["A","B"]` | 仅显示文本字段或特定值域选项 | | **实时错误校验** | `setErrorMessage()` / `setWarningMessage()` | 检查字段值是否重复、范围是否越界 | | **参数依赖关系** | `param.parameterDependencies = [paramX]` | 确保参数按正确顺序执行(如先输入要素后选字段)| --- ### **四、调试与最佳实践** 1. **调试技巧**: - 使用 `arcpy.AddMessage()` 在 `updateParameters` 中输出中间值 - 重启 ArcGIS Pro 使 `.pyt` 修改生效(不会热重载) 2. **避指南**: - **空值处理**:检查 `value is None` 或 `valueAsText` 非空 - **性能优化**:避免在 `updateParameters` 中执行耗时操作(如遍历大型数据库) - **多参数联动**:使用 `parameterDependencies` 确保执行顺序 ▶︎ 引用文献验证:*"参数属性提供了对允许输入的详细控制,确保传递参数与预期一致"[^1]*。 --- ### **五、典型应用场景** 1. **动态字段列表** - 根据输入要素的几何类型(点/线/面)显示对应字段 - 引用案例:*要素类转TXT工具中需筛选坐标字段*[^3] 2. **条件参数控制** - 若用户选择"导出图片"参数,则显示"图片格式"下拉菜单 - 引用案例:*批量导图工具中控制输出格式参数*[^4] 3. **值域动态更新** - 根据省份选择动态加载该省下属城市列表 --- **相关问题** 1. 如何解决 `ToolValidator` 中 `ListFields` 函数返回空列表的问题? 2. 动态参数在模型构建器(ModelBuilder)中的兼容性如何? 3. 能否通过 Python 代码模拟用户在工具对话框中的参数交互? 4. 如何为动态参数添加自定义过滤条件(如排除系统字段)? [^1]: 第三章 ArcGIS Pro创建python脚本工具(五) [^3]: ArcGIS Pro脚本工具(16)——要素类转txt坐标文件 [^4]: ArcGIS Pro脚本工具(9)——配合地图系列批量导图
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值