本帖最后由 hygnic 于 2021-4-26 19:15 编辑
Python和ArcGIS自动化制图完全指南(一):使用ArcPy完成工作流
​
前言:哪怕是0基础的你也可以在不打开 ArcGIS 软件的情况下,使用 ArcPy 调用其最多1000多种工具并实现各种复杂或重复的工作流,同时具有很大的灵活度。使用了一个简单的例子做最后的展示。 |
​
​
​
1. 写给0基础的读者
这里的内容主要是介绍用什么东西写这个 ArcPy 工作流代码、怎么运行等相关基础内容。 有基础读者的可以跳过。
1.1什么是 Python
Python 是一门面向对象的编程语言。
1.2什么是 ArcPy
最开始 ArcGIS 10 中引入了 ArcPy,这是一个 Python 站点包,其中包含了各种方法,可以使用 Python 语言进行调用。 比如 ArcGIS 空间分析中的擦除操作,在 ArcPy 中就有正好对应的方法。 ArcPy 中的类、方法可以简单分为三种:
1.3用什么写工作流
IDLE:安装 ArcGIS 时会自动安装一整套 Python 工具,其中就有我们编写代码的工具,叫 IDLE。 如图所示:
1.4如何运行
打开 IDLE 编写简单代码并运行代码的视频如下:
​
运行视频见公众号
​
​Note: 有两点需要注意一下
①第一行请写 # -*- coding: utf-8 -*- ,就如视频中那样;
②使用 IDLE 保存文件时,自己需要填写后缀 .py。 |
​
​
​
2. 编写工作流代码
2.1流程分析
我们使用一个简单的例子来讲解如何编写工作流代码: 使用 ArcPy 实现一个简单的工作流程:
直接使用 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 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>>
复制代码
该代码会在指定的目录下检查是否存在地理数据库(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"
- # 线要素转面,生成的面矢量名称为 polygon
- arcpy.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 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)
复制代码
​
结束语
演示文件数据 源代码 《指南》文档小册子,便于电脑查看
​
​分享GIS,不止于Python。荟GIS精粹,关注我,带你飞!(长按扫码也行)
|