^ 关注我,带你一起学GIS ^
前言
❝
Python 脚本使自动化 ArcGIS Pro 中的工作流成为可能。
本教程来源于ESRI官方示例如何在ArcGIS Pro中学习使用Notebooks。
文中以ArcGIS Pro3.5为例,默认你已经具备了Python的基础知识。
1. 开发环境
本文使用如下开发环境,以供参考。
时间:2026年
系统:Windows 11
ArcGIS Pro:3.5
Python:3.11.11
2. 数据准备
俗话说巧妇难为无米之炊,数据就是软件开发的基石,没有数据,再美好的设想都是空中楼阁。因此,第一步需要下载GIS数据。
别急,GIS之路公众号都给你准备好了
在公众号后台回复关键字:vector,获取数据下载链接。
而本文示例数据来源于ESRI官方教程,在此感谢ESRI相关工作人员的辛勤付出与免费共享。
数据下载地址 :https://arcgis.com/sharing/rest/content/items/efb53cb7d7dc4ed8af06821369cf196c/data
下载数据解压完成,将工程添加到地图,可在ArcGIS Pro目录窗口查看图层数据,存储在Toronto.gdb数据库中。
将etobicoke、fire_stations 和greenspace 要素类添加到当前地图中 。
对于ArcGIS Pro底图失效的同学,可查看以下文章进行解决。****
3. 创建 notebooks 并运行 Python 代码
ArcGIS Notebooks是一个基于JupyterLab构建的开源 web 应用程序 ,可用于创建和共享包含实时 Python 代码、可视化效果和叙事文本的文档(名为 Notebooks)。
详情请参考文章:ArcGIS Pro 中的 notebook 初识
在ArcGIS Pro的笔记本中创建并运行Python代码具有以下两种方式。
方式一: 点击插入 选项卡,在工程窗口中选择New Notebook下拉菜单,然后点击New Notebook。或者存在保存过的笔记本的话,也可以通过Add and Open Notebook打开。
方式二: 点击分析 选项卡,选择Python下拉菜单,点击Python Notebook。
打开notebook笔记本窗口显示如下,由标题栏、工具栏和代码区组成,主要包括保存、新建、剪切、复制、运行等工具。
笔记本创建完成后将作为新视图在 ArcGIS Pro 的主窗口中显示。新笔记本将以.ipnyb 文件格式存储在工程主目录文件夹中。 新文件夹也会显示在目录 窗格的笔记本 文件夹下。
单击 Notebook 中的空单元格,轮廓变为蓝色,写入以下代码并运行。
bash
print("Hello Notebook!")
其他使用方法请参考官方教程。
4. 管理单元格中的代码
Notebooks 中的代码将在单元格中运行。 单元格运行后,其顺序通过单元格旁的数字指示。 Notebooks 提供了用于管理单元格的工具。
下面以使用Python列表为例进行演示。
在单元格中定义一个数据列表mylist。
ini
mylist = [1, 2, 3, 4, 5]

列表是 Python 中的一种重要数据类型,其中包含一系列元素。 这里的元素为数值,但是列表也可以包含其他数据类型。 列表中的元素以逗号分隔。
在下一个空单元格中,输入下列代码行并运行单元格。
css
mylist[-1]
系统会对列表中的元素建立索引,索引编号从零开始。 可以使用元素的索引编号获得特定索引。 索引编号 -1 表示第一个元素从列表的末尾(即,最后一个元素)开始, 这会返回数值 6 。索引编号为-2则会返回列表中倒数第二个元素,5 。
通过添加更多元素来更改定义 **mylist** 变量的单元格中的代码,但不要运行单元格。
ini
mylist = [1, 2, 3, 4, 5, 6, 7, 8]
在此单元格下方添加新的单元格,使用代码 mylist[-1] 并单击运行 按钮。结果是否与您的预期相符?
结果为数值 6 。 为什么不是数值 8?
Notebook 中的代码逐个单元格输入,上一次使用的变量会存储在内存中。除非您使用重新定义 mylist 变量的代码来运行单元格,否则 mylist 值仍然是存储在内存中的值 [1, 2, 3, 4, 5,6],该列表中位置 -1 处的值仍然为 6。
单击定义 mylist = [1, 2, 3, 4, 5, 6, 7, 8] 的行,并运行。然后单击调用代码 mylist[-1] 的单元格运行。输入结果如下,显示为8。 
为此,可以选择单元格逐个运行,或者点击运行全部单元格按钮。
5. 在 notebook 中运行地理处理工具
通过以上内容你已对在 notebook 中输入代码进行了一些练习,现在可以打开一个新的笔记本运行一些地理处理工具。在代码开头导入arcpy包。
arduino
import arcpy
ArcPy 是 Python 包,它具有 Python 中的大部分可用 ArcGIS Pro 功能,包括地理处理功能。
以下是来自官方的建议。
❝
由于是在 ArcGIS Pro 中使用此 notebook,因此,如果您未导入 ArcPy,使用地理处理工具的代码不会产生错误。 但是,建议您始终在地理处理代码的顶部包括 import arcpy,以便其在 ArcGIS Pro 以外可正常运行。
在同一单元格中添加新行运行以下代码。
GetCount 是 ArcPy 的函数,可运行数据管理工具 工具箱中的获取计数地理处理工具。
结果显示在代码单元格下方。 要素类中有 84 行(要素)。 结果与使用 ArcGIS Pro 中的工具对话框运行工具时看到的消息非常相似。Notebooks 集成在 ArcGIS Pro 的地理处理框架中。
这表示在 notebook 中运行某一工具与使用工具对话框运行此工具类似。 在 notebook 中运行的任何工具也同时会显示在历史窗格中。
将 arcpy.GetCount 代码更改为如下所示,运行单元格。
arduino
arcpy.GetCount_management("ambulances")
此代码失败,并在消息的末尾,显示以下信息:
vbscript
ExecuteError: Failed to execute. Parameters are not valid.
ERROR 000732: Input Rows: Dataset ambulances does not exist or is not supported
Failed to execute (GetCount).

很明显,代码运行失败了,用于获取消防站计数的代码在什么情况下正常运行?
要素类 fire_stations 是活动地图中的图层。 在 notebook 中,当使用地理处理工具的图形用户界面以交互方式运行地理处理工具时,可以通过活动地图中的图层名称引用数据集。
要素类 ambulances 未显示在活动地图的图层中,它也不是工程的默认地理数据库中的要素类。 对于不在活动地图或默认地理数据库中的要素类,可以通过指定指向此要素类的完整路径来引用它。
接下来,将查找指向 ambulances 要素类的路径。
在目录 窗格中,展开数据库 部分,然后展开 Toronto.gdb。
右键单击 ambulances ,然后单击复制路径 。
即会复制 ambulances 要素类的文件路径。 该路径还包含要素类名称。
css
E:NotebookStartToronto.gdbambulances
再次运行计数代码,将要素类名称改为前面复制的数据路径。
arduino
arcpy.GetCount_management("E:NotebookStartToronto.gdbambulances")
当你以为成功的时候,跳出了最刺眼的红色,你知道废了。
路径看起来没问题,为什么仍然运行失败呢?因为缺少一些内容,还需要添加字母 r,告诉 Python 此路径是原始字符串。
Windows 计算机使用反斜线 () 作为路径分隔符。 在 Python 中,反斜线字符位于字符串中其他字符旁边时将作为转义符,对制表符、换行符或其他特殊字符进行编码。
这就意味着,当路径中 NotebookStart 旁边出现N 时,Python 读取字符串时会认为其中包含换行符。 在字符串之前放置字母 r 旨在告诉 Python 忽略转义符。
添加字母r并运行。
python
arcpy.GetCount_management(r"E:dataNotebookStartToronto.gdbambulances")
显示结果如下。
如果不想添加字母r,可在数据路径中使用斜杠"/"或者两个反斜杠"\"。以下为在Python中书写数据路径的方式。
- r"E:\NotebookStart\Toronto.gdb\ambulances"
- "E:/NotebookStart/Toronto.gdb/ambulances"
- "E:\NotebookStart\Toronto.gdb\ambulances"
如果你不想为文件设置完整的数据路径,则可以使用工作空间。在导入arcpy包后定义workspace。
python
arcpy.env.workspace = r"E:datashpNotebookStartNotebookStartToronto.gdb"
结果输出信息如下。
如果你想要知道地理数据库中每个要素类的计数。 可以复制单元格并编辑要素类的名称,然而,可以使用Python获取所有要素类的列表,然后对其运行 GetCount 函数。
bash
# 展示工作空间中的要素类列表
fc_list = arcpy.ListFeatureClasses()
# 打印列表
print("##################要素类列表##################")
print(fc_list)
print("##################要素类列表##################n")
# 便利列表
print("##################要素类及其计数##################")
for fc in fc_list:
# 要素类计数
count = arcpy.GetCount_management(fc)
# 打印要素类及其计数
print(fc, count)
print("##################要素类及其计数##################")
在单元格中运行代码显示结果如下。
6. 使用 notebook 运行分析
本节将使用 notebook 进行一些 GIS 分析工作。 假设用户想要了解 Etobicoke 行政区内哪些区域距离消防站最远。 则可以在 notebook 中使用地理处理工具表示这些区域。
在代码中键入arcpy.,将光标置于"."之后,接着按下tab键可打开代码提示。接着输入模块或工具名称可对提示信息进行过滤,如输入Bu。
单机Buffer_analysis工具,将光标至于Buffer_analysis后或者其中,按住【shift+tab】组合键,可以打开工具说明文档。
Buffer_analysis 工具的三个必要参数为:输入要素类、输出要素类和缓冲距离。 还有其他可选参数,但只有上述三个为必需的参数。
代码中将缓冲 fire_stations 要素类,命名输出要素类 fire_buffer,使工具以 1000 米的距离建立消防站缓冲区。在单元格中输入以下代码并运行:
arduino
arcpy.Buffer_analysis("fire_stations","fire_buffer","1000 METERS")

生成的要素类会添加至当前地图,结果将显示落在距消防站 1000 米(即 1 千米)以内的区域,以及以外的区域。
将缓冲距离更改为 1750 米,并再次运行单元格。
arduino
arcpy.Buffer_analysis("fire_stations","fire_buffer","1750 METERS")
显示结果如下。
❝
如果收到错误消息,"ExecuteError: 无法执行。 参数无效 ",提到 fire_buffer 已经存在,然后您的 ArcGIS Pro 环境设置、地理处理选项未设置为允许覆盖现有要素类。要修复此问题,在单元格的 arcpy.Buffer_analysis 行前插入新行。 在新的行中,添加以下代码:arcpy.env.overwriteOutput = True,这将允许缓冲区工具覆盖以前的输出。 单元格现在应包含:
pythonarcpy.env.overwriteOutput = True arcpy.Buffer_analysis("fire_stations", "fire_buffer", "1750 METERS")
运行单元格。
添加一个新的单元格,并写入以下代码并运行。
arduino
arcpy.PairwiseErase_analysis("etobicoke", "fire_buffer", "no_service")
地图显示结果如下。
此代码会针对 etobicoke 要素类调用 PairwiseErase_analysis 工具,从中擦除 fire_buffer 要素类中的区域,并将结果写入名为 "no_service" 的新要素类。
在图层目录窗格中,右键单击 no_service 图层,然后单击缩放至图层 ,图层 no_service 将显示距离消防站较远的地方。
对于消防服务而言,得到的区域可能是受影响最大的区域。 通过在 notebook 中以单个单元格的方式运行多行代码可获得更新后的结果。 如果你已在工具的图形用户界面中使用过此工具,则需要再次运行缓冲区 工具和成对擦除工具才能获得更新后的结果。
仅两个工具所节省的时间非常有限,但是包含更长工具序列的工作流会节省很多时间。 此外,对于针对多个输入运行同一流程的情况,在循环中运行一个或多个工具的功能,会让 Python 非常有用。
7. 参考资料
Notebooks入门:https://learn.arcgis.com/zh-cn/projects/get-started-with-notebooks-in-arcgis-pro

❝
GIS之路 -开发示例数据下载,请在公众号后台回复:vector
全国信息化工程师-GIS 应用水平考试资料,请在公众号后台回复:GIS考试
❝GIS之路 公众号已经接入了智能 助手,可以在对话框进行提问,也可以直接搜索历史文章进行查看。
都看到这了,不要忘记点赞、收藏 + 关注 哦 !
本号不定时更新有关 GIS开发 相关内容,欢迎关注 


