¿Cómo hacer un inventario GIS?

20

Mi oficina verá un gran cambio en su sección de SIG. Esta sección ha estado operativa desde la década de 1980 y tiene una gran colección de datos GIS (es decir, shapefiles, archivos raster, datos, etc.) pero nunca se ha realizado ningún inventario. Ahora va a pasar.

¿Hay alguna forma automatizada de extraer toda la información sobre los datos GIS (es decir, shapefile, cobertura de información de arco, archivo de capa, * .mxd, gdb, archivo raster y más) desde una PC a un archivo de Excel? La información puede incluir la fecha de creación, la fecha de la última edición, el nombre de la carpeta o del contenedor, etc.

    
pregunta blu_sr 20.01.2013 - 06:22

6 respuestas

5

Gracias artwork21 y Nathan W por su respuesta. Y sí, el código de Nathen hizo 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")

Sólo nombre de archivo y ubicación. El equipo con el que trabajaré tiene un montón de archivos de cobertura (el archivo de información de arco), ¿funcionará también en ellos?

    
respondido por el blu_sr 20.01.2013 - 11:15
18

Esto me funciona, usando la función arcpy.da.Walk en 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])

El módulo csv también se usa para simplificar la escritura del archivo de salida. Excel puede abrir archivos CSV para que pueda verlos como hojas de cálculo.

Consulte la función arcpy.Describe para obtener propiedades adicionales Puedes incluir en la salida.

Si está buscando específicamente analizar la información de los metadatos , consulte el script en esta respuesta: Creación de una tabla que contiene todos los nombres de archivos (y posiblemente metadatos) en una geodatabase de archivos

    
respondido por el blah238 20.01.2013 - 11:54
10

Cuando uses Python, debes usar los módulos correctos para hacer lo que quieras. Para encontrar todos los archivos en un directorio con extensión shp, por ejemplo, hay soluciones mucho más simples que se presentaron sin interrupciones, lo cual es horrible ... (como la solución presentada por Nathan W, pero hay muchas, muchas otras, solo buscar en internet)

Algunos ejemplos con módulos relevantes:

1) con el módulo glob:

solo shapefiles:

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

shapefiles y 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

si desea buscar también en los subdirectorios:

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

2) con os.listdir y lista de comprensión (en dos líneas) - > lista de resultados

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 el módulo fnmatch:

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

y muchas otras soluciones, recursivas, etc.

    
respondido por el gene 20.01.2013 - 11:09
4

Si tiene ArcGIS Desktop 10.0 (o cualquiera de sus paquetes de servicio), creo que lo mejor que puede hacer es escribir un script en Python que use os.walk para buscar en un directorio GIS definido y buscar extensiones de archivo GIS comunes, como. shp, .gdb, .mdb, etc ... y escribe el resultado en un archivo de texto delimitado por comas. Luego puede traer el archivo de texto a Excel, vea el ejemplo de código a continuación:

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 está utilizando ArcGIS 10.1 (o posterior) para Desktop, aquí hay otra Respuesta que usa arcpy.da.Walk que no estaba disponible en la versión 10.0 o anterior.

    
respondido por el artwork21 20.01.2013 - 08:45
0

Si desea evitar la programación, este podría ser el método más fácil y rápido.

Hay un complemento para Excel llamado ASAP Utilities . Hay una prueba gratuita de 90 días pero después de eso, es de $ 49 USD para uso comercial. Es gratis para uso estudiantil o personal. El complemento agrega muchas funciones útiles. Uno de los cuales es creando una lista de archivos en una estructura de carpetas. También proporciona propiedades de archivo. Puede limitar los resultados por tipo de archivo si lo desea.

Aquí hay un video de cómo hacer esto.

He usado este complemento antes y los resultados son muy rápidos.

Tenga en cuenta que no estoy afiliado a esta compañía de software.

    
respondido por el Fezter 21.01.2013 - 01:08
0

No pude conseguir que las otras respuestas funcionaran completamente.

En el primer ejemplo, en un directorio con geodatabases y shapefiles, solo obtuve una lista de las clases de entidad en la geodatabase, pero cuando comenté la porción de geodatabases del script, obtuve una lista de shapefiles.

En el segundo ejemplo, la parte de geodatabases no funcionó en absoluto, por lo que copié en la parte de geodatabases del primer ejemplo. Nuevamente, obtuve una lista de solo geodatabases.

Entonces me golpeó: las geodatabases se leen antes de los shapefiles y el script se detiene en el break en la parte de geodatabases.

Siendo un novato de python, no sé por qué se necesita break , pero sin él el script parece ir en un bucle sin fin, pero como se necesita break se me ocurrió que poner la parte de geodatabases en su propio bucle, después de que se enumeren los otros tipos de archivos, resolvería el 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...]

Cuando hice eso obtuve mi lista completa.

    
respondido por el bkepl 27.01.2016 - 22:51

Lea otras preguntas en las etiquetas