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.