Python和ArcGIS自动化制图完全指南(四):自动制图

本指南介绍如何使用Python和ArcGIS进行自动化制图,包括限制MXD模板,设置定义查询以限制模板只生成合适大小的制图单位,遍历模板并导出为单独的mxd文件,调整图层居中、比例尺、文本和标注。通过代码示例详细展示了自动化过程。
摘要由CSDN通过智能技术生成

Python和ArcGIS自动化制图完全指南(四):自动制图

前言:在完成了《指南》第二章和第三章后,获得了 PAGESIZE 字段的值,终于来到了最后的制图阶段。运用 Python 和 ArcPy 自动设置 mxd 模板定义查询语句、图框居中、图层样式更新、比例尺的校正、另存 mxd 和各种制图要素的摆放赋值等操作。

1.限制 MXD 模板

1

《指南》第三章做的努力在这里得到了显现,在第三章中,我们根据大小、面积等规则给每个制图单位分配了合适的 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.遍历制图单位

3

对 mxd 模板文件进行限制处理后,就需要把与该模板匹配的制图单位导出为单独的 mxd 文件出来。

一个 mxd 模板通常对应了几个制图单位。

比如 1080x1300.mxd 这个模板对应着达州市、绵阳市、雅安市三个制图单位。

尽管在第一步中使用定义查询限定了 mxd 模板对应的制图单位,但是一个 mxd 模板通常对应了几个制图单位,比如 1080x1300.mxd 这个大小的模板对应着达州市、绵阳市、雅安市三个制图单位。

所以我们需要遍历 mxd 模板(大白话就是一个一个处理),将其每个对应的制图单位处理出来,而为了制作处理相应制图单位,凸出显示需要的信息、图层、标注等,还要隐藏不需要的其他制图单位的信息。

所以为了完成上述的功能。

会对图层设置定义查询语句以实现图层的显示和隐藏;

设置图层自动居中;

标题、标注的自动更细;

甚至是直接指定或者通过一定规则间接指定各种元素的摆放位置和显示;



2.1定义查询

首先,图层中设置定义查询语句的代码 C2 如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值