关于arcpy.ListFeatureClasses()函数获取无法获取数据集中的要素类的问题深入学习

问题描述:

今天我在使用arcpy.ListFeatureClasses()函数时,遇到获取无法获取数据集(FeatureDataset)中的要素类(FeatureClass)的问题,查了很多资料,最后还是在**Arcgis帮助文档**中找到了问题的原因。现对其原因总结如下:

原因分析:

个人理解(如有错误的地方,望大佬留言指正):
arcgis中文件型地理数据库(File Geodatabase/gdb)的数据的组织形式类似window中的文件夹形式,
可以将gdb理解成文件夹,只不过是用arcgis查看内部的数据。而内部的数据又可以分组存储——即创建多个不同坐标系的数据集(FeatureDataset),存储要素类(FeatureClass),且在gdb数据库中的各个要素类均不可以使用相同的要素名称。
当我们在做批处理的时候自然而然会使用到数据目录列表。ArcPy 提供了多个专为创建此类列表而构建的函数。
如下:

函数名称使用说明
ListFields(dataset, wild_card, field_type)返回在输入值中找到的字段的列表
ListIndexes(dataset, wild_card)返回在输入值中找到的属性索引的列表
ListDatasets(wild_card, feature_type)返回当前工作空间中的数据集
ListFeatureClasses(wild_card, feature_type)返回当前工作空间中的要素类
ListFiles(wild_card)返回当前工作空间中的文件
ListRasters(wild_card, raster_type)返回在当前工作空间中找到的栅格数据的列表
ListTables(wild_card, table_type)返回在当前工作空间中找到的表的列表
ListWorkspaces(wild_card, workspace_type)返回在当前工作空间中找到的工作空间的列表
ListVersions(sde_workspace)返回已连接用户有权使用的版本的列表

这些函数中每个函数的结果都是一个 Python 列表,该列表为值列表。脚本中的列表可以包含任何类型的数据,如字符串(例如,可以是数据集的路径、字段或表中的行)。创建完具有所需值的列表后,可在脚本中使用For循环列表,以处理各个值。

注意看使用说明,返回当前位置的数据列表,因此在使用arcpy.ListFeatureClasses()函数时,如果设置的工作空间为*.gdb,那么会返回gdb根目录下的要素类(FeatureClass)名称,不会返回数据集(FeatureDataset)中的要素类名称,也就是说该函数不会遍历子目录中的要素类。可以考虑结合arcpy.ListDatasets()函数。
那么问题就来了,由于gdb数据库中不允许存在重名的要素类,有没有一个函数可以同时遍历根目录和子目录的要素呢?那当然是有的!!
接下来,我将详细说明这个方法。
你可能会熟悉这么一种方法os.walk,通过从上到下或从下到上遍历目录树,可在目录树中生成数据的名称。树中各字典/工作空间提供一个三元组:dirpath、dirnames 和 filenames。
在arcpy中提供类似os.walk的方法,那就是da.walk
os.walk可用于遍历目录树并查找数据。os.walk 是基础文件,它不识别数据库内容,例如,地理数据库要素类、表或栅格。arcpy.da.Walk 可用于为数据编目录。

语法:
arcpy.da.Walk(top,{topdown}, {onerror}, {followlinks}, {datatype}, {type})

**top:**
需要遍历的路径

**topdown:**
如果topdown为True或未指定,则目录的元组在其任何工作空间的元组之前生成(工作空间是自顶向下生成的)。如果topdown为False,工作空间的元组是在其所有子工作空间的元组之后生成的(工作空间是自底向上生成的)。
当topdown为True时,可以就地修改dirnames列表,并且Walk()将只递归到名称仍然在dirnames中的子工作区中。这可以用来限制搜索,强制执行特定的访问顺序,甚至在再次恢复Walk()之前,将调用者创建或重命名的目录通知Walk()。当topdown为False时修改dirname是无效的,因为在自底向上模式下,dirname中的工作空间是在生成dirpath本身之前生成的。(默认值为 True)

**onerror**
默认情况下,错误被忽略。onerror函数将被一个OSError实例调用。
该函数可用于报告错误并继续遍历,或引发异常以中止。
注:文件名称作为文件名异常对象的属性。
(默认值为None)

**followlinks:**
默认情况下,Walk()不会遍历连接文件。将followlinks设置为True以访问连接文件。
(默认值为False)

**datatype:**
用于限制返回结果的数据类型。有效的数据类型是:
Any -返回所有数据类型。相当于使用None或跳过参数。
CadDrawing
CadastralFabric
Container
FeatureClass
FeatureDataset
Geo
GeometricNetwork 
LasDataset 
Layer
Locator
Map
MosaicDataset 
PlanarGraph 
RasterBand 
RasterCatalog 
RasterDataset 
RelationshipClass 
RepresentationClass 
SchematicDataset 
Style
Table
Terrain
Text
Tin
Tool
Toolbox
Topology 
如果以列表或元组的形式输入,则支持多种数据类型。
for dirpath, dirnames, filenames in arcpy.da.Walk(workspace,datatype=['RasterBand', 'RasterDataset']):
(默认值为None)

**type**
可以根据类型进一步限制特征和栅格数据类型。
ALL -返回所有类型。相当于使用None或跳过参数。
ANY -返回所有类型。相当于使用None或跳过参数。
有效的要素类型有:
Multipatch 只返回多补丁特性类。
Multipoint 只返回多点特征类。
Point 只返回点特征类。
Polygon-只返回多边形特征类。
Polyline-只返回折线特征类。
有效的栅格类型有:
BIL — Esri波段线形交错
BIP — Esri波段像素交错
BMP — 位图栅格数据格式
BSQ — Esri 波段顺序文件
DAT — ENVI DAT 文件
GIF — Graphic Interchange Format栅格数据集
GRID — Esri Grid 栅格数据格式
IMG — ERDAS IMAGINE 栅格数据格式
JP2 — jpeg2000栅格数据集格式
JPG — Joint Photographic Experts Group栅格数据格式
PNG — Portable Network Graphic 栅格数据格式
TIF — Tag Image File Format 栅格数据集

如果以列表或元组的形式输入,则支持多种数据类型:
for dirpath, dirnames, filenames in arcpy.da.Walk(workspace,datatype='FeatureClass', type=['Polygon', 'Polyline']):
(默认值为None)

==================================================================
Generator(生成器):
 提供的三元组包括工作空间、目录名称和文件名称(dirpath、dirnames 和 filenames)。
dirpath 是以字符串形式存在的工作空间路径。
dirnames 是子目录和 dirpath 中其他工作空间的名称列表。
filenames 是 dirpath 中非工作空间内容的名称列表。
注:列表中的名称仅包括基本名称,不包括路径组件。为在 dirpath 中获得文件或目录的完整路径(始于顶级),请运行 os.path.join(dirpath,名称)。

解决方案:

使用 arcpy.da.Walk 函数为面要素类创建目录
注意将datatype设置为FeatureClass,这样就可以一下子将所有的要素类都遍历到一个列表中了

import arcpy
import os
workspace = "c:/data"
feature_classes = []
for dirpath, dirnames, filenames in arcpy.da.Walk(workspace,
                                                  datatype="FeatureClass",
                                                  type="Polygon"):
    for filename in filenames:
        feature_classes.append(os.path.join(dirpath, filename))

以上便是我对arcpy.ListFeatureClasses()函数方法的整理及延展,欢迎各位大佬留言指正。

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

激动的兔子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值