¿Cómo hacer un inventario SIG?

21

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 SIG (es decir, archivos de forma, archivos ráster, datos, etc.) pero nunca ha pasado por ningún inventario. Ahora sucederá.

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

blu_sr
fuente
3
¿En qué versión de ArcGIS estás? En 10.1 SP1 esto se hace mucho más fácil arcpy.da.walk.
blah238
1
Nunca está de más comenzar haciendo un inventario visual y dibujando un diseño antes de atacar un servidor antiguo con python.
Roy
En respuesta a @Roy, puede considerar comenzar con esta descarga GRATUITA: voyagergis.com
Czed
También puede considerar un portal de búsqueda de metadatos, como el servidor de Geoportal
Stephen Lead el

Respuestas:

18

Esto funciona para mí, usando la arcpy.da.Walkfunción 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 csvmódulo 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.

Vea la arcpy.Describefunción para propiedades adicionales que puede incluir en la salida.

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

blah238
fuente
@ blah239, Excel también puede abrir archivos de texto, solo necesita proporcionar el delimitador.
artwork21
44
Es cierto, pero el dialecto CSV de Excel se ocupa de todos los problemas difíciles, como citas incrustadas, líneas nuevas y comas. Tampoco requiere pasar por un asistente para abrir el archivo.
blah238
Gracias por la aclaración.
artwork21
10

Cuando usa Python, debe usar los módulos correctos para hacer lo que desea. Para encontrar todos los archivos en un directorio con extensión shp, por ejemplo, hay soluciones mucho más simples que se presentaron sin interrupción, 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 archivos de forma:

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

archivos de forma 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 quieres 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 comprensión de la lista (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.

gene
fuente
¿Cómo ignoras los archivos .shp.xml usando el método '* .shp'?
artwork21
1
¿Lo intentaste? glob.glob ("*. shp") no devuelve archivos .shp.xml de mi parte.
blah238
@ blah238, no, no lo intenté, gracias.
artwork21
5

Gracias artwork21 y Nathan W por tu 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")

Solo nombre de archivo y ubicación. La PC con la que trabajaré tiene mucha cobertura (el archivo de información de arco), ¿funcionará en ellos también?

blu_sr
fuente
En cuanto a la versión de mi software, utilizo AG 10.1 SP1, pero otras PC usan varias versiones del software ESRI: información de Arc principalmente.
blu_sr
En realidad, no estoy seguro de si arcpy.da.walkenumerará las coberturas, pero supongo que no, ya que no aparece en los filtros de tipo o tipo de datos.
blah238
Aquí hay una versión más corta del código: gist.github.com/4577289 . Como la lógica de shp, lyr e img es la misma, solo las hacemos en una sola ifdeclaración.
Nathan W
2
Tampoco necesita el txt.close()si está usando withporque lo hará por usted cuando salga el bloque.
Nathan W
4

Si tiene ArcGIS Desktop 10.0 (o cualquiera de sus paquetes de servicio), creo que su mejor opción es escribir un script de Python que use os.walk para mirar a través de un directorio GIS definido y busque 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, hay otra respuesta aquí que utiliza arcpy.da.Walk que no estaba disponible en 10.0 o anterior.

artwork21
fuente
Es posible que desee verificar su código. Solo buscará gdb si primero encuentra una forma. Parece que la sangría está desordenada.
Nathan W
Tampoco f.find es el uso correcto aquí. Esto estaría mejor escrito así: gist.github.com/4577289 No probado, por supuesto.
Nathan W
no pienses f.find **
Nathan W
Otras simplificaciones podrían incluir el uso del csvmódulo para abstraer un poco la escritura del archivo y el uso arcpy.da.walken 10.1 SP1 para permitir que ArcGIS maneje la lista de los tipos de datos SIG.
blah238
¡Gracias! Estoy trabajando en extraer tanta información como pueda de esa base de datos antigua.
blu_sr
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, son $ 49 USD para uso comercial. Es gratis para estudiantes o para uso personal. El complemento agrega muchas funciones útiles. Una de ellas es crear 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.

Fezter
fuente
1
Thnx Fezter, pero no creo que vaya a buscar los tipos de archivos GIS como antes. El .shp no es solo .shp, tiene muchos otros archivos.
blu_sr
Puede obtener cualquier tipo de archivo en una carpeta.
Fezter
2
@Fetzer a menos que sepa cómo leer conjuntos de datos GIS de archivos y geodatabases personales, me sorprendería si funcionara aquí, ya que no existe una verdadera correlación entre cada archivo y cada conjunto de datos
nicksan
Oh sí, tienes razón. Extrañaba que tuvieras geodatabases. Esto no funcionaría para ti. Lo siento por eso. Pero, de todos modos, es un buen complemento.
Fezter
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 porción de geodatabases no funcionó en absoluto, así que copié la porción de geodatabases del primer ejemplo. Nuevamente, obtuve una lista de solo geodatabases.

Luego me golpeó: las geodatabases se leen antes de los shapefiles, y el script se detiene en la breakparte de geodatabases.

Siendo un novato de Python, no sé por qué breakse necesita, pero sin él, el script parece ir en un bucle sin fin, pero dado que breakes necesario, se me ocurrió que poner las geodatabases parte en su propio bucle, después del otro archivo los tipos se enumeran, resolverían 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 listado completo.

bkepl
fuente