免费视频|新人指南|投诉删帖|广告合作|地信网APP下载

查看: 3098|回复: 26
收起左侧

Python和ArcGIS自动化制图完全指南(一):使用ArcPy完成工作流

    [复制链接]

4

主题

4529

铜板

5

好友

地信专家组

Rank: 14Rank: 14Rank: 14Rank: 14

积分
183

爱心勋章地信专家组冰雪节勋章

发表于 2021-4-26 18:35 | 显示全部楼层 |阅读模式
本帖最后由 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 中的类、方法可以简单分为三种:
  • 第一种是针对 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)如下:


  1. # -*- coding:utf-8 -*-
  2. # ---------------------------------------------------------------
  3. # Author: LiaoChenchen
  4. # Created on: 2021/1/17 14:53
  5. # arcpy自动化制图完全指南(一):使用arcpy完成工作流
  6. ​
  7. import arcpy
  8. import os
  9. ​
  10. class InitPath(object):
  11.     """初始化工作空间,创建gdb数据库(如果没有的话)"""
  12.     def __new__(cls, *args, **kwargs):
  13.         if not hasattr(cls, "_instance"):
  14.             # if not cls._instance:
  15.             cls._instance = object.__new__(cls)
  16.         return cls._instance
  17.     def __init__(self):
  18.         """_________create folder_________"""
  19.         scratch_path = "D:\doc\Scratch" #<<注释1>>
  20.         try:
  21.             if not os.path.isdir(scratch_path):
  22.                 os.makedirs(scratch_path)
  23.         except:
  24.             scratch_path = "E:\doc\Scratch" #<<注释2>>
  25.             if not os.path.isdir(scratch_path):
  26.                 os.makedirs(scratch_path)
  27.         
  28.         """_________create folder_________"""
  29.         # make gdb
  30.         scratch_gdb = os.path.join(scratch_path, "Scratch.gdb")
  31.         if not arcpy.Exists(scratch_gdb):
  32.             arcpy.CreateFileGDB_management(scratch_path, "Scratch")
  33.         arcpy.env.workspace = scratch_path
  34.         arcpy.env.overwriteOutput = True
  35.         
  36.         self.scratch_path = scratch_path
  37.         self.scratch_gdb = scratch_gdb
  38.    
  39.     def __iter__(self):
  40.         return (i for i in (self.scratch_path, self.scratch_gdb))
  41. &#8203;
  42. &#8203;
  43. """______run code______"""
  44. &#8203;
  45. folder_path, gdb_path = InitPath()
  46. arcpy.env.workspace = gdb_path #<<注释3>>
  47. arcpy.env.overwriteOutput = True #<<注释4>>
复制代码


该代码会在指定的目录下检查是否存在地理数据库(GDB),如果不存在,那么会自动创建 GDB 数据库。如果存在,就会将该地址返回给用户。
最后将返回地址设置为默认工作空间,也就是默认工作路径。

<<注释1>> 和<<注释2>>:
这里预先设置了两个创建数据库的地址(D:\doc\Scratch & E:\doc\Scratch),优先在第一个地址下创建地理数据库,如果电脑没有D盘,程序会将地理数据库创建在第二个地址。

<<注释3>>:
arcpy.env.workspace 用于设置默认工作空间。

<<注释4>>:
输出的结果会覆盖同名的旧数据,请注意。

&#8203;
Note:建议不太熟悉的读者直接复制使用该代码来设置默认工作空间,这能让你避免很多莫名其妙和后缀名导致的错误(经验之谈,遇到过很多抓狂的问题,气到冒烟)。

&#8203;

  
主流程代码
执行任务的主要代码,除去注释只有短短4行,可以在几秒内将线矢量图层转为面矢量图层,然后给面矢量图层创建4个长度为100的文本字段。

流程代码 C2 (../workflow/chapter1.py)如下:


  1. ... #<<注释5>>
  2. &#8203;
  3. line = "data/line_data.shp"
  4. # 线要素转面,生成的面矢量名称为 polygon
  5. arcpy.FeatureToPolygon_management(line, "polygon")
  6. &#8203;
  7. # 给 polygon 图层添加字段
  8. for name in ["CJQYMC", "CJQYDM", "XJQYMC", "XJQYDM"]:
  9.     arcpy.AddField_management(
  10.         "polygon", name, "TEXT", field_length=100)
复制代码


<<注释5>>:
该代码紧接上文代码 C1

输出结果
输出结果是名称为 polygon 的矢量数据,储存在先前设置好的默认工作空间中。


  
完整源代码
该代码见文件 ../workflow/chapter1.py


  1. # -*- coding:utf-8 -*-
  2. # ---------------------------------------------------------------
  3. # Author: LiaoChenchen
  4. # Created on: 2021/1/17 14:53
  5. # arcpy自动化制图完全指南(一):使用arcpy完成工作流
  6. &#8203;
  7. import arcpy
  8. import os
  9. &#8203;
  10. class InitPath(object):
  11.     """初始化工作空间,创建gdb数据库(如果没有的话)"""
  12.     def __new__(cls, *args, **kwargs):
  13.         if not hasattr(cls, "_instance"):
  14.             # if not cls._instance:
  15.             cls._instance = object.__new__(cls)
  16.         return cls._instance
  17.     def __init__(self):
  18.         """_________create folder_________"""
  19.         scratch_path = "D:\doc\Scratch" #<<注释1>>
  20.         try:
  21.             if not os.path.isdir(scratch_path):
  22.                 os.makedirs(scratch_path)
  23.         except:
  24.             scratch_path = "E:\doc\Scratch" #<<注释2>>
  25.             if not os.path.isdir(scratch_path):
  26.                 os.makedirs(scratch_path)
  27.         
  28.         """_________create folder_________"""
  29.         # make gdb
  30.         scratch_gdb = os.path.join(scratch_path, "Scratch.gdb")
  31.         if not arcpy.Exists(scratch_gdb):
  32.             arcpy.CreateFileGDB_management(scratch_path, "Scratch")
  33.         arcpy.env.workspace = scratch_path
  34.         arcpy.env.overwriteOutput = True
  35.         
  36.         self.scratch_path = scratch_path
  37.         self.scratch_gdb = scratch_gdb
  38.    
  39.     def __iter__(self):
  40.         return (i for i in (self.scratch_path, self.scratch_gdb))
  41. &#8203;
  42. &#8203;
  43. """______run code______"""
  44. &#8203;
  45. folder_path, gdb_path = InitPath()
  46. arcpy.env.workspace = gdb_path #<<注释3>>
  47. arcpy.env.overwriteOutput = True #<<注释4>>
  48. &#8203;
  49. line = "data/line_data.shp"
  50. # 线要素转面,生成的面矢量名称为 polygon
  51. arcpy.FeatureToPolygon_management(line, "polygon")
  52. &#8203;
  53. # 给 polygon 图层添加字段
  54. for name in ["CJQYMC", "CJQYDM", "XJQYMC", "XJQYDM"]:
  55.     arcpy.AddField_management(
  56.         "polygon", name, "TEXT", field_length=100)
复制代码




&#8203;

结束语

下载:
  • 演示文件数据
  • 源代码
  • 《指南》文档小册子,便于电脑查看


关注公众号回复:自动化制图    ,获取所有下载!

&#8203;

&#8203;分享GIS,不止于Python。荟GIS精粹,关注我,带你飞!(长按扫码也行)




更多文章请翻看我的主页。




4

主题

4529

铜板

5

好友

地信专家组

Rank: 14Rank: 14Rank: 14Rank: 14

积分
183

爱心勋章地信专家组冰雪节勋章

 楼主| 发表于 2021-4-27 14:01 | 显示全部楼层
有什么问题直接微信公众号问我,不然不一定能及时看到
回复 支持 反对

使用道具 举报

1

主题

3435

铜板

10

好友

助理工程师

Rank: 5Rank: 5

积分
252
QQ
发表于 2021-8-4 13:38 | 显示全部楼层
介绍得非常好!
回复 支持 反对

使用道具 举报

8

主题

2万

铜板

23

好友

教授级高工

Rank: 12Rank: 12Rank: 12

积分
1766
发表于 2021-8-7 07:51 | 显示全部楼层
谢谢分享。
回复

使用道具 举报

29

主题

1万

铜板

13

好友

高级工程师

Rank: 9Rank: 9Rank: 9

积分
1052
发表于 2021-8-16 17:42 | 显示全部楼层
学习了感谢
回复 支持 反对

使用道具 举报

2

主题

3万

铜板

6

好友

钻石会员

Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26

积分
5687
发表于 2021-12-19 12:43 | 显示全部楼层
谢谢分享
回复

使用道具 举报

10

主题

1万

铜板

19

好友

资深会员

Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

积分
3722
发表于 2022-1-21 12:40 | 显示全部楼层
谢谢分享
回复

使用道具 举报

0

主题

282

铜板

0

好友

助理工程师

Rank: 5Rank: 5

积分
117
发表于 2022-2-12 13:07 | 显示全部楼层
谢谢大佬分享
回复 支持 反对

使用道具 举报

0

主题

304

铜板

1

好友

技术员

Rank: 3Rank: 3

积分
43
发表于 2022-3-1 16:07 | 显示全部楼层
学习学习学习
回复 支持 反对

使用道具 举报

4

主题

1万

铜板

0

好友

钻石会员

Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26

积分
6020
发表于 2022-5-13 09:06 | 显示全部楼层
谢谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

在线客服
快速回复 返回顶部 返回列表