Python和ArcGIS自动化制图完全指南(四):自动制图
前言:在完成了《指南》第二章和第三章后,获得了 PAGESIZE 字段的值,终于来到了最后的制图阶段。运用 Python 和 ArcPy 自动设置 mxd 模板定义查询语句、图框居中、图层样式更新、比例尺的校正、另存 mxd 和各种制图要素的摆放赋值等操作。 |
1.限制 MXD 模板
《指南》第三章做的努力在这里得到了显现,在第三章中,我们根据大小、面积等规则给每个制图单位分配了合适的 mxd 模板,其信息就储存在 PAGESIZE 字段中。
每一个制图模板对应的 PAGESIZE 的值就是为其指配的模板大小,或者说名字,毕竟模板用其大小来命名。
如下图所示,巴中市的 PAGESIZE 值是1180x900,表示给巴中市分配的制图模板就是1180x900.mxd。
可能细心的读者已经发现了,到目前为止,仅仅是更新了 MappingIndex 图层及其字段 PAGESIZE 。
但每一个 mxd 模板都是没有限制的,这些模板可以生成所有17个地级市的地图,这显然是不对的。
在这里我们需要对每一个 mxd 模板文件作出限制。
所以我们要对 mxd 模板中的 MappingIndex 图层中设置定义查询语句,从而限制模板,使模板仅生成大小适合的制图单位。
定义查询如下所示,三个模板对应不同的查询语句:
如果还是不太明白,读者可以手动去给 MappingIndex 图层设置定义查询语句,看看会发生什么。
自动设置查询语句的代码 C1 (…/main/part2.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
"""_______global_values_______"""
# 地址
mxd_template = "E:/doc/main/tempMXDS" # 模板文件位置
output_dir = "E:/doc/main/out" # 制图输出位置
gdb_path = "E:/doc/main/arcpy指南.gdb" # 数据库地址
# 重要常量
FIELD = "CITY" # 检索字段
MI = "MappingIndex" # 制图索引文件名称
SCALE = 200000 # 制图的比例尺
"""_______global_values_______"""
arcpy.env.overwriteOutput = True
arcpy.env.workspace = gdb_path
sba = arcpy.SelectLayerByAttribute_management
class MakeMXD(object):
def __init__(self, m, lyrs, idx, query_fielt, scale=None):
"""
:param m: {Object} MXD文件对象
:param lyrs: {List} 需要设置定义查询语句图层的名称列表
:param idx: {String} 索引图层名字;MappingIndex
:param query_fielt: {String} 定义查询使用的字段名;CITY
:param scale: {Int} 比例尺
"""
self.mxd = m
self.df = arcpy.mapping.ListDataFrames(self.mxd)[0]
self.lyrs = lyrs
self.idx = idx
self.field = query_fielt
self.scale = scale
# MappingIndex
self.mapidx = arcpy.mapping.ListLayers(self.mxd,self.idx)[0]
self.mapping_index_query()
self.make_mxd()
del self.mxd
def mapping_index_query(self): # ▶注释1◀
"""
给 MappingIndex 图层设置定义查询语句;
PAGESIZE = '1080x700'
:return:
"""
map_path = self.mxd.filePath
# ▶注释2◀
name = os.path.splitext(os.path.basename(map_path))[0]
definition_query = ["PAGESIZE"," = ","'",name,"'"]
self.size = name
# ▶注释3◀
self.mapidx.definitionQuery = "".join(definition_query)
▶注释1◀:
目前这里我们只需要关注方法 mapping_index_query,上面的初始化方法等拉通梳理一遍后再看。
mapping_index_query 方法用于对 MappingIndex 图层设置定义查询语句。
▶注释2◀:
获取当前模板文件的名称(不包括后缀),赋值给变量 name。
▶注释3◀:
“”.join(LIst) 用于拼接字符串,且比使用运算符”+“来拼接字符快。
2.遍历制图单位
对 mxd 模板文件进行限制处理后,就需要把与该模板匹配的制图单位导出为单独的 mxd 文件出来。
一个 mxd 模板通常对应了几个制图单位。
比如 1080x1300.mxd 这个模板对应着达州市、绵阳市、雅安市三个制图单位。
尽管在第一步中使用定义查询限定了 mxd 模板对应的制图单位,但是一个 mxd 模板通常对应了几个制图单位,比如 1080x1300.mxd 这个大小的模板对应着达州市、绵阳市、雅安市三个制图单位。
所以我们需要遍历 mxd 模板(大白话就是一个一个处理),将其每个对应的制图单位处理出来,而为了制作处理相应制图单位,凸出显示需要的信息、图层、标注等,还要隐藏不需要的其他制图单位的信息。
所以为了完成上述的功能。
会对图层设置定义查询语句以实现图层的显示和隐藏;
设置图层自动居中;
标题、标注的自动更细;
甚至是直接指定或者通过一定规则间接指定各种元素的摆放位置和显示;
…
2.1定义查询
首先,图层中设置定义查询语句的代码 C2 如下: