Come fare un inventario GIS?


21

Il mio ufficio vedrà un grande cambiamento nella sua sezione GIS. Questa sezione è operativa dagli anni '80 e contiene un'enorme raccolta di dati GIS (es. File di forma, file raster, dati, ecc.) Ma non è mai stata oggetto di inventario. Adesso succederà.

Esiste un modo automatizzato per estrarre tutte le informazioni sui dati GIS (ad es. Shapefile, copertura di informazioni sull'arco, file di livello, * .mxd, gdb, file raster e altro) da un PC a un file Excel? Le informazioni possono includere la data di creazione, la data dell'ultima modifica, il nome della cartella o del contenitore, ecc.


3
A quale versione di ArcGIS sei? A 10.1 SP1 questo è reso molto più semplice da arcpy.da.walk.
blah238,

1
Non fa mai male iniziare prendendo un inventario visivo e disegnando un disegno prima di iniziare ad attaccare un vecchio server con Python.
Roy,

In risposta a @Roy - potresti considerare di iniziare con questo download GRATUITO: voyagergis.com
Czed

Potresti anche prendere in considerazione un portale di ricerca di metadati, come il Geoportal Server
Stephen Lead,

Risposte:


18

Questo funziona per me, usando la arcpy.da.Walkfunzione di 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])

Il csvmodulo viene anche utilizzato per semplificare la scrittura del file di output. Excel può aprire i file CSV in modo da poterli visualizzare come fogli di calcolo.

Vedere la arcpy.Describefunzione per ulteriori proprietà che è possibile includere nell'output.

Se stai specificamente cercando di analizzare le informazioni dai metadati effettivi , vedi lo script in questa risposta: Creazione di una tabella contenente tutti i nomi di file (e possibilmente metadati) in un file geodatabase


@ blah239, Excel può anche aprire file di testo, basta fornire il deliminatore.
artwork21

4
È vero, ma il dialetto CSV di Excel si occupa di tutte le questioni difficili come virgolette incorporate, newline e virgole. Inoltre, non è necessario passare attraverso una procedura guidata per aprire il file.
blah238,

grazie per il chiarimento.
artwork21

10

Quando usi Python, devi usare i moduli corretti per fare quello che vuoi. Per trovare tutti i file in una directory con estensione shp, ad esempio, ci sono soluzioni molto più semplici presentate senza interruzione, il che è terribile ... (come la soluzione presentata da Nathan W, ma ce ne sono molte, molte altre, solo cerca su Internet)

Alcuni esempi con moduli rilevanti:

1) con il modulo glob:

solo shapefile:

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

shapefile e geodatabase:

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

se vuoi cercare anche nelle sottodirectory:

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

2) con os.listdir e comprensione dell'elenco (in due righe) -> elenco dei risultati

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) con modulo fnmatch:

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

e molte altre soluzioni, ricorsive ecc.


come si ignorano i file .shp.xml usando il metodo '* .shp'?
artwork21

1
Hai provato? glob.glob ("*. shp") non restituisce i file .shp.xml da parte mia.
blah238,

@ blah238, no non ci ho provato, grazie.
artwork21

5

Grazie artwork21 e Nathan W per la risposta. E sì, il codice di Nathen ha reso la magia.

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

Solo nome file e posizione. Il PC con cui lavorerò ha un sacco di file di copertura (il file arc-info), funzionerà anche su di loro?


Per quanto riguarda la versione del mio software, utilizzo AG 10.1 SP1, ma altri PC usano varie versioni del software ESRI, principalmente informazioni sull'arco.
blu_sr,

In realtà non sono sicuro se arcpy.da.walkelencherò le copertine, ma immagino di no poiché non è elencato nei filtri dataType o type.
blah238,

Ecco una versione più breve del codice: gist.github.com/4577289 . Dato che la logica di shp, lyr e img è la stessa, li facciamo in una iffrase.
Nathan W,

2
Inoltre non hai bisogno del txt.close()se lo stai usando withperché lo farà per te quando il blocco esce.
Nathan W,

4

Se hai ArcGIS Desktop 10.0 (o uno qualsiasi dei suoi service pack), penso che la soluzione migliore sia scrivere uno script Python che usi os.walk per cercare una directory GIS definita e cercare estensioni di file GIS comuni come .shp,. gdb, .mdb, ecc ... e scrive il risultato in un file di testo delimitato da virgole. È quindi possibile portare il file di testo in Excel, vedere l'esempio di codice di seguito:

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

Se si utilizza ArcGIS 10.1 (o versione successiva) per Desktop, è disponibile un'altra risposta che utilizza arcpy.da.Walk che non era disponibile alla versione 10.0 o precedente.


Potresti voler controllare il tuo codice. Cercherà gdb solo se trova prima una forma. Sembra che il rientro sia tutto incasinato.
Nathan W,

Anche io non trovo l'uso corretto qui. Sarebbe meglio scrivere così: gist.github.com/4577289 Naturalmente non testato.
Nathan W,

non pensare a ** **
Nathan W

Altre semplificazioni potrebbero includere l'utilizzo del csvmodulo per astrarre un po 'la scrittura del file e l'utilizzo arcpy.da.walka 10.1 SP1 per consentire ad ArcGIS di gestire l'elenco dei tipi di dati GIS.
blah238,

Grazie! Sto lavorando per estrarre quante più informazioni possibile da quel vecchio database.
blu_sr,

0

Se si desidera evitare la programmazione, questo potrebbe essere il metodo più semplice e veloce.

Esiste un componente aggiuntivo per Excel chiamato ASAP Utilities . C'è una prova gratuita di 90 giorni, ma dopo è $ 49 USD per uso aziendale. È gratuito per gli studenti o per uso personale. Il componente aggiuntivo aggiunge molte funzioni utili. Uno dei quali è la creazione di un elenco di file in una struttura di cartelle. Fornisce inoltre proprietà del file. Se lo desideri, puoi limitare i risultati per tipo di file.

Ecco un video su come eseguire questa operazione.

Ho usato questo componente aggiuntivo prima e i risultati sono molto rapidi.

Nota, non sono affiliato con questa società di software.


1
Thnx Fezter, ma non credo che recupererà i tipi di file GIS come prima. .Shp non è solo .shp, contiene molti altri file.
blu_sr,

Può ottenere qualsiasi tipo di file in una cartella.
Fezter

2
@Fetzer a meno che non sappia leggere i set di dati GIS da file e database personali, sarei sorpreso se funzionasse qui poiché non esiste una vera correlazione tra ciascun file e ciascun set di dati
nicksan

Oh sì, hai ragione. Mi mancava che tu avessi geodatabase. Questo non funzionerebbe per te. Mi dispiace per quello. Ma è comunque una buona spina.
Fezter

0

Non sono riuscito a far funzionare completamente le altre risposte.

Nel primo esempio, in una directory con entrambi i geodatabase e gli shapefile, ho ottenuto solo un elenco delle classi di feature nel geodatabase, ma quando ho commentato la parte dei geodatabase dello script, ho ottenuto un elenco di shapefile.

Nel secondo esempio, la porzione di geodatabase non ha funzionato affatto, quindi ho copiato nella parte di geodatabase del primo esempio. Ancora una volta, ho ottenuto un elenco di soli geodatabase.

Poi mi ha colpito: i geodatabase vengono letti prima degli shapefile e lo script si ferma nella parte breaknella geodatabase.

Essendo un principiante di Python non so perché breaksia necessario, ma senza di esso lo script sembra andare in un ciclo infinito, ma poiché breakè necessario mi è venuto in mente che mettere i geodatabase parte nel proprio ciclo, dopo l'altro file i tipi sono elencati, risolverebbe il problema:

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

Quando l'ho fatto ho ottenuto il mio elenco completo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.