Jak zrobić inwentaryzację GIS?


21

Moje biuro zobaczy dużą zmianę w dziale GIS. Ta sekcja działa od lat 80. XX wieku i ma ogromną kolekcję danych GIS (tj. Plików kształtów, plików rastrowych, danych itp.), Ale nigdy nie była przeglądana. To się stanie.

Czy istnieje zautomatyzowany sposób wyodrębnienia wszystkich informacji o danych GIS (tj. Plik kształtów, pokrycie informacji łukowych, plik warstw, * .mxd, gdb, plik rastrowy i inne) z komputera do pliku Excel? Informacje mogą obejmować datę utworzenia, datę ostatniej edycji, nazwę folderu lub kontenera itp.


3
W jakiej wersji ArcGIS jesteś? W wersji 10.1 SP1 jest to znacznie łatwiejsze arcpy.da.walk.
blah238

1
Na początku nigdy nie boli, biorąc wizualną inwentaryzację i szkicując projekt, zanim zaczniesz atakować stary serwer pythonem.
Roy

W odpowiedzi na @Roy - możesz rozważyć rozpoczęcie tego BEZPŁATNEGO pobierania: voyagergis.com
Czed

Możesz także rozważyć portal wyszukiwania metadanych, taki jak darmowy serwer Geoportal
Stephen Lead

Odpowiedzi:


18

Działa to dla mnie przy użyciu arcpy.da.Walkfunkcji ArcGIS 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])

csvModuł służy również do uproszczenia zapisu pliku wyjściowego. Excel może otwierać pliki CSV, dzięki czemu można je wyświetlać jako arkusze kalkulacyjne.

Zobacz arcpy.Describefunkcję dla dodatkowych właściwości, które możesz zawrzeć w danych wyjściowych.

Jeśli specjalnie chcesz oddzielić informacje od rzeczywistych metadanych , zobacz skrypt w tej odpowiedzi: Tworzenie tabeli zawierającej wszystkie nazwy plików (i ewentualnie metadane) w geobazie pliku


@ blah239, excel może również otwierać pliki tekstowe, wystarczy podać ogranicznik.
artwork21

4
To prawda, ale dialekt Excel CSV zajmuje się wszystkimi trudnymi zagadnieniami, takimi jak osadzone cytaty, znaki nowej linii i przecinki. Nie wymaga również przejścia przez kreatora, aby po prostu otworzyć plik.
blah238

dziękuję za wyjaśnienie.
artwork21

10

Kiedy używasz Pythona, musisz używać odpowiednich modułów, aby robić to, co chcesz. Na przykład, aby znaleźć wszystkie pliki w katalogu z rozszerzeniem shp, istnieją znacznie prostsze rozwiązania, które zostały przedstawione bez przerwy, co jest okropne ... (jak rozwiązanie przedstawione przez Nathana W, ale jest wiele, wiele innych, po prostu szukaj w Internecie)

Kilka przykładów z odpowiednimi modułami:

1) z modułem glob:

tylko pliki kształtu:

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

pliki kształtu i geobazy:

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

jeśli chcesz szukać również w podkatalogach:

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

2) z os.listdir i listami (w dwóch wierszach) -> lista wyników

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) z modułem fnmatch:

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

i wiele innych rozwiązań, rekurencyjnych itp.


Jak zignorować pliki .shp.xml przy użyciu metody „* .shp”?
artwork21

1
Próbowałeś? glob.glob („*. shp”) nie zwraca plików .shp.xml na moim końcu.
blah238

@ blah238, nie próbowałem, dzięki.
artwork21

5

Dzięki artwork21 i Nathanowi W za odpowiedź. I tak, kod Nathena stanowił magię.

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")

Tylko nazwa pliku i lokalizacja. Komputer, z którym będę pracować, ma duży plik pokrycia (plik informacji o łuku), czy on też na nich zadziała?


Jeśli chodzi o wersję mojego oprogramowania, używam AG 10.1 SP1, ale inne komputery używają różnych wersji oprogramowania ESRI - głównie informacje Arc.
blu_sr

Właściwie nie jestem pewien, czy arcpy.da.walkwyświetli listę pokrycia, ale nie sądzę, ponieważ nie jest wymieniony w typie danych lub typie filtrów.
blah238,

Oto krótsza wersja kodu: gist.github.com/4577289 . Ponieważ logika shp, lyr i img jest taka sama, po prostu wykonujemy je w jednym ifzdaniu.
Nathan W

2
Nie potrzebujesz również, txt.close()jeśli używasz, withponieważ zrobi to za Ciebie, gdy blok wyjdzie.
Nathan W

4

Jeśli masz ArcGIS Desktop 10.0 (lub którykolwiek z jego dodatków Service Pack), myślę, że najlepszym rozwiązaniem jest napisanie skryptu python, który używa os.walk do przeglądania zdefiniowanego katalogu GIS i wyszukiwania popularnych rozszerzeń plików GIS, takich jak .shp,. gdb, .mdb itp. ... i zapisuje wynik do pliku tekstowego rozdzielanego przecinkami. Następnie możesz doprowadzić plik tekstowy do programu Excel, patrz przykład kodu poniżej:

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()

Jeśli korzystasz z ArcGIS 10.1 (lub nowszego) na pulpicie, istnieje inna odpowiedź, która używa arcpy.da.Walk, która nie była dostępna w wersji 10.0 lub wcześniejszej.


Możesz sprawdzić swój kod. Będzie szukał gdb tylko wtedy, gdy najpierw znajdzie kształt. Wydaje się, że wcięcie jest w całości pomieszane.
Nathan W

Nie twierdzę też, że tutaj jest prawidłowe użycie. Lepiej byłoby napisać w ten sposób: gist.github.com/4577289 Oczywiście niesprawdzone .
Nathan W

nie myśl f.find **
Nathan W

Inne uproszczenia mogą obejmować użycie csvmodułu do abstrakcyjnego zapisania pliku i użycie wersji arcpy.da.walk10.1 SP1, aby ArcGIS mógł wyświetlić listę typów danych GIS.
blah238,

Dzięki! Pracuję nad wydobyciem jak największej ilości informacji z tej starej bazy danych.
blu_sr,

0

Jeśli chcesz uniknąć programowania, może to być najłatwiejsza i najszybsza metoda.

Istnieje dodatek do programu Excel o nazwie Narzędzia ASAP . Jest 90-dniowy bezpłatny okres próbny, ale potem kosztuje 49 USD na użytek biznesowy. Jest bezpłatny do użytku studenckiego lub osobistego. Dodatek dodaje wiele przydatnych funkcji. Jednym z nich jest utworzenie listy plików w strukturze folderów. Zapewnia również właściwości pliku. Możesz ograniczyć wyniki według typu pliku, jeśli chcesz.

Oto wideo jak to zrobić.

Użyłem tego dodatku wcześniej, a wyniki są bardzo szybkie.

Uwaga: nie jestem związany z tym producentem oprogramowania.


1
Thnx Fezter, ale nie sądzę, aby pobierał typy plików GIS jak wcześniej. .Shp to nie tylko .shp, zawiera wiele innych plików.
blu_sr

Może uzyskać wszystkie typy plików w folderze.
Fezter

2
@Fetzer, chyba że wie, jak odczytywać zestawy danych GIS z geodezyjnych plików i osobistych baz danych, byłbym zaskoczony, gdyby działał tutaj, ponieważ nie ma prawdziwej korelacji między każdym plikiem a każdym
zestawem

O tak, masz rację. Tęskniłem za tym, że masz geobazy. To by ci nie pomogło. Przepraszam za to. Ale i tak jest to dobra wtyczka.
Fezter

0

Nie mogłem sprawić, by pozostałe odpowiedzi w pełni zadziałały.

W pierwszym przykładzie, w katalogu zawierającym zarówno geobazy, jak i pliki shapefile, dostałem tylko listę klas obiektów w geobazie, ale kiedy skomentowałem część skryptu dla geobaz, dostałem listę plików shapefile.

W drugim przykładzie część geobaz danych w ogóle nie działała, więc skopiowałem w części geobazach pierwszego przykładu. Znów mam listę tylko geobaz.

Wtedy mnie uderzyło: geobazy są odczytywane przed plikami kształtu, a skrypt zatrzymuje się na break w części geobazy.

Będąc nowicjuszem w Pythonie nie wiem, dlaczego breakjest potrzebny, ale bez niego skrypt wydaje się iść w nieskończoną pętlę, ale ponieważ breakpotrzebowałem, przyszło mi do głowy, że umieszczenie części geobazowych we własnej pętli, po drugim pliku typy są wymienione, rozwiązałoby problem:

#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...]

Kiedy to zrobiłem, dostałem pełną listę.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.