ArcGIS 结合 Python 实现地图自动化批量制图导图,非常方便,可以快速帮助用户输出大量的地图,同传统的数据驱动制图相比,使用 Python 的自定义程度更高、可以根据规则匹配模板大小,但缺点是门槛较高,GIS荟公众号在2021年就分享了这个系列教程(详情点击上面蓝字)。 而本期分享的个人经验,就是在 Python 结合 ArcGIS 批量制图出图的基础上,在原代码的基础上修改、适配,最后批量制作宗地图。 最后附下载链接哦! 1.效果展示成果展示(宗地号的地名都修改过)。 没有显示界址点,同人工制作的效果相比,必定是不如的,但胜在稳定、自动,一次制作好模板后,可以运行导出多个地方的宗地图。
2.创建MXD模板ArcPy(ArcGIS 的 Python 包)不支持创建 mxd,首先手动创建 MXD 模板,后续程序代码会以模板为基本蓝图,进行自动匹配大小、修改文本、地理处理等制图导图工作。 打开 ArcMap,创建 A4 大小的布局,并添加标题和各种必要的文本,并在需要自动更改的文本位置处使用特定的文本占用,便于程序识别和修改。 打开模板,其中有这样几个图层,各自的作用如下: 2.1MappingIndex图层该图层是作为整个自动出图代码的索引图层,该图层通常复制于宗地图层,通过该图层来遍历每一个宗地,并从属性表中提取图幅号、宗地面积等信息并更新到布局界面。 图层不可见。 2.2QSDW宗地层该图层用于展示当前宗地的范围和宗地信息标注(红色),程序会自动控制显示。 2.3QSDW宗地层_line宗地图的边界处,需要要留一根线出来,并且仅仅是一小截线段,像一个小刺一样(下图橙色框选)。 就像这样。虽然我也不知道为什么要留一根小刺出来,但,这是客户要求的呀。 所以这个图层就是事先使用 QSDW宗地层 图层转换而来的线矢量图层,后续通过程序代码来限制长度,裁剪去无用部分,仅留一根小刺。 2.4QSDW宗地层_label该图层的源图层就是 QSDW宗地层。 用于展示非中心宗地图的信息标注(黑色),即展示当前宗地的相邻宗地信息,仅仅是相邻的几个哦,所以也需要程序代码进行控制,仅保留宗地图相邻的部分。 2.5DLTB_标识后使用QSDW宗地层图层标识(分析工具->叠加->标识)三调的 DLTB 图层,可以得到DLTB_标识后图层。 该图层用于展示当前宗地内的地类情况。标识的目的是为了在空间和属性方面得到宗地图层的宗地号字段,便于程序代码控制。 3.创建多个模板不同的宗地图的尺寸是不一致的,所以需要制作多个不同大小的 MXD 模板来适配不同尺寸的宗地。不同于以往的批量制图,宗地图的页面大小却是固定的,比如A4尺寸,所以为了适配不同的宗地大小,可以通过调整比例尺来实现。 即每一个模板都是A4大小,唯一不同的是比例尺不一。实际上,只需要一个模板即可,用代码来控制比例大小,但由于是在原有基础上修改而来,所以继续沿用多模板的匹配机制,如果你愿意研究,可以尝试在代码中解决。 每个模板使用各自能展示的宽x长(单位米)来表示,通过比例尺和 A4 大小可以算出。 一共创建了从 1:100 到 1:30000 共10个模板。 至于如何衡量需要创建多少个?以及多大? 看情况使用即可,一般5、6个就够了,除非不同宗地之间的大小相差太大了,毕竟你也要把最大的宗地包进去不是。 4.代码修改宗地图自动制图出图脚本文件是在 ArcGIS 自动制图的基础上修改而来的,需要详细的注释说明可以查看这里。 4.1露出“小刺”上面提到的QSDW宗地层_line和QSDW宗地层_label图层都有一定的特殊要求,需要露出小刺,仅保留与中间宗地相邻的部分宗地的信息标注。 所以如何实现呢?
实现该功能的代码片段如下:
主要使用了 buffer 缓冲工具和 clip 裁剪工具。 4.2模板匹配代码的修改由于现在的批量出图的纸张大小是不变的,仅通过改变比例尺来控制显示的范围,所以模板匹配的代码也需要修改。 由于我们使用显示大小作为模板的名称,且单位是米,所以可以直接和宗地图的最小边界几何进行对比。 筛选出满足模板宽、高都大于宗地图最小边界几何的模板,然后按大小排序,选择最小的模板,这样就能满足整个宗地图的显示,地图也不会显得过于空旷。 4.3添加了批量地图导出的代码在源代码最后添加了地图导出功能,在所有 MXD 文件导出完成后,会自动遍历所有 MXD 文件并导出为 300 DPI 的 JPG 图片。 5.演示文件和代码下载QSDW宗地层、QSDW宗地层_line、QSDW宗地层_label图层中的宗地号、权利人、所在图幅字段均使用字符随机值替换修改,空间属性偏移脱密。 DLTB_标识后图层进行了偏移,地类代码全部设置成了1,其他字段删除,所以做好的地类符号不再显示。你可以在你想要导出的区域添加正确的 DLTB 图层并设置符号,不过不要忘了标识这一步骤。 5.1使用视频演示5.2下载链接这玩意的肯定是项目上需要的啦,所以要付费获取哦,500行代码写的还是费劲,点击这里可以获取下载,代码拿到后自己随便研究魔改哦。 如果是个人学习使用,这里有另外一个例子,提供了全套的代码和演示数据。 关注我,每日赞赞! |
|