Python和ArcGIS自动化制图完全指南(三):分配模板
前言:在《指南》第二章中,我们制作了3种不同尺寸的 mxd 模板,就是为了适配不同的制图单位,比如适配自贡市的 mxd 模板就不适用于广元市(广元市面积大)。而如何让计算机给不同制图单位分配大小合适的模板就是本章需要解决的问题 。 |
文章目录
1.模板信息标准化
根据第二章制作的 mxd 模板文件的名字生成标准化的匹配信息,该信息可以辅助程序对每一个制图单位匹配大小合适的 mxd 模板。
为什么要将模板信息标准化?
因为程序无法知道你做的 mxd 模板的大小是多少,也不知道不同的模板对应的是哪个大小。
所以我们要将模板信息存进程序中,让程序知道有这么一个模板。
你可以在程序运行前输入每一个模板的名称及其对应的大小,但是这太麻烦了,如果有很多模板呢?如果你输入错误呢?
所以我们要让电脑自己知道模板的大小,这就需要我们严格按照我们第二章的规定:mxd 模板命名按 **宽x高.mxd ** 来。
比如:1080x700.mxd、1080x1300.mxd、1180x900.mxd(单位是毫米)。
程序会自动识别、收集宽度和高度数据,减少人工操作。
之后收集到的信息样式如下,它表示 pagesize1 这个英文字符表示大小1080和700;pagesize2 表示1080和1300;pagesize3 表示1180和900。
{
"pagesize1":(1080,700),
"pagesize2":(1080,1300),
"pagesize3":(1180,900)
}
Note: 有 Python 编程基础的读者看到这里就不会陌生啦,这里的匹配信息就是 Python中 的一种数据结构:字典。 |
根据输入文件夹中的模板名称,来生成上述标准匹配信息的代码 C1 (…/main/part1.py)如下:
# -*- coding:utf-8 -*-
# ----------------------------------------------------------
# Author: LiaoChenchen
# Created on: 2021/1/29 17:34
# ----------------------------------------------------------
from __future__ import absolute_import
from __future__ import unicode_literals
from __future__ import print_function
from __future__ import division
import arcpy
import os
from os.path import splitext as st
from os import listdir as ld
def size_creator(path):
"""
根据输入的模板文件地址生成标准格式的字典。
:param path: {String} mxd file path
:return:
"""
print("请确保模板文件夹中不存在无关文件!")
m_dict = {
}
counter = 1
for m_name in [st(x)[0] for x in ld(path) if ".mxd" or ".MXD" in x]:
width, height = m_name.split("x")
name = "pagesize{}".format(counter)
m_dict[name] = (int(width), int(height))
counter+=1
return m_dict
最后返回的 m_dict 就是标准化后的匹配信息,程序后面会用到。
2.最小边界几何
现在我们知道了模板的大小,接下来肯定是获取制图单位的大小。这样才能互相适配。
比如下图有17个地级市,也是17个制图单位,如何知道它们的宽边和长边呢?
那么可以使用最小边界几何工具来帮助我们确定。
最小边界几何——面积最小的情况下,能完全覆盖多边形的封闭面。如下图的所示:浅绿色框就是每一个制图单位的最小矩形边界几何。
生成最小边界几何可以直接计算出长边和短边,
通过调用 ArcPy 方法 arcpy.MinimumBoundingGeometry_management 可以计算生成最小边界几何图层,该图层自带两个字段,即 MBG_Width 和 MBG_Length 字段,前者表示短边,后者表示长边。
Note: 该工具位于 数据管理工具->要素->最小边界几何; 官方在线文档: https://desktop.arcgis.com/zh-cn/arcmap/10.3/tools/data-management-toolbox/minimum-bounding-geometry.htm |
使用 MappingIndex 图层生成最小边界几何及其相关操作的代码 C2 (…/main/part1.py)如下:
# -*- coding:utf-8 -*-
# ----------------------------------------------------------
# Author: LiaoChenchen
# Created on: 2021/1/29 17:34
# ----------------------------------------------------------
from __future__ import absolute_import
from __future__ import unicode_literals
from __future__ import print_function
from __future__ import division
import arcpy
import os
from os.path import splitext as st
from os import listdir as ld
"""_______global_values_______"""
# 地址
mxd_template = "tempMXDS" # 模板文件位置
output_dir = "out" # 制图输出位置
gdb_path = "arcpy指南.gdb" # 数据库地址
# 重要常量
FIELD = "CITY"