分享

使用 ArcGIS 自动批量制作宗地图,进来就能学会!

 GIS荟 2023-03-28 发布于四川

前言:使用 ArcGIS 内置的 Python 包 ArcPy,实现宗地图的自动化批量制图导图,包教包会!提供一整套演示数据。

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宗地层_lineQSDW宗地层_label图层都有一定的特殊要求,需要露出小刺,仅保留与中间宗地相邻的部分宗地的信息标注。

所以如何实现呢?

  • 每当我们要对一个宗地进行处理的时候,对它设置一个向外扩大的缓冲面;

  • 使用这个缓冲面裁剪QSDW宗地层_line、以及用于相邻宗地标注的QSDW宗地层_label;

实现该功能的代码片段如下:

……
# 针对宗地图适配的图层处理操作:
#     使用QSDW面图层(每个地图中间显示的主要区域)做一个外部的缓冲 10米;
#     将缓冲区内的所有QSDW图层(面转线版本)裁剪下来;
#     再使用缓冲区裁剪一个QSDW图层(原始面版本)用于标注;
def buffer(self, value):
    """
    :param value: 每个图层的名称,用于给裁剪下来的线命名
    :return:
    """
    # 延长距离 缓冲区距离
    distans = int(self.df.scale)/300 #7000/100=70
    pprint("缓冲距离:{}米".format(distans))
    _buffrt_name = os.path.join(procedure_data, "buffer") # 默认覆盖
    if arcpy.Exists(_buffrt_name):
        arcpy.Delete_management(_buffrt_name)
    arcpy.analysis.Buffer(
        in_features = arcpy.mapping.ListLayers(self.mxd, self.lyrs[0])[0],
         out_feature_class=_buffrt_name,
         buffer_distance_or_field="{} Meters".format(str(distans)),
          line_side="OUTSIDE_ONLY")
    # 生成缓冲区内的线
    _line_name = "L{}".format(value)
    # 默认不覆盖
    _clipedline_name = os.path.join(procedure_data, _line_name)
    # _clipedline_name = os.path.join(procedure_data, "v") # 默认不覆盖
    # 使用原始 gdb 里的QSDW宗地层_line数据,而不是mxd中的图层
    arcpy.analysis.Clip("QSDW宗地层_line", _buffrt_name,
                        _clipedline_name)
    lyr = arcpy.mapping.ListLayers(self.mxd, "QSDW宗地层_line")[0]
    lyr.replaceDataSource(os.path.abspath(gdb_path),
                          "FILEGDB_WORKSPACE", _line_name)
    
    # 生成缓冲区内的面,不显示,仅作为标注
    _polygon_name = "P{}".format(value)
    _clipedPolygon_name = os.path.join(procedure_data,
                                       _polygon_name) # 默认不覆盖
    arcpy.analysis.Clip("QSDW宗地层",
                        _buffrt_name, _clipedPolygon_name)
    lyr = arcpy.mapping.ListLayers(self.mxd, "QSDW宗地层_label")[0]
    lyr.replaceDataSource(os.path.abspath(gdb_path),
                          "FILEGDB_WORKSPACE", _polygon_name)
    arcpy.Delete_management(_buffrt_name)
    ……

主要使用了 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行代码写的还是费劲,点击这里可以获取下载,代码拿到后自己随便研究魔改哦。

如果是个人学习使用,这里有另外一个例子,提供了全套的代码和演示数据。

荟GIS精粹,关注公众号:GIS荟

关注我,每日赞赞!


GIS荟制图工具箱(点击图案获取)米奇妙妙屋,快来wan!

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多