Comment faire un inventaire SIG?

21

Mon bureau verra un grand changement dans sa section SIG. Cette section est opérationnelle depuis les années 1980 et possède une énorme collection de données SIG (c.-à-d. Des fichiers de formes, des fichiers raster, des données, etc.) mais n'a jamais fait l'objet d'un inventaire. Maintenant ça va arriver.

Existe-t-il un moyen automatisé d'extraire toutes les informations sur les données SIG (c.-à-d. Fichier de formes, couverture des informations sur l'arc, fichier de couches, * .mxd, gdb, fichier raster, etc.) d'un PC vers un fichier Excel? Les informations peuvent inclure la date de création, la date de dernière modification, le nom du dossier ou du conteneur, etc.

blu_sr
la source
3
À quelle version d'ArcGIS êtes-vous? À 10.1 SP1, cela est rendu beaucoup plus facile par arcpy.da.walk.
blah238
1
Cela ne fait jamais de mal de commencer par faire un inventaire visuel et esquisser un design avant de vous attaquer à un ancien serveur avec python.
Roy
En réponse à @Roy - vous pourriez envisager de commencer par ce téléchargement GRATUIT: voyagergis.com
Czed
Vous pouvez également envisager un portail de recherche de métadonnées, tel que le serveur de géoportail
Stephen Lead

Réponses:

18

Cela fonctionne pour moi, en utilisant la arcpy.da.Walkfonction d'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])

Le csvmodule est également utilisé pour simplifier l'écriture du fichier de sortie. Excel peut ouvrir des fichiers CSV afin que vous puissiez les afficher sous forme de feuilles de calcul.

Voir la arcpy.Describefonction pour les propriétés supplémentaires que vous pouvez inclure dans la sortie.

Si vous cherchez spécifiquement à analyser des informations à partir des métadonnées réelles , consultez le script dans cette réponse: Création d'une table contenant tous les noms de fichiers (et éventuellement des métadonnées) dans une géodatabase fichier

blah238
la source
@ blah239, Excel peut également ouvrir des fichiers texte, il suffit de fournir le suppresseur.
artwork21
4
Certes, mais le dialecte Excel CSV s'occupe de tous les problèmes délicats tels que les guillemets intégrés, les nouvelles lignes et les virgules. Il ne nécessite pas non plus de passer par un assistant pour simplement ouvrir le fichier.
blah238
merci pour la clarification.
artwork21
10

Lorsque vous utilisez Python, vous devez utiliser les modules appropriés pour faire ce que vous voulez. Pour trouver tous les fichiers dans un répertoire avec l'extension shp, par exemple, il existe des solutions beaucoup plus simples qui ont été présentées sans interruption, ce qui est affreux ... (comme la solution présentée par Nathan W, mais il y en a beaucoup, beaucoup d'autres, juste recherche sur Internet)

Quelques exemples avec des modules pertinents:

1) avec le module glob:

fichiers de formes uniquement:

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

fichiers de formes et géodatabases:

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

si vous souhaitez rechercher également dans les sous-répertoires:

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

2) avec os.listdir et compréhension des listes (en deux lignes) -> liste des résultats

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) avec le module fnmatch:

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

et bien d'autres solutions, récursives etc.

gène
la source
comment ignorer les fichiers .shp.xml en utilisant la méthode '* .shp'?
artwork21
1
L'avez-vous essayé? glob.glob ("*. shp") ne renvoie pas les fichiers .shp.xml de mon côté.
blah238
@ blah238, non n'a pas essayé, merci.
artwork21
5

Merci artwork21 et Nathan W pour votre réponse. Et oui, le code de Nathen a fait la 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")

Uniquement le nom et l'emplacement du fichier. Le PC avec lequel je vais travailler a beaucoup de couverture (le fichier arc-info), cela fonctionnera-t-il aussi?

blu_sr
la source
En ce qui concerne la version de mon logiciel, j'utilise AG 10.1 SP1, mais d'autres PC utilisent principalement différentes versions du logiciel ESRI - Arc info.
blu_sr
En fait, je ne sais pas si la arcpy.da.walkliste des couvertures sera répertoriée, mais je suppose que non, car elle n'est pas répertoriée dans les types de données ou les filtres de type.
blah238
Voici une version plus courte du code: gist.github.com/4577289 . Comme la logique pour shp, lyr et img est la même, nous les faisons simplement en une seule ifinstruction.
Nathan W
2
Vous n'avez pas non plus besoin du txt.close()si vous l'utilisez, withcar il le fera pour vous à la fin du bloc.
Nathan W
4

Si vous avez ArcGIS Desktop 10.0 (ou l'un de ses service packs), je pense que votre meilleur pari est d'écrire un script python qui utilise os.walk pour parcourir un répertoire SIG défini et recherche les extensions de fichier SIG courantes telles que .shp,. gdb, .mdb, etc ... et écrit le résultat dans un fichier texte délimité par des virgules. Vous pouvez ensuite importer le fichier texte dans Excel, voir l'exemple de code ci-dessous:

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

Si vous utilisez ArcGIS 10.1 (ou version ultérieure) pour le bureau, il existe une autre réponse ici qui utilise arcpy.da.Walk qui n'était pas disponible à la version 10.0 ou antérieure.

oeuvre21
la source
Vous voudrez peut-être vérifier votre code. Il ne recherchera gdb que s'il trouve d'abord une forme. Semble que l'indentation est tout foiré.
Nathan W
Je ne trouve pas non plus l'utilisation correcte ici. Ce serait mieux écrit comme ceci: gist.github.com/4577289 Non testé bien sûr.
Nathan W
ne pense pas f.find **
Nathan W
D'autres simplifications pourraient inclure l'utilisation du csvmodule pour résumer un peu l'écriture du fichier et l'utilisation arcpy.da.walkde la version 10.1 SP1 pour permettre à ArcGIS de gérer la liste des types de données SIG.
blah238
Merci! Je travaille à extraire autant d'informations que possible de cette vieille base de données.
blu_sr
0

Si vous voulez éviter la programmation, cela pourrait être la méthode la plus simple et la plus rapide.

Il existe un module complémentaire pour Excel appelé ASAP Utilities . Il y a un essai gratuit de 90 jours, mais après cela, c'est 49 $ US pour une utilisation professionnelle. C'est gratuit pour un usage étudiant ou personnel. Le module complémentaire ajoute de nombreuses fonctions utiles. L'une d'elles consiste à créer une liste de fichiers dans une structure de dossiers. Il fournit également des propriétés de fichier. Vous pouvez limiter les résultats par type de fichier si vous le souhaitez.

Voici une vidéo expliquant comment procéder.

J'ai déjà utilisé ce module complémentaire et les résultats sont très rapides.

Remarque, je ne suis pas affilié à cette société de logiciels.

Fezter
la source
1
Thnx Fezter, mais je ne pense pas que cela récupérera les types de fichiers SIG comme auparavant. Le .shp n'est pas seulement .shp, contient de nombreux autres fichiers.
blu_sr
Il peut obtenir tous les types de fichiers dans un dossier.
Fezter
2
@Fetzer à moins qu'il ne sache lire les jeux de données SIG dans les fichiers et les géodatabases personnelles, je serais surpris que cela fonctionne ici car il n'y a pas de véritable corrélation entre chaque fichier et chaque jeu de données
nicksan
Oh ouais, tu as raison. J'ai manqué que vous ayez des géodatabases. Cela ne fonctionnerait pas pour vous. Désolé pour ça. Mais c'est quand même une bonne prise.
Fezter
0

Je n'ai pas pu obtenir que les autres réponses fonctionnent pleinement.

Dans le premier exemple, dans un répertoire contenant à la fois des géodatabases et des fichiers de formes, je n'ai obtenu qu'une liste des classes d'entités de la géodatabase, mais lorsque j'ai commenté la partie géodatabases du script, j'ai obtenu une liste de fichiers de formes.

Dans le deuxième exemple, la partie géodatabases ne fonctionnait pas du tout, j'ai donc copié la partie géodatabases du premier exemple. Encore une fois, j'ai obtenu une liste de géodatabases uniquement.

Ensuite, cela m'a frappé: les géodatabases sont lues avant les fichiers de formes et le script s'arrête breakdans la partie des géodatabases.

Étant un débutant en python, je ne sais pas pourquoi breakest nécessaire, mais sans lui, le script semble aller dans une boucle sans fin, mais comme cela breakest nécessaire, il m'est venu à l'esprit que mettre la partie géodatabases dans sa propre boucle, après l'autre fichier types sont répertoriés, résoudrait le problème:

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

Quand je l'ai fait, j'ai obtenu ma liste complète.

bkepl
la source