Wie erstelle ich ein GIS-Inventar?

21

Mein Büro wird eine große Veränderung in seinem GIS-Bereich erleben. Dieser Abschnitt ist seit den 1980er Jahren in Betrieb und verfügt über eine riesige Sammlung von GIS-Daten (z. B. Shapefiles, Rasterdateien, Daten usw.), hat jedoch noch nie eine Bestandsaufnahme durchlaufen. Jetzt wird es passieren.

Gibt es eine automatisierte Möglichkeit, alle Informationen zu den GIS-Daten (z. B. Shapefile, Lichtbogeninformationen, Layer-Datei, * .mxd, gdb, Rasterdatei usw.) von einem PC in eine Excel-Datei zu extrahieren? Die Informationen können das Erstellungsdatum, das Datum der letzten Bearbeitung, den Ordner- oder Containernamen usw. enthalten.

blu_sr
quelle
3
In welcher Version von ArcGIS sind Sie? Ab 10.1 SP1 wird dies durch deutlich vereinfacht arcpy.da.walk.
blah238
1
Es tut nie weh, zunächst ein visuelles Inventar anzufertigen und ein Design zu skizzieren, bevor Sie einen alten Server mit Python angreifen.
Roy
Als Antwort auf @Roy können Sie mit diesem KOSTENLOSEN
Czed
Sie können auch ein Metadatensuchportal in Betracht ziehen, z. B. den kostenlosen Geoportal-Server von
Stephen Lead,

Antworten:

18

Dies funktioniert für mich mit der arcpy.da.WalkFunktion in 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])

Das csvModul wird auch verwendet, um das Schreiben der Ausgabedatei zu vereinfachen. Excel kann CSV-Dateien öffnen, sodass Sie sie als Tabellenkalkulation anzeigen können.

In der arcpy.DescribeFunktion finden Sie zusätzliche Eigenschaften, die Sie in die Ausgabe aufnehmen können.

Wenn Sie gezielt Informationen aus den eigentlichen Metadaten herausfiltern möchten, lesen Sie das Skript in dieser Antwort: Erstellen einer Tabelle mit allen Dateinamen (und möglicherweise Metadaten) in einer File-Geodatabase

blah238
quelle
@ blah239, Excel kann auch Textdateien öffnen, muss nur das Trennzeichen angeben.
artwork21 20.01.13
4
Stimmt, aber der Excel CSV-Dialekt kümmert sich um alle kniffligen Probleme wie eingebettete Anführungszeichen, Zeilenumbrüche und Kommas. Es ist auch nicht erforderlich, einen Assistenten zu durchlaufen, um die Datei zu öffnen.
blah238
Danke für die Klarstellung.
artwork21
10

Wenn Sie Python verwenden, müssen Sie die richtigen Module verwenden, um das zu tun, was Sie wollen. Um beispielsweise alle Dateien in einem Verzeichnis mit der Erweiterung shp zu finden, gibt es viel einfachere Lösungen, die ohne Unterbrechung präsentiert wurden, was schrecklich ist ... (wie die von Nathan W vorgestellte Lösung, aber es gibt viele, viele andere, nur im Internet suchen)

Einige Beispiele mit relevanten Modulen:

1) mit dem glob modul:

nur Shapefiles:

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

Shapefiles und Geodatabases:

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

wenn Sie auch in den Unterverzeichnissen suchen wollen:

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

2) mit os.listdir und Listenverständnis (in zwei Zeilen) -> Ergebnisliste

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) mit fnmatch modul:

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

und viele andere Lösungen, rekursiv usw.

Gen
quelle
Wie ignoriert man .shp.xml-Dateien mit der '* .shp'-Methode?
artwork21 20.01.13
1
Hast Du es versucht? glob.glob ("*. shp") gibt auf meiner Seite keine .shp.xml-Dateien zurück.
blah238
@ blah238, nein habe nicht versucht, danke.
artwork21 20.01.13
5

Danke artwork21 und Nathan W für deine Antwort. Und ja, Nathens Code machte die Magie.

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

Nur Dateiname und Speicherort. Der PC, mit dem ich arbeiten werde, hat viele Coverage-Dateien (die Arc-Info-Datei). Funktioniert das auch auf ihnen?

blu_sr
quelle
Was die Version meiner Software betrifft, verwende ich AG 10.1 SP1, aber andere PCs verwenden meist verschiedene Versionen der ESRI-Software - Arc info.
blu_sr
Ich bin mir eigentlich nicht sicher, ob arcpy.da.walkDeckungen aufgelistet werden, aber ich würde es nicht raten, da es nicht in den Datentyp- oder Typfiltern aufgeführt ist.
blah238
Hier ist eine kürzere Version des Codes: gist.github.com/4577289 . Da die Logik für shp, lyr und img dieselbe ist, machen wir sie einfach in einer ifAnweisung.
Nathan W
2
Sie brauchen das auch nicht, txt.close()wenn Sie es verwenden, withda es dies für Sie erledigt, wenn der Block beendet wird.
Nathan W
4

Wenn Sie mit ArcGIS Desktop 10.0 (oder einem seiner Service Packs) arbeiten, sollten Sie am besten ein Python-Skript schreiben, das mithilfe von os.walk ein definiertes GIS-Verzeichnis durchsucht und nach gängigen GIS-Dateierweiterungen wie .shp, sucht. gdb, .mdb, etc ... und schreibt das Ergebnis in eine durch Kommas getrennte Textdatei. Sie können dann die Textdatei in Excel bringen, siehe Codebeispiel unten:

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

Wenn Sie ArcGIS 10.1 (oder höher) für Desktop verwenden, gibt es hier eine andere Antwort, die arcpy.da.Walk verwendet, das bei 10.0 oder früher nicht verfügbar war.

artwork21
quelle
Vielleicht möchten Sie Ihren Code überprüfen. Es wird nur nach gdb gesucht, wenn es zuerst eine Form findet. Es sieht so aus, als wäre der Einfall völlig durcheinander.
Nathan W
Ich finde auch nicht die richtige Verwendung hier. Dies wäre besser so zu schreiben: gist.github.com/4577289 Natürlich ungetestet.
Nathan W
glaube nicht, dass f.find **
Nathan W
Weitere Vereinfachungen können die Verwendung des csvModuls zum Abstrahieren des Schreibens der Datei und die Verwendung arcpy.da.walkvon 10.1 SP1 umfassen, damit ArcGIS die Auflistung der GIS-Datentypen handhabt.
blah238
Vielen Dank! Ich arbeite daran, so viele Informationen wie möglich aus dieser uralten Datenbank zu extrahieren.
blu_sr
0

Wenn Sie die Programmierung vermeiden möchten, ist dies möglicherweise die einfachste und schnellste Methode.

Für Excel gibt es ein Add-On namens ASAP Utilities . Es gibt eine kostenlose 90-Tage-Testversion , danach jedoch 49 USD für geschäftliche Zwecke. Es ist kostenlos für Studenten oder den persönlichen Gebrauch. Das Add-On fügt viele nützliche Funktionen hinzu. Eine davon ist das Erstellen einer Liste von Dateien in einer Ordnerstruktur. Es bietet auch Dateieigenschaften. Sie können die Ergebnisse nach Dateityp einschränken, wenn Sie dies wünschen.

Hier ist ein Video, wie das geht.

Ich habe dieses Add-On bereits verwendet und die Ergebnisse sind sehr schnell.

Hinweis: Ich bin nicht mit dieser Softwarefirma verbunden.

Fezter
quelle
1
Thnx Fezter, aber ich denke nicht, dass es die GIS-Dateitypen wie zuvor holen wird. Die .shp-Datei ist nicht nur eine .shp-Datei, sie enthält auch viele andere Dateien.
blu_sr
Es können alle Dateitypen in einem Ordner abgerufen werden.
Fezter
2
@Fetzer es sei denn , es weiß , wie GIS - Datensätze aus File- und Personal - Geodatabases zu lesen, ich überrascht sein würde , wenn es würde hier arbeiten , da es zwischen den einzelnen Datei und jeden Datensatz keine echte Korrelation
nicksan
Oh ja, du hast recht. Ich habe vermisst, dass Sie Geodatabases haben. Das würde bei Ihnen nicht funktionieren. Das tut mir leid. Aber es ist trotzdem ein guter Stecker.
Fezter
0

Ich konnte die anderen Antworten nicht voll zum Laufen bringen.

Im ersten Beispiel wurde in einem Verzeichnis mit Geodatabases und Shapefiles nur eine Liste der Feature-Classes in der Geodatabase angezeigt. Als ich jedoch den Geodatabases-Teil des Skripts auskommentierte, wurde eine Liste der Shapefiles angezeigt.

Im zweiten Beispiel funktionierte der Geodatabases-Teil überhaupt nicht, daher habe ich den Geodatabases-Teil des ersten Beispiels kopiert. Wieder habe ich eine Liste von nur Geodatabases.

Dann traf es mich: Geodatabases werden vor Shapefiles gelesen und das Skript stoppt beim breakTeil in den Geodatabases.

Als Python-Neuling weiß ich nicht, warum das breakbenötigt wird, aber ohne es scheint das Skript in einer Endlosschleife zu laufen, aber da das breakbenötigt wird, kam mir der Gedanke, die Geodatabases nach der anderen Datei in eine eigene Schleife zu stellen Typen aufgelistet sind, würde das Problem lösen:

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

Als ich das tat, bekam ich meine vollständige Auflistung.

bkepl
quelle