기능 데이터 세트를 포함하여 File Geodatabase의 모든 기능 클래스를 나열 하시겠습니까?


24

파이썬에서 피처 내부 데이터 셋을 포함하여 파일 지오 데이터베이스 (* .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을 찾고 있지만 모든 버전을 한곳에서 수집 할 수도 있습니다).


1
관련이 있지만 최신 Q & A (사용 포함 arcpy.da.Walk)는 GIS 인벤토리를 만드는 방법
blah238

답변:


34

arcgis10에 대한이 루틴은 gdb 내의 모든 fc (기능 데이터 세트 내의 독립형 OR)를 리턴합니다. 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)

멋지고 깨끗합니다!
채드 쿠퍼

1
감사합니다 내가 yield 문을 처음 접했을 때, 그것을 알아 내기 위해 약간의 독서 를해야했습니다. 샘플이 arcgis v10 용임을 기억하지 못했습니다.
matt wilkie

1
죄송합니다. 예, 10.x입니다. 그리고 예, 수율이 뛰어나고 깨끗한 코드를 만듭니다.
gotchula

고마워요, 나는 이것이 오래된 게시물이라는 것을 알고 있지만 매주 추가하는 데이터베이스를 관리하는 데 매우 유용하다는 것을 알았습니다. + [ ''] : 세 번째 줄에서 무엇을 달성했는지 물어봐도 될까요?
Dylan Warburg

1
arcpy.ListDatasets 루프 내에서 arcpy.ListFeatureClasses를 호출합니다. 피처 데이터 셋 (일명 독립 피처 클래스) 내에없는 피처 클래스를 포함해야하므로, ''를 데이터 셋 목록에 추가하여 ListFeatureClasses가 fds 변수로 ''로 호출됩니다.
gotchula

12

내가 사용하는 결국 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는 또한 와일드 카드 필터링을 추가합니다. "Hydro"를 포함하는 기능 데이터 세트 내에서 "HD_"로 시작하는 기능 클래스 만 처리

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

. * 이제 Github에서 10.x로 업그레이드되었습니다. arcgis 9.3은 여기를 참조 하십시오 .


1
yield여기서 사용하지 않는 이유에 대해 잘 모르겠습니다 . 우선, 당신이 말하는 "손잡이"는 전혀 핸들이 아니며 단지 문자열 일뿐입니다. 그리고 여러 반복을 위해 피처 클래스 목록을 유지하려는 경우에도 생성기 함수로 유지하고 "목록 화"할 수 있습니다. my_list = list(generator_function(args))그러면 생성기를 평가하고 결과를 목록 변수에 저장합니다.
blah238

@ blah238 : 아. 나는 여전히 수확량을 구하지 않는 것 같아요. 나는 같은 문장이 무엇 fcs = fcs.append(...)보다 훨씬 빨리하고 있는지 이해한다 fcs = list(yield(...)).
매트 윌키

8

나는이 질문에 9.3 태그가 붙어 있지만 10.1 이후에 같은 대답을 찾는 사람은 arcpy.da.Walk 사용하는 것이 좋습니다 . ListDatasets / FeatureClasses / Rasters / etc보다 빠르고 정확합니다.

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)

walk 함수는 python 's walk 와 같은 방식으로 작동합니다 . 주어진 경로와 각 반복에서 디렉토리를 반복하고, 루트는 디렉토리의 전체 경로를 나타내며, dirs 및 데이터 세트는 포함 된 서브 디렉토리 및 파일의 목록입니다.

지오 데이터베이스를 탐색 할 때 지형지 물 데이터 세트는 디렉토리와 같은 방식으로 처리됩니다. 루트 폴더에 데이터 세트 및 기능 데이터 세트 만 나열하고 컨텐츠를보기 위해 기능 데이터 세트를 열지 않으려면 다음을 수행하십시오.

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

나는 주어진대로 더 빨리 걸릴 것이다; "보다 정확한"확장을 할 수 있습니까? 감사.
매트 윌키

ListDatasets, ListFeatureClasses 등이 항상 올바른 데이터 세트를 반환하지는 않습니다. 또한 SDE와 파일 GDB간에 다른 결과가 나타납니다. 정확한 문제는 기억 나지 않지만 arcpy.List 사용을 중단했습니다. 결과를 신뢰할 수 없었기 때문입니다.
jon_two

5

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
>>>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.