使用 Python 获取数据集描述信息

0 阅读14分钟

^ 关注我,带你一起学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目录窗口查看图层数据,存储在Toronto.gdb数据库中。

要素数据集包含四个要素类(roadsstreet_lightstraffic_analysis_zones 和 traffic_junctions)以及一个网络数据集 (traffic)。

数据集是 GIS 工程的典型内容,包含不同格式的要素类和表格数据,以及组织这些数据的其他元素。 您将使用 Python 代码基于其类型和其他属性识别这些数据集。 请注意,这些分组意味着工程数据具有多级别嵌套结构。

对于ArcGIS Pro底图失效的同学,可查看以下文章进行解决。

ArcGIS Pro 添加底图的方式

3. 读取数据集信息

数据访问模块 (arcpy.da) 是一个用于处理数据的 Python 模块。 通过它可控制编辑会话、编辑操作、改进的游标支持(包括更快的性能)、表和要素类与 NumPy 数组之间相互转换的函数以及对版本化、复本、属性域和子类型工作流的支持。

注:本文不再说明如何新建脚本以及运行。

# 导入ArcPy包import arcpyroot_path = "E:\data\shp\PythonDesc"gdb = "DC.gdb"# 定义工作空间arcpy.env.workspace = root_pathdesc = arcpy.da.Describe("bike_routes.shp")print(desc)

以上代码用于输出数据集描述信息,Describe函数将返回一个Python字典类型。输出结果显示如下。

Describe函数参考地址:https://pro.arcgis.com/zh-cn/pro-app/latest/arcpy/data-access/what-is-the-data-access-module-.htm

Describe 函数用于返回的包含多个数据属性(如数据类型、字段、索引以及许多其他属性)的字典。 该字典的关键字是动态的,这意味着根据所描述的数据类型,会有不同的属性可供使用。

以下图片展示Describe对象部分属性。

将输出结果语句修改为如下方式,将会打印baseName属性及其对应键值。

print(f"baseName:{desc['baseName']}")

继续添加输出代码,在控制台打印文件拓展信息、数据类型以及shp类型。

print(f'extension: {desc["extension"]}')print(f'dataType: {desc["dataType"]}')print(f'shapeType: {desc["shapeType"]}')

将代码中的数据集修改为bike_racks.csv

desc = arcpy.da.Describe("bike_racks.csv")

再次运行代码打印属性信息,显示结果如下,代码报错shp类型错误。

这意味着使用字典时出现错误,因为字典的键 shapeType 不存在。当您考虑 shapeType 的含义时,会发现这是合理的。

文本文件没有几何,因此无法分类为点、折线或面。 字典中没有此属性,因为属性对于 CSV 文件而言无意义。

可以通过执行检查来防止此错误。在打印shapeType属性前,添加一行代码,判断字典中是否存在shapeType键名。

if 'shapeType' in desc:    print(f'shapeType: {desc["shapeType"]}')

再次运行脚本,此时代码正确。

还有一些其他属性,留给读者自己实践。

4. 读取数据集所有属性

将之前的输出代码注释,添加以下新的代码用于输出所有的键以及键值。

for k,v in desc.items():    print(f"{k}{v}")

现在代码如下。

# 导入ArcPy包import arcpyroot_path = "E:\data\shp\PythonDesc"gdb = "DC.gdb"# 定义工作空间arcpy.env.workspace = root_pathdesc = arcpy.da.Describe("bike_routes.shp")# desc = arcpy.da.Describe("bike_racks.csv")# print(f"{desc}")# print(f"baseName:{desc['baseName']}")# print(f'extension: {desc["extension"]}')# print(f'dataType: {desc["dataType"]}')# # if 'shapeType' in desc:#     print(f'shapeType: {desc["shapeType"]}')for k,v in desc.items():    print(f"{k}:{v}")

运行代码输出结果如下。

5. 读取地理数据库要素类

前文已经演示了基于文件的 shapefile 和 CSV 表的属性,本节将使用 Python 检查地理数据库中项目的属性。

继续修改之前的代码,拼接根路径和数据库路径作为工作空间路径。

arcpy.env.workspace = root_path+""+gdb

然后打印baseName、extension、dataType、shapeType属性。

完整代码显示如下。其中获取数据库信息参数代码arcpy.da.Describe("boundary")不需要添加文件拓展名,只需要传入数据集名称即可,因为地理数据库中的元素没有文件扩展名。

# 导入ArcPy包import arcpyroot_path = "E:\data\shp\PythonDesc"gdb = "DC.gdb"# 定义工作空间arcpy.env.workspace = root_path+""+gdbdesc = arcpy.da.Describe("boundary")# print(f"{desc}")print(f"baseName:{desc['baseName']}")print(f'extension: {desc["extension"]}')print(f'dataType: {desc["dataType"]}')if 'shapeType' in desc:    print(f'shapeType: {desc["shapeType"]}')

这是代码运行结果。可以看到extension属性为空,这是因为数据库中的数据集没有拓展名。

由于空文件扩展名对于地理数据库元素很常见,因此可以使用 if 语句判断存在文件拓展名时才打印该属性。将打印语句修改如下。

if desc["extension"] != "":    print(f'extension: {desc["extension"]}')

这是打印结果。

修改desc = arcpy.da.Describe("boundary") 行,将 boundary 替换为car_share_locations

desc = arcpy.da.Describe("car_share_locations")

显示结果如下,其dataType类型为Tabelcar_share_locations 项目是一个地理数据库表。 其中没有扩展名,也没有 shapeType 条目,因此不会打印这些行。

desc = arcpy.da.Describe("car_share_locations") 中的数据修改Transportation 项目。

desc = arcpy.da.Describe("Transportation")

显示结果如下,其dataType类型为FeatureDatasetTransportation是地理数据库中的要素数据集。要素数据集包含共享公共坐标系的数据元素。 要素数据集可用作工作空间。

修改工作空间路径如下,在数据库之后继续拼接Transportation要素集。

arcpy.env.workspace = root_path+""+gdb+"\Transportation"

然后修改获取数据描述信息代码

desc = arcpy.da.Describe("Traffic")

打印结果显示如下,其dataType类型为NetworkDataset

Traffic 是一个网络数据集。 网络数据集用于对交通网络进行建模。 它们通过源要素创建(其中可以包括简单要素(线和点)和转弯要素),并存储源要素的连通性。 执行网络分析时,始终在网络数据集上实现。

6. 读取工作空间中的文件

处理多个数据集是 Python 脚本中的常见任务。 输入每个单独数据集的名称既麻烦又耗时。 ArcPy 包含多个用于创建数据集清单的函数。

这些函数通常将数据集作为支持进一步处理的 Python 列表返回。

在原来基础上继续修改代码,定义工作空间路径如下。

# 导入ArcPy包import arcpyroot_path = "E:\data\shp\PythonDesc"# 定义工作空间arcpy.env.workspace = root_path

添加以下代码用于打印目标工作空间列表文件。

files = arcpy.ListFiles()print(files)

显示结果如下。

ListFiles()方法默认可以不传参数,此方式将会列出工作空间下的所有文件列表。可以修改参数为"*.csv",以过滤工作空间下的所有csv文件。将代码修改如下:

files = arcpy.ListFiles("*.csv")print(files)

显示结果为:

ListFiles 函数可以接受名为wildcard的可选参数,可通过此参数指定搜索结果必须包含的字符串。 星号表示零或更多未指定的字符,所以此通配符搜索会返回所有包含.csv 扩展名的文件名。

这种方法适用于任意数量的文件,是一种以列表形式获取相同文件类型的所有文件并对每个文件执行相同任务的好方法。

还可以列出其他文件类型,例如 .xlsx、.dbf 等,或者可以匹配名称字符串的其他部分。 例如,使用通配符字符串 "bike" 会返回所有包含 bike 的文件名的列表:

['bike_racks.csv', 'bike_routes.dbf', 'bike_routes.prj', 'bike_routes.sbn', 'bike_routes.sbx', 'bike_routes.shp', 'bike_routes.shx']

修改输出代码如下。

files = arcpy.ListFiles("*bike*")print(files)

显示结果如下所示。

继续修改代码,将工作空间路径修改为gdb数据库文件,并且ListFiles函数不传递任何参数。

# 导入ArcPy包import arcpyroot_path = "E:\data\shp\PythonDesc"gdb = "DC.gdb"# 定义工作空间arcpy.env.workspace = root_path+""+gdb# 读取数据库文件列表files = arcpy.ListFiles()print(files)

显示结果如下。这些文件与使用文件资源管理器在DC.gdb文件夹中看到的文件相同。 ListFiles()函数不是检查地理数据库内容的实用方法,因为数据集不对应于单个文件。 幸运的是,有一个用于列出要素类的函数。

7. 读取工作空间中的要素类

要素类是最常用的 GIS 数据集类型。 ListFeatureClasses() 函数可以返回当前工作空间中要素类的列表。

修改工作空间代码为:

root_path"E:\data\shp\PythonDesc"gdb = "DC.gdb"arcpy.env.workspace = root_path

修改读取要素列表代码ListFiles修改为ListFeatureClasses

files = arcpy.ListFeatureClasses()print(files)

输出结果显示如下

完整代码如下所示

# 导入ArcPy包import arcpyroot_path = "E:\data\shp\PythonDesc"gdb = "DC.gdb"# 定义工作空间arcpy.env.workspace = root_pathfiles = arcpy.ListFeatureClasses()print(files)

在本例中,要素类为 shapefile。 这有时可能会引起混淆。术语“要素类”用于描述同类要素的集合,每个要素类具有相同的空间制图表达(例如,点、线或面)和一组共同的属性。 ArcGIS Pro 中两种最常见的要素类类型为 shapefile 和地理数据库要素类。

ListFeatureClasses() 函数适用于 shapefile 和地理数据库要素类,但对于给定工作空间,仅会返回其中一个。 当工作空间为文件夹时,此函数将列出 shapefile。 当工作空间为地理数据库时,此函数将列出地理数据库要素类。

修改工作空间代码为地理数据库路径。

# 导入ArcPy包import arcpyroot_path = "E:\data\shp\PythonDesc"gdb = "DC.gdb"# 定义工作空间arcpy.env.workspace = root_path+""+gdb# 打印要素类列表files = arcpy.ListFeatureClasses()print(files)

结果显示如下。

列表不包含 Transportation 要素数据集中的要素类,因为这是不同的工作空间。

还可以使用通配符过滤 ListFeatureClasses()的结果。 例如,您可以获取所有以某个字母为开头的要素类。 您还可以使用此函数按照要素类型过滤。ListFeatureClasses() 函数的语法如下:

"""wild_card:过滤条件feature_type:要素类型feature_dataset:要素数据集"""ListFeatureClasses ({wild_card}, {feature_type}, {feature_dataset})

编辑 files = arcpy.ListFeatureClasses() 行以使用两个参数 ("", "POINT")。

files = arcpy.ListFeatureClasses("""POINT")

第一个参数 wild_card 未被使用,但是因为参数有规定的顺序,所以需要跳过此参数。 空字符串 "" 可用作占位符,以指示未使用该参数。 也可以使用 Python 关键字 None

显示结果如下,只有一个点要素类。

8. 读取表和数据集

上文已经列出了文件和要素类。 接下来,我们将读取表和要素数据集。

继续完善代码,修改i工作空间路径为根路径。

root_path"E:\data\shp\PythonDesc"

将读取要素类列表函数ListFeatureClasses修改为读取表函数ListTables

files = arcpy.ListTables()

完整代码显示如下。

# 导入ArcPy包import arcpyroot_path = "E:\data\shp\PythonDesc"gdb = "DC.gdb"# 定义工作空间arcpy.env.workspace = root_path# 读取表files = arcpy.ListTables()print(files)

运行结果显示如下,只打印了工作空间中的两个表。

修改工作空间路径为地理数据库。

root_path"E:\data\shp\PythonDesc"gdb = "DC.gdb"# 定义工作空间arcpy.env.workspace = root_path+""+gdb

读取列表代码保持不变。

输出结果显示如下

ListTables函数修改为ListDatasets,可以获取数据库总的数据集。

files = arcpy.ListDatasets()

输出结果显示如下。

将工作空间路径修改为地理数据库中的数据集。

# 导入ArcPy包import arcpyroot_path = "E:\data\shp\PythonDesc"gdb = "DC.gdb"# 定义工作空间arcpy.env.workspace = root_path+""+gdb+"\Transportation"

打印结果显示如下

ListDatasets() 函数适用于各种数据元素。 包括要素数据集、几何网络、网络、宗地结构、栅格目录、拓扑和多种其他元素。

9. 遍历要素列表

首先将工作空间路径修改为地理数据库。

root_path"E:\data\shp\PythonDesc"gdb = "DC.gdb"# 定义工作空间arcpy.env.workspace = root_path+""+gdb

然后修改要素类读取代码,通过ListFeatureClasses获取到要素列表之后,使用for循环遍历所有文件,并读取要素集描述信息。

files = arcpy.ListFeatureClasses()for file in files:    desc = arcpy.da.Describe(file)    print(f"baseName:{desc['baseName']}")

完整代码显示如下。

# 导入ArcPy包import arcpyroot_path = "E:\data\shp\PythonDesc"gdb = "DC.gdb"# 定义工作空间arcpy.env.workspace = root_path+""+gdbfiles = arcpy.ListFeatureClasses()for file in files:    desc = arcpy.da.Describe(file)    print(f"baseName:{desc['baseName']}")

以下为输出结果。

改造一些输出代码,使得结果信息更丰富。将循环代码修改如下。

desc = arcpy.da.Describe(file)name = desc["baseName"]data = desc["dataType"]shape = desc["shapeType"]print(f"{name} is a {data} with {shape} geometry")

打印结果输出如下。

10. 获取要素类类型数量

基于以上代码,在for循环前添加以下三行代码。

count_point = 0count_line = 0count_poly = 0

改造for循环代码,添加条件判断每种要数类类型,并统计要素类数量

desc = arcpy.da.Describe(file)# 统计要素类数量if desc["shapeType"] == "Point":    count_point += 1if desc["shapeType"] == "Polyline":    count_line += 1if desc["shapeType"] == "Polygon":    count_poly += 1

修改输出代码语句,在for循环外添加以下代码。

print(f"Count of Point feature classes: {count_point}")print(f"Count of Polyline feature classes: {count_line}")print(f"Count of Polygon feature classes: {count_poly}")

输出结果如下所示。

完整代码如下。

# 导入ArcPy包import arcpyroot_path = "E:\data\shp\PythonDesc"gdb = "DC.gdb"# 定义工作空间arcpy.env.workspace = root_path+""+gdbfiles = arcpy.ListFeatureClasses()count_point = 0count_line = 0count_poly = 0for file in files:    desc = arcpy.da.Describe(file)    # 统计要素类数量    if desc["shapeType"] == "Point":        count_point += 1    if desc["shapeType"] == "Polyline":        count_line += 1    if desc["shapeType"] == "Polygon":        count_poly += 1print(f"Count of Point feature classes: {count_point}")print(f"Count of Polyline feature classes: {count_line}")print(f"Count of Polygon feature classes: {count_poly}")

11. 使用要素类型过滤器获取计数

获取工作空间中要素类计数的另一种方法是将 ListFeatureClasses() 函数与要素类型的过滤器配合使用。

对之前的for循环代码添加注释,修改获取要素列表代码,对ListFeatureClasses方法传入要素类型参数进行过滤。

count_point = len(arcpy.ListFeatureClasses(feature_type="POINT"))count_line = len(arcpy.ListFeatureClasses(feature_type="POLYLINE"))count_poly = len(arcpy.ListFeatureClasses(feature_type="POLYGON"))

输出结果显示如下,与上一种方式保持一致。

完整代码如下所示。

# 导入ArcPy包import arcpyroot_path = "E:\data\shp\PythonDesc"gdb = "DC.gdb"# 定义工作空间arcpy.env.workspace = root_path+""+gdbcount_point = len(arcpy.ListFeatureClasses(feature_type="POINT"))count_line = len(arcpy.ListFeatureClasses(feature_type="POLYLINE"))count_poly = len(arcpy.ListFeatureClasses(feature_type="POLYGON"))print(f"Count of Point feature classes: {count_point}")print(f"Count of Polyline feature classes: {count_line}")print(f"Count of Polygon feature classes: {count_poly}")

12. 参考资料

  • 使用 Python 列出和描述数据集: https://learn.arcgis.com/zh-cn/projects/list-and-describe-datasets-with-python
  • Describe函数参考地址https://pro.arcgis.com/zh-cn/pro-app/latest/arcpy/data-access/what-is-the-data-access-module-.htm
  • ArcPy 开发环境搭建
  • ArcGIS Pro 中的 Python 入门
  • ArcGIS Pro 中的 notebook 初识
  • ArcGIS Pro 中的 Notebooks 入门
  • 使用 Python 运行地理处理工具

GIS之路-开发示例数据下载,请在公众号后台回复:vector

全国信息化工程师-GIS 应用水平考试资料,请在公众号后台回复:GIS考试

GIS之路 公众号已经接入了智能 助手,可以在对话框进行提问,也可以直接搜索历史文章进行查看。

都看到这了,不要忘记点赞、收藏 + 关注

本号不定时更新有关 GIS开发 相关内容,欢迎关注 


    

GeoTools 开发合集(全)

OpenLayers 开发合集(全)

GDAL 开发合集(全)

GIS 影像数据源介绍

GeoJSON 数据源介绍

GIS 名词解释

ArcPy,一个基于 Python 的 GIS 开发库简介

GIS 开发库 Turf 介绍

GIS 开发库 GeoTools 介绍

GIS 开发库 GDAL 介绍

地图网站大全

从微信指数看当前GIS框架的趋势

Landsat 卫星数据介绍

OGC:开放地理空间联盟简介

中国地图 GeoJSON 数据集网站介绍

高校停招GIS专业背后,隐藏着怎样的逻辑?