^ 关注我,带你一起学GIS ^
前言
❝
典型 GIS 工作流需要使用许多数据集,它们可以采用表格和空间数据格式。 对于规划工程和管理数据而言,深入了解可用的表格和空间数据集非常重要。
识别可用数据集并确定其属性的过程可以使用 Python 代码自动化。 可以使用 ArcPy 函数完成此操作,从而列出和描述数据集。
本教程来源于ESRI官方示例如何使用 Python 自动化地理处理工作流。
文中以ArcGIS Pro3.5为例,默认你已经具备了Python的基础知识。本篇教程在之前一系列文章的基础上讲解。
如果你还没有看过,建议从以上内容开始。
1. 开发环境
本文使用如下开发环境,以供参考。
时间:2026年
系统:Windows 11
ArcGIS Pro:3.5
Python:3.11.11
2. 数据准备
俗话说巧妇难为无米之炊,数据就是软件开发的基石,没有数据,再美好的设想都是空中楼阁。因此,第一步需要下载GIS数据。
别急,GIS之路公众号都给你准备好了
在公众号后台回复关键字:vector,获取数据下载链接。
而本文示例数据来源于ESRI官方教程,在此感谢ESRI相关工作人员的辛勤付出与免费共享。
数据下载地址:https://learn.arcgis.com/zh-cn/projects/list-and-describe-datasets-with-python
下载数据解压完成,将工程添加到地图,可在ArcGIS Pro目录窗口查看图层数据,存储在Transportation.gdb数据库中。
数据集是 GIS 工程的典型内容,包含不同格式的要素类和表格数据,以及组织这些数据的其他元素。 您将使用 Python 代码基于其类型和其他属性识别这些数据集。 请注意,这些分组意味着工程数据具有多级别嵌套结构。
对于ArcGIS Pro底图失效的同学,可查看以下文章进行解决。
3. 创建地理数据库
打开ArcGIS Pro,在目录窗口中连接上PythonWorkflow文件夹。源文件工作目录显示如下。
导入模块arcpy和os。其中arcpy模块用于GIS数据转换处理和分析,os为系统操作模块。
# 导入ArcPy包
import arcpy
import os
定义工作空间。root_path变量指向数据文件夹,并采用双斜杠""连接,其他连接方式可参考之前文章。os.path.join用于拼接数据库连接。
# 定义工作空间
root_path = "E:\data\shp\PythonWorkflow"
gdb = "Transportation.gdb"
arcpy.env.workspace = os.path.join(root_path,gdb)
添加以下代码行,将属性overwriteOutput设置为True,使得源数据可以被覆盖输出。
arcpy.env.overwriteOutput = True
添加以下代码创建一个新的地理数据库,其中new_gdb为新地理数据库名称,CreateFileGDB_management方法用于创建地理数据库。
# 定义新数据集存储位置
new_gdb = "Metro_Transport.gdb"
fds = "Metro_Network"
# 创建地理数据库
my_gdb_path = arcpy.CreateFileGDB_management(root_path,new_gdb)
完整代码显示如下。
# 导入ArcPy包
import arcpy
import os
# 定义工作空间
root_path = "E:\data\shp\PythonWorkflow"
gdb = "Transportation.gdb"
arcpy.env.workspace = os.path.join(root_path,gdb)
arcpy.env.overwriteOutput = True
# 定义新数据集存储位置
new_gdb = "Metro_Transport.gdb"
fds = "Metro_Network"
# 创建地理数据库
my_gdb_path = arcpy.CreateFileGDB_management(root_path,new_gdb)
if my_gdb_path is not None:
print("地理数据库创建成功。")
else:
print("地理数据库创建失败!请检查数据路径是否正确")
打开命令行程序,运行Python代码,提示地理数据库创建成功。
打开ArcGIS Pro目录窗口,点击PythonWorkflow文件夹,右键选择刷新,查看文件目录,已经成功创建了Transportation.gdb数据库。
4. 创建要素数据集
在上节中已经完成了Metro_Transport.gdb地理数据库的创建,本节将演示创建要素数据集,并将要素类保存到Metro_Transport.gdb地理数据库中。
要素数据集的一个最典型的属性是要素数据集中的所有要素类共享相同的坐标系。
在上节代码的基础上,添加以下代码。
# 创建要素数据集
arcpy.CreateFeatureDataset_management(my_gdb_path,fds,2248)
print(f"Feature dataset {fds} has been created!")
CreateFeatureDataset_management为创建数据集方法,第一个参数my_gdb_path为地理数据库路径,fds为要素集名称,第三个参数2248为坐标系WKID标识符,可以简单理解为WKID即为EPSG CODE。在创建完成之后,打印提示信息。代码运行结果如下。
打开ArcGIS Pro软件,在Metro_Transport.gdb上右键,然后选择刷新,展开该数据库,可以看到数据库目录下新增了一个数据集Metro_Network。在要素集上右键,选择属性。
展开
Spatial Reference,查看其WKID为2248,与上文中保持一致。
5. 复制要素类
在复制之前,需要读取空间参考WKID标识符,如果Transportation.gdb地理数据库中的要素类WKID标识符等于2248,则可以直接复制。
接着以上代码修改。首先通过arcpy.ListFeatureClasses获取要素类列表。
# 获取要素类列表
fcs = arcpy.ListFeatureClasses()
接着遍历要素类列表。使用arcpy.da.Describe获取数据属性,通过desc["spatialReference"]读取空间参考信息,代码os.path.join(root_path,new_gdb,fds,fc)用于拼接新路径,当目标要素WKID标识符等于2248时,则直接使用arcpy.CopyFeatures_management复制要素类。
for fc in fcs:
# 获取描述属性
desc = arcpy.da.Describe(fc)
# 获取空间参考
sr = desc["spatialReference"]
# 新要素类路径
new_fc = os.path.join(root_path,new_gdb,fds,fc)
if sr.factoryCode == 2248:
# 复制要素类
arcpy.CopyFeatures_management(fc,new_fc)
print(f"The feature class {fc} has been copied.")
代码运行结果如下。
打开ArcGIS Pro,刷新Metro_Network要素集,已经复制了五个要素类。
完整代码显示如下。
# 导入ArcPy包
import arcpy
import os
# 定义工作空间
root_path = "E:\data\shp\PythonWorkflow"
gdb = "Transportation.gdb"
arcpy.env.workspace = os.path.join(root_path,gdb)
arcpy.env.overwriteOutput = True
# 定义新数据集存储位置
new_gdb = "Metro_Transport.gdb"
fds = "Metro_Network"
# 创建地理数据库
my_gdb_path = arcpy.CreateFileGDB_management(root_path,new_gdb)
if my_gdb_path is not None:
print("地理数据库创建成功。")
else:
print("地理数据库创建失败!请检查数据路径是否正确")
# 创建要素数据集
arcpy.CreateFeatureDataset_management(my_gdb_path,fds,2248)
print(f"Feature dataset {fds} has been created!")
# 获取要素类列表
fcs = arcpy.ListFeatureClasses()
for fc in fcs:
# 获取描述属性
desc = arcpy.da.Describe(fc)
# 获取空间参考
sr = desc["spatialReference"]
# 新要素类路径
new_fc = os.path.join(root_path,new_gdb,fds,fc)
if sr.factoryCode == 2248:
# 复制要素类
arcpy.CopyFeatures_management(fc,new_fc)
print(f"The feature class {fc} has been copied.")
6. 投影要素类
接着以上代码继续修改,在if sr.factoryCode == 2248:语句后添加else语句。该判断条件为当目标要素WKID标识符不等于2248时,调用Project_management方法投影要素类,接着打印投影陈工信息。
# 投影要素类
arcpy.Project_management(fc,new_fc,2248)
print(f"The feature class {fc} has been projected.")
代码运行结果如下。
打开ArcGIS Pro,刷新Metro_Network要素集,源数据库中的所有要素类都已保存到要素集中了。
完整代码显示如下。
# 导入ArcPy包
import arcpy
import os
# 定义工作空间
root_path = "E:\data\shp\PythonWorkflow"
gdb = "Transportation.gdb"
# arcpy.env.workspace = root_path
# arcpy.env.workspace = root_path+""+gdb
# arcpy.env.workspace = root_path+""+gdb+"\Transportation"
# arcpy.env.workspace = root_path+""+gdb
arcpy.env.workspace = os.path.join(root_path,gdb)
arcpy.env.overwriteOutput = True
# 定义新数据集存储位置
new_gdb = "Metro_Transport.gdb"
fds = "Metro_Network"
# 创建地理数据库
my_gdb_path = arcpy.CreateFileGDB_management(root_path,new_gdb)
if my_gdb_path is not None:
print("地理数据库创建成功。")
else:
print("地理数据库创建失败!请检查数据路径是否正确")
# 创建要素数据集
arcpy.CreateFeatureDataset_management(my_gdb_path,fds,2248)
print(f"Feature dataset {fds} has been created!")
# 获取要素类列表
fcs = arcpy.ListFeatureClasses()
for fc in fcs:
# 获取描述属性
desc = arcpy.da.Describe(fc)
# 获取空间参考
sr = desc["spatialReference"]
# 新要素类路径
new_fc = os.path.join(root_path,new_gdb,fds,fc)
if sr.factoryCode == 2248:
# 复制要素类
arcpy.CopyFeatures_management(fc,new_fc)
print(f"The feature class {fc} has been copied.")
else:
# 投影要素类
arcpy.Project_management(fc,new_fc,2248)
print(f"The feature class {fc} has been projected.")
参考资料
- 使用 Python 列出和描述数据集 : learn.arcgis.com/zh-cn/proje…
- Describe函数参考地址:pro.arcgis.com/zh-cn/pro-a…
❝
GIS之路-开发示例数据下载,请在公众号后台回复:vector
全国信息化工程师-GIS 应用水平考试资料,请在公众号后台回复:GIS考试
❝
GIS之路 公众号已经接入了智能 助手,可以在对话框进行提问,也可以直接搜索历史文章进行查看。
都看到这了,不要忘记点赞、收藏 + 关注 哦 !
本号不定时更新有关 GIS开发 相关内容,欢迎关注