如何从python建立文件地理数据库(* .gdb)中所有要素类的列表,包括内部要素数据集?标准示例仅在地理数据库的顶层列出了要素类:

import arcgisscripting, os
gp = arcgisscripting.create(9.3)

gp.workspace = 'd:\scratch.gdb'
fcs = gp.ListFeatureClasses()

for fc in fcs:
    print fc


请指明您的答案适用于哪个ArcGIS Desktop版本(我正在寻找9.3,但我们最好将所有版本收集在一个地方。)

评论

一个相关但最新的问答(包括使用arcpy.da.Walk)是如何制作GIS库存?

另请参阅:如何在“多个文件夹”中列出多个地理数据库的要素类?

#1 楼

此arcgis10例程返回gdb内部的所有fcs(独立或要素数据集)。
只需设置arcpy.env.workspace,然后进行for循环

def listFcsInGDB():
    ''' set your arcpy.env.workspace to a gdb before calling '''
    for fds in arcpy.ListDatasets('','feature') + ['']:
        for fc in arcpy.ListFeatureClasses('','',fds):
            yield os.path.join(arcpy.env.workspace, fds, fc)


评论


干净整洁!

–乍得·库珀
2011年2月8日在19:10

谢谢gotchula!那是我第一次遇到yield语句,不得不做一些阅读才能弄清楚。您忘了注意您的示例适用于arcgis v10。

–马特·威尔基
2011-2-8 22:28

抱歉,是的,这是10.x版本。是的,产量很高,可以生成干净的代码。

–gotchula
2011-2-8 23:09

谢谢gotchula,我知道这是一篇老文章,但是我发现这对于管理每周添加的数据库非常有帮助。我可以问一下第三行中的+ ['']做什么吗?

–迪伦·沃伯格(Dylan Warburg)
18年1月22日在19:09

我在arcpy.ListDatasets循环内调用arcpy.ListFeatureClasses。我需要包括不在任何要素数据集中(也称为独立要素类)的要素类,因此我将''添加到数据集列表中,这导致ListFeatureClasses以''作为fds变量被调用。

–gotchula
18年2月27日在22:51

#2 楼

我最终使用了gotchula的答案,但是没有收益,因为我通常会重复使用创建的FC句柄,并且一旦产生收益后就将其丢弃,那么与fcs.append()相比,我更容易阅读和理解fcs = yield(...)的功能。

def listFcsInGDB(gdb):
    ''' list all Feature Classes in a geodatabase, including inside Feature Datasets '''
    arcpy.env.workspace = gdb
    print 'Processing ', arcpy.env.workspace

    fcs = []
    for fds in arcpy.ListDatasets('','feature') + ['']:
        for fc in arcpy.ListFeatureClasses('','',fds):
            #yield os.path.join(fds, fc)
            fcs.append(os.path.join(fds, fc))
    return fcs

gdb = sys.argv [1]
fcs = listFcsInGDB(gdb)
for fc in fcs:
    print fc            


结果:

d:\> python list-all-fc.py r:\v5\YT_Canvec.gdb
Processing  r:\v5\YT_Canvec.gdb
Buildings_and_structures\BS_2530009_0
Buildings_and_structures\BS_2380009_2
Buildings_and_structures\Tower
Buildings_and_structures\Underground_reservoir
...


这现在在我称为arcplus *的模块中。与其他代码或PYTHONPATH一起放置,然后:

import arcplus
fcs = arcplus.listAllFeatureClasses('d:\default.gdb')
for fc in fcs:
    print "magic happens with: ", fc


Arcplus还添加了通配符过滤;现在只能在Github上处理包含“ Hydro”的要素数据集中以“ HD_”开头的要素类。

fcs = arcplus.listAllFeatureClasses(gdb, fd_filter='*Hydro*', fc_filter='HD_*')


。*已在Github上进行了升级,已升级为10.x。对于arcgis 9.3,请参见此处。

评论


我不确定我在这里避免使用yield的基本原理。首先,您所指的“句柄”根本不是句柄,它们只是字符串。而且,如果您打算保留要素类列表进行多次迭代,则仍可以将其作为生成器函数保留并“列出”它:my_list = list(generator_function(args))这将评估生成器并存储结果在列表变量中。

–blah238
2014年5月22日19:39



@ blah238:哦。我想那时候我还是不屈服。我知道像fcs = fcs.append(...)这样的语句比fcs = list(yield(...))快得多。

–马特·威尔基
2014年5月26日18:07



#3 楼

我意识到这个问题被标记为9.3,但是从10.1起寻找相同答案的人最好使用arcpy.da.Walk。它比ListDatasets / FeatureClasses / Rasters / etc更快,更准确。它遍历给定路径中的目录,并且在每次迭代时,root代表目录的完整路径,而dirs和datasets是其中包含的子目录和文件的列表。

遍历地理数据库时,要素数据集的处理方式与目录相同。如果只想在根文件夹中列出数据集和要素数据集,而又不想打开要素数据集以查看其内容,则可以执行以下操作:

import arcpy
import os

for root, dirs, datasets in arcpy.da.Walk('d:\scratch.gdb'):
    for ds in datasets:
        print os.path.join(root, ds)


评论


我会更快一点。您可以扩展“更准确”吗?谢谢。

–马特·威尔基
16年5月13日在17:56

ListDatasets,ListFeatureClasses等并不总是返回正确的数据集。此外,您在SDE和文件GDB之间会得到不同的结果。我不记得确切的问题,但是我们停止使用arcpy.List ...,因为我们不信任结果。

– jon_two
16年5月16日在12:13

#4 楼

我认为您正在寻找ListDatasets方法。该FGDB包含一个称为“ Wells”的FD,并且其中包含3个FC。对于9.3.1:

C:\WINDOWS\system32>python
Python 2.5.1 (r251:54863, Apr 18 2007, 08:51:08) [MSC v.1310 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import arcgisscripting
>>> gp=arcgisscripting.create(9.3)
>>> d='c:\data\Third_Party_Wells_PRD.gdb'
>>> gp.workspace = d
>>>
>>> fds=gp.ListDatasets('','Feature')
>>> for fd in fds:
...     print fd
...
Wells
>>> for fd in fds:
...     gp.workspace=d + '/' + fd
...     fcs=gp.ListFeatureClasses()
...     for fc in fcs:
...             print fc
...
Third_Party_Wells_BHL
Third_Party_Wells_LAT
Third_Party_Wells_SHL
>>>