乐于分享
好东西不私藏

AI 调用 pagx 模板批量出图,掉坑里了,还没爬出来,先总结一下掉坑里的收获

AI 调用 pagx 模板批量出图,掉坑里了,还没爬出来,先总结一下掉坑里的收获

最近一直在折腾一件事:通过AI利用 arcpy 调用 ArcGIS Pro 的 .pagx 模板,实现专题地图的批量生成。

理想很美好——输入一个县名,自动出图。现实很骨感——地图框范围不对、符号系统无法设置、图例不更新……坑一个接一个,到现在还没完全爬出来。

不过折腾的过程中,倒是有不少意外收获。这篇不是教程,是一个 GISer 在坑里写的回头看。

一、我在折腾什么

事情的起因很简单:上一期不是出了 936 张土地利用分类数据吗,想给每个县生成一张专题地图。

数据已经有了,裁剪也做完了,就差最后一步——出图。手动做的话,一个县要 10-15 分钟,100 个县就得 20 多个小时。这显然不能忍。

于是我开始研究怎么通过 AI + arcpy 自动化这个流程。

二、踩过的坑(截至目前)

坑 1:地图框范围不对

现象:脚本跑完了,导出的图里看不到目标区域,要么显示全省,要么空白。

原因addDataFromPath 只是把图层加进去了,但地图框(Map Frame)的范围还是模板的默认设置。

解决:加上 map_frame.zoomToAllLayers() 或 map_frame.zoomToLayer(raster_layer),让地图框自动缩放到数据范围。

状态:✅ 已解决

坑 2:符号系统无法自动设置

现象:栅格图层加进去了,但显示的是默认的灰度渲染,不是想要的分类色彩。

原因:arcpy 对栅格图层的符号系统支持很有限,UniqueValueRenderer 在栅格上不好使。

尝试

- 方法 1:用 ApplySymbologyFromLayer —— 需要预先保存一个图层文件(.lyrx),但模板和数据不匹配

- 方法 2:用 updateRenderer('UniqueValueRenderer') —— 对栅格无效

- 方法 3:用 CIM(Cartographic Information Model)—— 太复杂,还没搞懂

状态:⏳ 未解决,目前只能在 ArcGIS Pro 里手动设置

坑 3:图例不自动更新

现象:符号系统手动调好了,但图例还是模板的旧内容。

原因:图例元素(Legend Element)不会自动同步地图中的图层变化,需要手动刷新或重建。

尝试

- 用 legend.sync() —— 没有这个方法

- 用 legend.title = "xxx" —— 只能改标题,不能改内容

- 删除旧图例、新建图例 —— 布局会乱

状态:⏳ 未解决

坑 4:批量生成的性能问题

现象:跑 10 个县没问题,跑 100 个县的时候内存爆了。

原因:ArcGIS Pro 的 Python 窗口不会自动释放内存,每个循环都在累加。

尝试

- 每跑完一个县 del raster_layer —— 效果有限

- 分批运行,每 20 个县重启一次 Pro —— 麻烦但有效

状态:⏳ 部分解决

三、意外收获

虽然批量出图还没完全跑通,但折腾的过程中,倒是有不少意外收获。

1. 对 arcpy 的理解深了一层

以前用 arcpy,就是调调工具、跑跑批处理。这次为了搞定制图,把 arcpy.mp 模块的文档翻了个遍,才发现:

ArcGISProject 可以操作 .aprx 和 .pagx

MapFrame 和 Map 是两个东西,前者管显示范围,后者管图层

Layout 里的元素(Element)分很多种,每种都有自己的属性和方法

这些细节,不踩坑根本学不到。

2. 模板化思维

以前做图,都是从头开始:新建项目、加数据、调符号、调布局……

这次为了做批量生成,被迫把"重复的部分"抽出来做成模板。结果发现:一旦有了模板,效率提升是指数级的

现在我的制图流程变成:

1. 准备好模板(.pagx),里面放好地图框、图例、比例尺、指北针

2. 脚本替换数据和标题

3. 手动调一下符号(暂时还自动化不了)

4. 导出

虽然不能 100% 自动化,但已经比从头开始做快 了好多。

3. 对 AI 编程工具的新认识

这次写脚本,大量用了 Cursor 和 WorkBuddy 的 AI 辅助。

AI 擅长的地方

- 快速生成 arcpy 代码框架

- 解释 API 的用法和参数

- 把报错信息翻译成中文

AI 不擅长的地方

- 解决 ArcGIS Pro 特有的坑(比如符号系统限制)

- 理解"模板"和"实例"的区别

- 处理路径、权限、环境配置这类脏活

- 对 arcgis 这类商业软件很畏惧

结论:AI 能帮我写 80% 的代码,但最后的 20% 调试,还得靠自己。

4. 沉淀了一套制图规范

为了做模板,被迫把以前随意的制图习惯标准化了:

- 颜色方案:耕地黄、林地绿、草地浅绿、水域蓝、建设用地红、未利用地灰

- 字体规范:标题 18pt 黑体,注记 10pt 宋体

- 布局比例:地图框占 70%,图例占 15%,标题和比例尺占 15%

- 输出设置:300dpi、PNG、带世界文件

这些规范以前都在脑子里,现在写进文档了,以后换项目也能复用。

四、还没解决的问题

写这篇的时候,批量出图还没完全跑通。剩下的硬骨头:

1. 栅格符号系统的自动化 —— 可能需要研究 CIM,或者换个思路用栅格属性表

2. 图例的动态更新 —— 可能需要删除重建,但布局会乱

3. 批量运行的稳定性 —— 内存泄漏问题需要更优雅的解决方案

目前的妥协方案

- 脚本负责:加载数据、设置范围、更新标题、导出

- 手动负责:设置符号、刷新图例

虽然不能"一键出图",但"半自动"也比纯手动强多了。

五、给后来者的建议

如果你也想用 arcpy 做批量制图,我的建议是:

1. 先搞清楚模板的结构

用 layout.listElements() 看看模板里有什么元素,每个元素的类型和名字是什么。这是后续操作的基础。

2. 分步骤调试

不要一上来就写完整的批量脚本。先写一个能加载单张图的,再写能设置范围的,再写能导出图片的。每一步都验证通过,再往下走。

3. 接受"半自动"

arcpy 的制图 API 有很多限制,不要追求 100% 自动化。把能自动化的部分(数据加载、范围设置、导出)交给脚本,把需要审美的部分(符号、配色、布局微调)留给自己。

4. 做好版本管理

模板文件(.pagx)很容易被改坏,建议用 Git 或者至少留个备份。我在这个坑上浪费过 2 个小时。

写在最后

这篇文章在写的时候,我还没爬出坑

有时候觉得,技术博客有两种:一种是"我成功了,教你做",一种是"我正在踩坑,记录一下"。这篇属于后者。

后者的价值在于真实。 不是每个问题都有完美解决方案,不是每个项目都能 100% 自动化。把这些不完美的过程写出来,反而能帮助更多人避开同样的坑。

等我真正爬出这个坑,可能会写一篇《AI 批量制图完整攻略》。但在那之前,这篇阶段性的复盘,就是我目前最真实的收获。

如果你也在折腾 arcpy 制图,欢迎在评论区留言交流。坑大家一起踩,路大家一起走。

*本文首发于公众号「GIS与AI」。*

*关注后私信「掉坑总结」,可获取文中提到的 1980-2020年1km分辨率8期中国土地利用现状遥感监测数据。*

扫码关注公众号

深度了解GIS+AI 实战经验、技能包搭建、避坑指南