Python 做 GIS 二次开发与自定义工具箱

Python
Dr.GIS
wowwwai GIS研习社 · 工具流程与项目排障

Python进行GIS二次开发,核心做法是用 ArcPy 把重复分析流程封装成自定义地理处理工具:要么写成脚本工具挂进 .atbx 工具箱,要么直接做成独立的 Python 工具箱(.pyt)。这些工具在目录窗格、ModelBuilder、Python 窗口里都能用,运行时会继承当前工程的环境设置。开源路线则用 PyQGIS 往 Processing 工具箱加算法。下文按选型、创建步骤、环境与排错说明怎么落地。

用 Python 封装 GIS 工具箱的工作示意

脚本工具和 Python 工具箱该怎么选

做 Python GIS 开发时,先想清楚工具要给谁用、逻辑有多复杂,再选载体。

  • 脚本工具:现有 .py 脚本已经能跑通,只想加参数界面、写进工具箱供同事点选。放在 .atbx(ArcGIS Pro 3.0 起推荐,JSON 结构,兼容性和稳定性更好)或旧版 .tbx 里即可。适合流程固定、参数不多的场景。
  • Python 工具箱(.pyt):需要动态参数校验、多工具共用逻辑、按许可或数据情况改界面时用。整个工具箱就是一个 .pyt 文件,里面定义 Toolbox 类和若干 Tool 类,外观和系统工具箱一致。
  • 和 Web GIS 的分工:本地地理处理、地图自动化、读写要素类用 ArcPy;Portal / Online 上的内容、要素服务、Notebook 协作用 ArcGIS API for Python。两者都随 ArcGIS Pro 提供,可对照官方说明 ArcPy 与 ArcGIS API for Python 的定位差异。

选型建议:个人或小组内部批处理,优先脚本工具,上手快;要做成可分发的模块、参数逻辑较绕,直接上 .pyt。

创建 .pyt 自定义工具箱的步骤

目标:在工程里出现一个可双击运行的工具,参数能校验,消息能写进地理处理历史。

  1. 在目录窗格对目标文件夹右键 → 新建 → Python 工具箱,得到 .pyt 文件;初始模板里已有 Toolbox 类和 Tool 类存根。
  2. 编辑 Toolbox 类:填写 label(显示名)、alias(别名,脚本里按 alias.工具名调用时必填)、tools 列表。
  3. 在每个 Tool 类里实现:getParameterInfo(参数类型、方向、过滤器)、isLicensed(许可检查)、updateParameters / updateMessages(联动与校验)、execute(真正干活的 ArcPy 代码)。
  4. 在 execute 里用 parameters[i].valueAsText 取参,用 arcpy.AddMessage / AddWarning / AddError 写消息;需要环境变量时读 arcpy.env。
  5. 保存后回到 Pro,刷新工具箱,双击工具做验收:参数是否必填、输出路径是否覆盖、坐标系是否符合预期。

从其他脚本调用时,先 arcpy.AddToolbox(r”路径\xxx.pyt”),再按 别名.工具名 调用。导入方式见官方函数说明 AddToolbox 用法。分发成 Python 包时,可按官方模块结构(含 esri/toolboxes 等)打包,让工具出现在地理处理窗格并支持本地化帮助。

把现有脚本做成脚本工具要注意什么

若手里已有能独立跑的 .py,不必重写成 .pyt,按下面做即可变成可复用工具。

  1. 新建 Toolbox(优先 .atbx),右键 → 新建 → 脚本,指向你的 .py。
  2. 在向导里配置参数:名称、数据类型(要素图层、栅格、字符串、工作空间等)、方向(输入/输出)、是否多值、默认值与过滤器。
  3. 改脚本:用 arcpy.GetParameterAsText(0) 等按序号取参,不要再写死路径;输出路径交给参数或环境变量控制。
  4. 补工具说明、参数说明和示例,方便别人在地理处理窗格里直接看懂。
  5. 验收:在 ModelBuilder 里拖一下、在 Python 窗口再调一次,确认环境设置(如 overwriteOutput、输出坐标系)生效。

参数配置细节可参考 Esri 文档中的 添加脚本工具说明。脚本工具和 .pyt 可以放在同一工程里混用,按任务复杂度分工即可。

ArcGIS Pro 官方文档中添加脚本工具的说明页面
ArcGIS Pro 官方文档中添加脚本工具的说明页面(截图来源:pro.arcgis.com)

环境、版本与硬件怎么对齐

截至 2026 年 11 月,ArcGIS Pro 当前主线是 3.7(约 2026 年 5 月发布,后续有 3.7.1 等补丁;3.8 计划同年 11 月)。默认 conda 环境 arcgispro-py3 使用 Python 3.13.13。从 ArcMap 迁过来时,注意 Python 2 → 3,以及 arcpy.mapping 已改为 arcpy.mp。

项目 最低 / 推荐(Pro 3.7)
操作系统 Windows 11 或 Windows Server 2019/2022/2025(需 Desktop Experience);不再支持 Windows 10
运行时 .NET Desktop Runtime 10.0.0+(x64);Edge WebView2 132+
CPU / 内存 最低 2 核 / 8 GB;推荐 4 核以上 / 32 GB
存储 / GPU 建议 SSD,空闲空间充足;独立 GPU 更稳,深度学习另需 CUDA 与足够显存
许可 Named User 或 Single Use;Concurrent Use 已弃用
  • 默认环境只读,装第三方库请先克隆环境,再用 Package Manager 或 conda 添加,避免把 arcgispro-py3 弄坏。
  • 独立跑脚本可用 propy / 激活 proenv;工程内优先用地理处理窗格,便于写历史记录。
  • 开源替代:QGIS(近期 LR 约 4.2.x、LTR 约 3.44.x,以官网为准)用 PyQGIS 写 Processing 脚本或插件,同样能进工具箱,适合无 Esri 许可的团队。

常见问题

.pyt 第二次运行就崩溃怎么办?

常见原因是在模块顶层 import 了与 Pro 冲突的第三方库(如某些 geopandas / pyogrio 组合)。把 import 挪进 execute(),或用子进程隔离重计算逻辑,尽量少动默认环境里的包。

升级 Pro 后工具箱语法检查失败或路径错乱?

先检查文件行尾是否为 Windows CRLF(从 Linux 拷过来时容易变成 LF)。嵌入 .atbx 的脚本在 3.2 之后 __file__ 行为有变化,取目录时可用更稳妥的路径拆分写法,并以当前工程实际路径做一次验收。

脚本里调不到自定义工具?

确认 Toolbox 的 alias 已设置,且已执行 AddToolbox;调用名是「别名.工具名」,大小写与工具类 label 对应关系要核对。参数方向和数据类型不一致时,也会表现为“找不到工具”或运行即失败。

没有 ArcGIS 许可还能做同类二次开发吗?

可以。用 QGIS + PyQGIS 写 Processing 算法或插件,逻辑封装方式类似,只是 API 与界面入口不同;数据读写也可搭配 GDAL/OGR。选型时按数据格式、团队许可和发布目标决定,不必强行对齐某一家产品。

总结:Python GIS 二次开发落地,就是把可重复的地理处理做成脚本工具或 .pyt,让参数、消息和环境设置标准化。建议先从一条已经跑通的分析脚本做成 .atbx 脚本工具验证流程,再按需要升级到 .pyt 或打包分发;环境一律用克隆 conda,第三方库放进 execute,升级后先做参数与路径验收再投入生产。