最近一直在折腾一件事:通过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 实战经验、技能包搭建、避坑指南
夜雨聆风