GIS 인벤토리를 만드는 방법은 무엇입니까?


21

내 사무실은 GIS 섹션에서 큰 변화를 볼 것입니다. 이 섹션은 1980 년대부터 운영되어 왔으며 GIS 데이터 (예 : 쉐이프 파일, 래스터 파일, 데이터 등)가 많이 수집되어 있지만 인벤토리를 거치지 않았습니다. 이제 일어날 것입니다.

PC에서 Excel 파일로 GIS 데이터에 대한 모든 정보 (예 : shapefile, arc-info 적용 범위, 레이어 파일, * .mxd, gdb, 래스터 파일 등)를 자동으로 추출하는 방법이 있습니까? 정보에는 생성 날짜, 마지막 편집 날짜, 폴더 또는 컨테이너 이름 등이 포함될 수 있습니다.


3
현재 어떤 ArcGIS 버전이 있습니까? 10.1 SP1에서는이 기능이 훨씬 쉬워졌습니다 arcpy.da.walk.
blah238

1
파이썬으로 오래된 서버를 공격하기 전에 시각적 인 인벤토리를 가져 와서 디자인을 스케치하여 시작하는 것이 결코 아프지 않습니다.
Roy

@Roy 님의 답변에-당신은이 무료 다운로드로 시작하는 것을 고려할 수도 있습니다 : voyagergis.com
Czed

Esri의 무료 Geoportal Server
Stephen Lead

답변:


18

이것은 arcpy.da.WalkArcGIS 10.1 SP1 의 기능을 사용하여 저에게 효과적입니다 .

import arcpy, csv, os

workspace = r"c:\GISData"
output = r"C:\temp\test.csv"

with open(output, 'wb') as csvfile:
    csvwriter = csv.writer(csvfile)
    for dirpath, dirnames, filenames in arcpy.da.Walk(workspace):
        for filename in filenames:
            desc = arcpy.Describe(os.path.join(dirpath, filename))
            csvwriter.writerow([desc.catalogPath, desc.name, desc.dataType])

csv모듈은 출력 파일 작성을 단순화하는 데에도 사용됩니다. Excel에서는 CSV 파일을 열어 스프레드 시트로 볼 수 있습니다.

arcpy.Describe출력에 포함 할 수있는 추가 특성에 대해서는 기능을 참조하십시오 .

실제 메타 데이터 에서 정보를 구체적으로 분석하려는 경우이 답변의 스크립트를 참조하십시오 . 파일 지오 데이터베이스의 모든 파일 이름 (및 메타 데이터)이 포함 된 테이블 만들기


@ blah239, Excel은 텍스트 파일을 열 수도 있습니다. 델리 미네 이터를 제공하면됩니다.
artwork21

4
그러나 Excel CSV 방언은 따옴표, 줄 바꿈 및 쉼표와 같은 까다로운 문제를 모두 처리합니다. 또한 파일을 열기 위해 마법사를 거치지 않아도됩니다.
blah238

설명을 위해 thx.
artwork21

10

Python을 사용할 때는 올바른 모듈을 사용하여 원하는 것을 수행해야합니다. 예를 들어 확장자가 shp 인 디렉토리에서 모든 파일을 찾으려면 나누기없이 제공되는 훨씬 간단한 솔루션이 있습니다. 인터넷 검색)

관련 모듈이있는 몇 가지 예 :

1) 글로브 모듈 사용시 :

shapefile 만 해당 :

import glob
import os
os.chdir("mydir")
for files in glob.glob("*.shp"):
    print files

셰이프 파일 및 지오 데이터베이스 :

import glob
types = ('*.shp', '*.gbd') # the tuple of file types
files_grabbed = []
for files in types:
     files_grabbed.extend(glob.glob(files)) #files_grabbed = the list of shp and gbd files

하위 디렉토리에서도 검색하려는 경우 :

import glob
for f in glob.iglob("/mydir/*/*.shp"): #search immediate subdirectories 
    print f

2) os.listdir 및 목록 이해 (두 줄로)-> 결과 목록

path = 'mydir'
shape_files = [f for f in os.listdir(path) if f.endswith('.shp')]
gdb_files = [f for f in os.listdir(path) if f.endswith('.gdb')]

3) fnmatch 모듈 사용시 :

import fnmatch
for file in os.listdir('path'):
    if fnmatch.fnmatch(file, '*.shp'):
        print file

많은 다른 솔루션, 재귀 등


'* .shp'방법을 사용하여 .shp.xml 파일을 어떻게 무시합니까?
artwork21

1
해봤 어? glob.glob ( "*. shp")가 내 끝에 .shp.xml 파일을 반환하지 않습니다.
blah238

@ blah238, 시도하지 않았다, thx.
artwork21

5

귀하의 답변에 대해 artwork21과 Nathan W에게 감사드립니다. 네, 네텐의 코드는 마법을 만들었습니다.

import os, arcpy

#create blank text file
with open("C:\\Temp\\GISlayers.txt", "w") as txt:
for root, dirs, files in os.walk("C:\\Temp\\temp"):
    for f in files:
        #look for shapefiles
        if f.endswith('.shp'):
            desc = arcpy.Describe(root + "\\" + f)
            #write info to text file
            txt.write(desc.name + "," + desc.catalogPath + "\n")

        #look for file geodatabases
        if f.endswith('.gdb'):
            desc = arcpy.Describe(root)
            for child in desc.children:
                #write info to text file
                txt.write(child.name + "," + child.path + "\n")

        #look for layer files
        if f.endswith('.lyr'):
            desc = arcpy.Describe(root + "\\" + f)
            #write info to text file
            txt.write(desc.name + "," + desc.catalogPath + "\n")

        #look for img file
        if f.endswith('.img'):
            desc = arcpy.Describe(root + "\\" + f)
            #write info to text file
            txt.write(desc.name + "," + desc.catalogPath + "\n")

파일 이름과 위치 만 내가 작업 할 PC에는 많은 적용 범위 (arc-info 파일) 파일이 있으며, 그들도 작동합니까?


내 소프트웨어 버전은 AG 10.1 SP1을 사용하지만 다른 PC는 다양한 버전의 ESRI 소프트웨어-Arc 정보를 주로 사용합니다.
blu_sr

arcpy.da.walk적용 범위를 나열 할지 여부 는 실제로 확실하지 않지만 dataType 또는 type 필터에 나열되지 않으므로 추측하지 않습니다.
blah238

여기에 코드의 짧은 버전입니다 : gist.github.com/4577289 . shp, lyr 및 img의 논리가 동일하므로 한 if문장으로 만 수행합니다 .
Nathan W

2
블록이 종료 될 때 그렇게하기 때문에 txt.close()사용 중인 경우 도 필요하지 않습니다 with.
Nathan W

4

ArcGIS Desktop 10.0 (또는 서비스 팩)이 있다면 os.walk를 사용하여 정의 된 GIS 디렉토리를 살펴보고 .shp와 같은 일반적인 GIS 파일 확장자를 검색하는 python 스크립트를 작성하는 것이 가장 좋습니다. gdb, .mdb 등 ...을 입력하고 결과를 쉼표로 구분 된 텍스트 파일에 씁니다. 그런 다음 텍스트 파일을 Excel로 가져올 수 있습니다 (아래 코드 예제 참조).

import os, arcpy

#create blank text file
txt = open("C:\\Temp\\GISlayers.txt", "w")

for root, dirs, files in os.walk("C:\\Temp\\temp"):
    for f in files:

        #look for shapefiles
        foundSHP = f.find(".shp")
        if foundSHP >0:
            checkEXT = f[-3:]
                if checkEXT <> "xml":
                    desc = arcpy.Describe(root + "\\" + f)
                    #write info to text file
                    txt.write(desc.name + "," + desc.catalogPath + "\n")

        #look for file geodatabases
        foundGDB = f.find(".gdb")
        if foundGDB >0:
            desc = arcpy.Describe(root)
            for child in desc.children:
            #write info to text file
            txt.write(child.name + "," + child.path + "\n")
        break
txt.close()

데스크탑에 ArcGIS 10.1 이상을 사용하는 경우 10.0 이전에는 사용할 수 없었던 arcpy.da.Walk를 사용하는 또 다른 답변이 있습니다.


코드를 확인하고 싶을 수도 있습니다. 모양을 먼저 찾은 경우에만 gdb를 검색합니다. 들여 쓰기가 모두 엉망인 것 같습니다.
Nathan W

또한 f.find가 올바른 사용법은 아닙니다. 이것은 다음과 같이 작성하는 것이 좋습니다 : gist.github.com/4577289 물론 테스트되지 않았습니다 .
Nathan W

f.find **를 생각하지 마십시오
Nathan W

다른 단순화로는 csv모듈을 사용하여 파일 쓰기 비트를 추상화하고 arcpy.da.walkArcGIS가 GIS 데이터 유형을 처리하도록 10.1 SP1을 사용하는 것이 포함될 수 있습니다.
blah238

감사! 나는 그 오래된 데이터베이스에서 최대한 많은 정보를 추출하려고 노력하고 있습니다.
blu_sr

0

프로그래밍을 피하려면이 방법이 가장 쉽고 빠른 방법 일 수 있습니다.

ASAP Utilities 라는 Excel 용 추가 기능이 있습니다 . 거기에있다 90 일 무료 평가판 그러나 그 후에는 비즈니스 용으로 $ 49 달러이다. 학생 또는 개인용으로 무료입니다. 애드온은 많은 유용한 기능을 추가합니다. 그중 하나가 폴더 구조 로 파일 목록을 작성 중입니다 . 파일 속성도 제공합니다. 원하는 경우 파일 유형별로 결과를 제한 할 수 있습니다.

이 작업을 수행하는 방법에 대한 비디오 가 있습니다.

전에이 부가 기능을 사용해 보았으며 결과는 매우 빠릅니다.

참고로이 소프트웨어 회사와 제휴하지 않습니다.


1
Thnx Fezter이지만 이전과 같이 GIS 파일 형식을 가져올 것이라고 생각하지 않습니다. .shp는 .shp뿐만 아니라 다른 파일도 많이 있습니다.
blu_sr

폴더의 모든 파일 형식을 가져올 수 있습니다.
Fezter

2
@Fetzer는 각 파일 및 각 데이터 세트 사이의 진정한 상관 관계가 아니기 때문에이 여기서 일한다면 나는 놀랄 것, 파일 및 개인 지오 데이터베이스에서 GIS 데이터 세트를 읽는 방법을 알지 못하는 경우
nicksan

네 맞아요 지리 데이터베이스가 있다는 것을 놓쳤습니다. 이것은 당신에게 효과가 없습니다. 미안합니다. 그러나 어쨌든 좋은 플러그입니다.
Fezter

0

다른 답변을 완전히 얻지 못했습니다.

첫 번째 예에서는 지오 데이터베이스와 shapefile이 모두있는 디렉토리에서 지오 데이터베이스의 기능 클래스 목록 만 얻었지만 스크립트의 geodatabases 부분을 주석 처리하면 shapefile 목록이 표시됩니다.

두 번째 예에서는 geodatabases 부분이 전혀 작동하지 않았으므로 첫 번째 예의 geodatabases 부분에 복사했습니다. 다시 한 번 지리 데이터베이스 만 있습니다.

그런 다음 나에게 연락했다. 지오 데이터베이스는 shapefile 전에 읽히고 스크립트는 break 는 지오 데이터베이스 부분에서 .

파이썬 초보자이기 때문에 왜 break필요한지 알지 못하지만 스크립트가 없으면 무한 루프에 빠지는 것처럼 보이지만 break필요하기 때문에 지오 데이터베이스 부분을 다른 파일 다음에 자체 루프에 넣는 것이 나에게 발생했습니다. 유형이 나열되면 문제를 해결할 수 있습니다.

#create blank text file with open("C:\\Temp\\GISlayers.txt", "w") as txt: for root, dirs, files in os.walk("C:\\Temp\\temp"): for f in files: #look for shapefiles, etc. [code...] for f in files: #look for geodatabases [code...]

내가 그렇게했을 때 나는 전체 목록을 얻었다.

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