统计
  • 文章总数:855 篇
  • 评论总数:0 条
  • 分类总数:14 个
  • 最后更新:8月3日

Python和ArcGIS自动化制图完全指南

本文阅读 11 分钟
首页 ArcGIS 正文
前言:《Python和ArcGIS自动化制图完全指南》该系列包括前言共五章,内容多且详细。总集篇带大家快速梳理掌握各章节的要点,同时解答之前收集到的一些问题...




《前言篇》

查看前言文章详情。

前言主要介绍了自动化制图的原理和各种名词概念。
ArcPy是随 ArcGIS 软件安装的非开源的站点包,它使用Python 语言封装。是一个可以使用 Python 语言调用的工具包。
使用该工具包再配合 Python 不仅仅能扩展 ArcGIS 的应用场景的精细度、提高内业效率,还可以借此实现很多强大且实用的功能。

在这里可以先畅想一下可以通过这种方式实现哪些功能:
你完全可以实现制作某种大型项目的规范检验程序,从矢量、栅格、文档都可以实现客制化的检查需求;
你也完全可以实现更为复杂的流处理模型,完全替代 ArcGIS 自带的模型构建器,学好 Python 就够了;
你可以使用 Python 实现多进程处理我们的地理处理任务或者图片导出,提高效率;
你甚至可以拥抱深度学习,这也是 Python 的强项!;
当然你也可以把你的程序封装成一个 exe 文件,很多人无法封装 ArcPy,因为 ArcPy 不是开放的,确实,但是其中依然有着诀窍,关注我,以后我会慢慢告诉你;
最后,回到我们的主题,你也可以实现 ArcGIS 的完全自动化批量制图出图
使用 Python 代码通过一定的规则来对 mxd 模板文件及数据进行筛选和选择性的显示——对 mxd 文件标题、图层、图例、符号系统、查询语句、布局视图的位置以及各种要素进行更新和操控,将修改内容后的 mxd 模板另存为指定的名称,然后导出成地图。实现一个完整的自动化操作。

举个栗子,比如某个项目,其中有几十个功能分区,你需要给每个分区都制作一张地图。先完成一个分区的成果 ,其成果 mxd 将作为 mxd 模板。
然后 Python 不仅会对这个模板的数据进行修改更新,也会自动更新图例、修改文字描述、设置界面居中等。
最后将修改内容另存为按指定规则命名的 mxd 文档。一个接一个,直到将所有分区地图的 mxd 文件都制作出来,最后统一导出地图。



《第一篇 ArcPy工作流》

第一篇章详情。
该篇章带大家正式进入 ArcPy 的世界,哪怕是0基础的你也可以在不打开 ArcGIS 软件的情况下,使用 ArcPy 调用其最多1000多种工具并实现各种复杂或重复的工作流,同时具有很大的灵活度。
详细讲解如何调用 ArcPy 、用什么写、如何运行我们写的程序,这就是第一章的目的所在。

最后使用了一个简单的例子做展示。
每一个 ArcPy 函数、类、方法你都可以在和 ArcGIS 一同安装的帮助中找到示例和解释。


现在你有一个紧急的任务,你有很多个线矢量图层,①你需要把它们都转成面,②然后每个面矢量图层都要新建4个符合项目规范的字段。


我们直接写一个 ArcPy 工作流完成这个简单但是又非常繁琐的实际应用场景。用这例子做个小小的演示。
以下是展示代码:

# -*- coding:utf-8 -*-
# ---------------------------------------------------------------
# Author: LiaoChenchen
# Created on: 2021/1/17 14:53
# arcpy自动化制图完全指南(一):使用arcpy完成工作流

import arcpy
import os

class InitPath(object):
"""初始化工作空间,创建gdb数据库(如果没有的话)"""
def __new__(cls, *args, **kwargs):
if not hasattr(cls, "_instance"):
# if not cls._instance:
cls._instance = object.__new__(cls)
return cls._instance
def __init__(self):
"""_________create folder_________"""
scratch_path = "D:\doc\Scratch" #<<注释1>>
try:
if not os.path.isdir(scratch_path):
os.makedirs(scratch_path)
except:
scratch_path = "E:\doc\Scratch" #<<注释2>>
if not os.path.isdir(scratch_path):
os.makedirs(scratch_path)

"""_________create folder_________"""
# make gdb
scratch_gdb = os.path.join(scratch_path, "Scratch.gdb")
if not arcpy.Exists(scratch_gdb):
arcpy.CreateFileGDB_management(scratch_path, "Scratch")
arcpy.env.workspace = scratch_path
arcpy.env.overwriteOutput = True

self.scratch_path = scratch_path
self.scratch_gdb = scratch_gdb

def __iter__(self):
return (i for i in (self.scratch_path, self.scratch_gdb))


"""______run code______"""

folder_path, gdb_path = InitPath()
arcpy.env.workspace = gdb_path #<<注释3>>
arcpy.env.overwriteOutput = True #<<注释4>>

line = "data/line_data.shp"
# 线要素转面,生成的面矢量名称为 polygon
arcpy.FeatureToPolygon_management(line, "polygon")

# 给 polygon 图层添加字段
for name in ["CJQYMC", "CJQYDM", "XJQYMC", "XJQYDM"]:
arcpy.AddField_management(
"polygon", name, "TEXT", field_length=100)


执行该代码即可实现上述功能流程。代码详细和具体执行说明见第一篇章。



《第二篇 模板制作》

第二篇章详情。
第一篇我们了解了如何在电脑上写 ArcPy 程序以及如何运行代码,接下来就完完全全进入重点了。
从文章一开头,我们知道,该系统的三驾马车是 mxd 模板、数据库、Python代码。
而其中的 mxd 模板是我们的地基,是基础。

现在我们要再举了一个例子,作为我们整篇指南的示例:
“...以地级市为单位,对中国某省份的地级市制作铁路、道路分布的专题图...”

所以,我们需要制作一个系统来批量制图出图,第一步就是制作模板。
当然这只是简单的展示,该系统在部分农业、林业等需要制作上百张专题图的项目上才能发挥最大威力!

首先我们的原始数据如下:


  • buidings

    用于显示建筑物


  • landuse

    用于显示部分的土地利用情况


  • natural

    用于显示自然地物


  • railways

    用于显示铁路,线要素


  • roads

    用于显示道路,线要素


  • waterways

    用于显示水系,线要素(不会使用到水系)


  • 市级区域&市界

    市界是由市级区域数据转线要素得到。


对原始数据进行矢量处理、字段处理,然后事先好制作好满足规范的图例、样式。你也可以通过 Arcpy 中 UpdateLayer 方法从模板外部指定样式。
然后再制作一个索引图层 MappingIndex,该图层是我们后续按图索骥的关键之一。

最后根据不同图形的大小制作了三个不同尺寸的 mxd 模板(这三种模板的尺寸必须总有一个能满足我们地级市的范围大小):
1080x700(完整页面大小为1100x900)
1080x1300(完整页面大小为1100x1500)
1180x900(完整页面大小为1200x1100)
模板名字分别为:1080x700.mxd、1080x1300.mxd、1180x900.mxd,其样式如下:


Note:mxd 模板文件的命名方法必须按照 宽x高 的方式来命名,因为程序是会读取模板文件的名称。

第二篇章详情。



《第三篇 分配模板》

第三篇章详情。
模板制作好之后肯定是分配模板啦。
第二章中,我们制作了3种不同尺寸的 mxd 模板,就是为了适配不同的制图单位,比如适配自贡市的 mxd 模板就不适用于广元市(广元市面积大)。而如何让计算机给不同制图单位分配大小合适的模板就是本章需要解决的问题 。
分配的关键是数据,每个制图单位(地级市)的宽和高到底是多少,只有知道了这个数据才能和模板相匹配,才能两两“牵手”成功。

我们也是通过调用 ArcPy 中的方法将宽和高计算出来的。


我们是先计算出长边和短边,然后再去判断长边是高还是短边是高,最终确认了每个制图单位(地级市)的尺寸。


既然知道了尺寸,计算机将其与模板尺寸一对比,一下子结果出来了。所以就非常简单的解决了模板分配问题。
代码量较大,详情查看第三篇章原文。



《第四篇 自动制图》

第四篇章原文。
成功完成了模板制作、模板分配,接下来就是最后的压轴戏——自动制图。
运用 Python 和 ArcPy 自动设置 mxd 模板定义查询语句、图框居中、图层样式更新、比例尺的校正、另存 mxd 和各种制图要素的摆放赋值等操作完成自动制图。

lyr.definitionQuery 用于设置查询语句;
dataframe.extent 用于设置图像居中;
dataframe.scale 用于设置比例尺;
lblClass.SQLQuery 用于设置图层标注;
TextElementMapsurroundElementLegendElement 等可以用于设置各种元素,修改文本元素、指北针、图例等,你可以直接指定他们的位置和尺寸。

索引图层(MappingIndex)的帮助下,完成自动化设置,然后另存保存成功。
最后导出图片就行,这里我是使用的多进程来导出图片,具体的操作看这篇多进程出图的教学文章。

然后就完成了整个自动化制图出图系统,后续根据其他项目的需要可以灵活改动。
如果你比较熟练的话可以把这个系统封装成 Arctoolbox 工具箱哦,也是很方便的,如果懂封装成 exe 可执行文件就更好了。
本文来自投稿,不代表本站立场,如若转载,请注明出处:
工企专利数据ArcGIS PRO制图
« 上一篇 03-12
ArcGIS二次开发(二):超详细文件存取指南 有这一篇就够了
下一篇 » 03-12

作者信息

作者有点忙,还没写简介
TA的最新作品
    请设置要调用的作者ID

动态快讯

    请配置好页面缩略名选项

热门文章

标签TAG