Python和ArcGIS自动化制图完全指南(一):使用ArcPy完成工作流 v3
前言:哪怕是0基础的你也可以在不打开 ArcGIS 软件的情况下,使用 ArcPy 调用其最多1000多种工具并实现各种复杂或重复的工作流,同时具有很大的灵活度。使用了一个简单的例子做最后的展示。1. 写给0基础的读者
这里的内容主要是介绍用什么东西写这个 ArcPy 工作流代码、怎么运行等相关基础内容。有基础读者的可以跳过。1.1什么是 PythonPython 是一门面向对象的编程语言。1.2什么是 ArcPy最开始 ArcGIS 10 中引入了 ArcPy,这是一个 Python 站点包,其中包含了各种方法,可以使用 Python 语言进行调用。比如 ArcGIS 空间分析中的擦除操作,在 ArcPy 中就有正好对应的方法。ArcPy 中的类、方法可以简单分为三种:第一种是针对 mxd、lyr等各种文件实体;另一种是空间处理、检索、数据相关;最后一种是 ArcGIS 中上千种工具的的 Python 接口。1.3用什么写工作流IDLE:安装 ArcGIS 时会自动安装一整套 Python 工具,其中就有我们编写代码的工具,叫 IDLE。如图所示:
1.4如何运行打开 IDLE 编写简单代码并运行代码的视频如下: Note: 有两点需要注意一下①第一行请写 # -*- coding: utf-8 -*- ,就如视频中那样;②使用 IDLE 保存文件时,自己需要填写后缀 .py。2. 编写工作流代码
2.1流程分析我们使用一个简单的例子来讲解如何编写工作流代码:使用 ArcPy 实现一个简单的工作流程:把线矢量转换成面矢量然后给面矢量添加4个新字段。
直接使用 ArcGIS 来做这件事情是比较繁琐的,尽管一共就两个步骤,但是存在着重复操作,耗费时间。使用 ArcPy 可以快速的解决,如果是一些更加繁琐,重复性和分析性越多的工作流程,使用 ArcPy 的效果会更好。2.2代码示例讲解和展示流程代码以及各部分源代码的作用。配置工作空间设置一个文件默认的保存路径。在这里我们可以使用 Geodatabase,即GDB,ArcGIS 内置的地理数据库。为整个工作空间设置好默认数据库(GDB)后,可以方便的存储中间数据和输出的成果数据,不用在文件路径和后缀问题上劳烦太多。 配置工作空间的代码 C1 如下(该代码见文件 ../workflow/chapter1.py):# -*- coding:utf-8 -*-# ---------------------------------------------------------------# Author: LiaoChenchen# Created on: 2021/1/17 14:53# arcpy自动化制图完全指南(一):使用arcpy完成工作流import arcpyimport osclass InitPath(object):"""初始化工作空间,创建gdb数据库(如果没有的话)"""def __new__(cls, *args, **kwargs):if not hasattr(cls, "_instance"):# if not cls._instance:cls._instance = object.__new__(cls)return cls._instancedef __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 gdbscratch_gdb = os.path.join(scratch_path, "Scratch.gdb")if not arcpy.Exists(scratch_gdb):arcpy.CreateFileGDB_management(scratch_path, "Scratch")arcpy.env.workspace = scratch_patharcpy.env.overwriteOutput = Trueself.scratch_path = scratch_pathself.scratch_gdb = scratch_gdbdef __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>>该代码会在指定的目录下检查是否存在地理数据库(GDB),如果不存在,那么会自动创建 GDB 数据库。如果存在,就会将该地址返回给用户。最后将返回地址设置为默认工作空间,也就是默认工作路径。<<注释1>> 和<<注释2>>:这里预先设置了两个创建数据库的地址(D:\doc\Scratch & E:\doc\Scratch),优先在第一个地址下创建地理数据库,如果电脑没有D盘,程序会将地理数据库创建在第二个地址。<<注释3>>:arcpy.env.workspace 用于设置默认工作空间。<<注释4>>:输出的结果会覆盖同名的旧数据,请注意。Note:建议不太熟悉的读者直接复制使用该代码来设置默认工作空间,这能让你避免很多莫名其妙和后缀名导致的错误(经验之谈,遇到过很多抓狂的问题,气到冒烟)。主流程代码执行任务的主要代码,除去注释只有短短4行,可以在几秒内将线矢量图层转为面矢量图层,然后给面矢量图层创建4个长度为100的文本字段。流程代码 C2 (../workflow/chapter1.py)如下:... #<<注释5>>line = "data/line_data.shp"# 线要素转面,生成的面矢量名称为 polygonarcpy.FeatureToPolygon_management(line, "polygon")# 给 polygon 图层添加字段for name in ["CJQYMC", "CJQYDM", "XJQYMC", "XJQYDM"]:arcpy.AddField_management("polygon", name, "TEXT", field_length=100) <<注释5>>:该代码紧接上文代码 C1。输出结果输出结果是名称为 polygon 的矢量数据,储存在先前设置好的默认工作空间中。
完整源代码该代码见文件 ../workflow/chapter1.py# -*- coding:utf-8 -*-# ---------------------------------------------------------------# Author: LiaoChenchen# Created on: 2021/1/17 14:53# arcpy自动化制图完全指南(一):使用arcpy完成工作流import arcpyimport osclass InitPath(object):"""初始化工作空间,创建gdb数据库(如果没有的话)"""def __new__(cls, *args, **kwargs):if not hasattr(cls, "_instance"):# if not cls._instance:cls._instance = object.__new__(cls)return cls._instancedef __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 gdbscratch_gdb = os.path.join(scratch_path, "Scratch.gdb")if not arcpy.Exists(scratch_gdb):arcpy.CreateFileGDB_management(scratch_path, "Scratch")arcpy.env.workspace = scratch_patharcpy.env.overwriteOutput = Trueself.scratch_path = scratch_pathself.scratch_gdb = scratch_gdbdef __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"# 线要素转面,生成的面矢量名称为 polygonarcpy.FeatureToPolygon_management(line, "polygon")# 给 polygon 图层添加字段for name in ["CJQYMC", "CJQYDM", "XJQYMC", "XJQYDM"]:arcpy.AddField_management("polygon", name, "TEXT", field_length=100)结束语
全套免费资源下载:演示文件数据源代码《指南》文档小册子,便于电脑查看