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.