Como fazer um inventário GIS?

21

Meu escritório verá uma grande mudança na seção GIS. Esta seção está operacional desde os anos 80 e possui uma enorme coleção de dados GIS (por exemplo, arquivos de forma, arquivos raster, dados etc.), mas nunca passou por nenhum inventário. Agora isso vai acontecer.

Existe alguma maneira automatizada de extrair todas as informações sobre os dados GIS (como shapefile, cobertura de informações de arco, arquivo de camada, * .mxd, gdb, arquivo raster e mais) de um PC para um arquivo do Excel? As informações podem incluir data de criação, data da última edição, nome da pasta ou do contêiner, etc.

blu_sr
fonte
3
Em qual versão do ArcGIS você está? No 10.1 SP1, isso é muito mais fácil arcpy.da.walk.
precisa saber é o seguinte
1
Nunca é demais começar fazendo um inventário visual e esboçando um design antes de você atacar um servidor antigo com python.
Roy
Em resposta a @Roy - você pode considerar começar com este download gratuito: voyagergis.com
Czed
Você também pode considerar um portal de busca de metadados, como da Esri livre Geoportal Servidor
Stephen chumbo

Respostas:

18

Isso funciona para mim, usando a arcpy.da.Walkfunção no 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])

O csvmódulo também é usado para simplificar a gravação do arquivo de saída. O Excel pode abrir arquivos CSV para que você possa visualizá-los como planilhas.

Consulte a arcpy.Describefunção para obter propriedades adicionais que você pode incluir na saída.

Se você estiver procurando analisar especificamente as informações dos metadados reais , consulte o script nesta resposta: Criando uma tabela contendo todos os nomes de arquivos (e possivelmente metadados) em um banco de dados geográfico de arquivos

blah238
fonte
@ blah239, o excel também pode abrir arquivos de texto, basta fornecer o deliminador.
precisa saber é o seguinte
4
É verdade, mas o dialeto CSV do Excel cuida de todos os problemas complicados, como aspas incorporadas, novas linhas e vírgulas. Também não requer passar por um assistente para apenas abrir o arquivo.
precisa saber é o seguinte
thx pelo esclarecimento.
precisa saber é o seguinte
10

Ao usar o Python, você deve usar os módulos corretos para fazer o que deseja. Para encontrar todos os arquivos em um diretório com extensão shp, por exemplo, existem soluções muito mais simples que foram apresentadas sem interrupção, o que é horrível ... (como a solução apresentada por Nathan W, mas há muitas, muitas outras, apenas pesquisa na Internet)

Alguns exemplos com módulos relevantes:

1) com o módulo glob:

apenas shapefiles:

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

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

se você deseja procurar também nos subdiretórios:

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

2) com os.listdir e compreensão da lista (em duas linhas) -> 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) com módulo fnmatch:

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

e muitas outras soluções, recursivas etc.

gene
fonte
Como você ignora os arquivos .shp.xml usando o método '* .shp'?
precisa saber é o seguinte
1
Você tentou? glob.glob ("*. shp") não retorna arquivos .shp.xml do meu lado.
precisa saber é o seguinte
@ Blah238, não, não tente, thx.
precisa saber é o seguinte
5

Obrigado artwork21 e Nathan W pela sua resposta. E sim, o código de Nathen fez a mágica.

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

Apenas nome do arquivo e localização. O PC com o qual trabalharei tem muita cobertura (o arquivo de informações do arco), também funcionará?

blu_sr
fonte
Quanto à versão do meu software, eu uso o AG 10.1 SP1, mas outro PC usa várias versões do software ESRI - informações do Arc principalmente.
blu_sr
Na verdade, não tenho certeza se arcpy.da.walklistará as coberturas, mas acho que não, pois não está listado nos filtros dataType ou type.
precisa saber é o seguinte
Aqui está uma versão mais curta do código: gist.github.com/4577289 . Como a lógica para shp, lyr e img é a mesma, apenas as fazemos em uma ifdeclaração.
Nathan W
2
Você também não precisa do txt.close()se estiver usando, withporque ele fará isso quando o bloco sair.
Nathan W
4

Se você possui o ArcGIS Desktop 10.0 (ou qualquer um de seus service packs), acho que sua melhor aposta é escrever um script python que use os.walk para procurar um diretório GIS definido e procurar extensões de arquivo GIS comuns, como .shp,. gdb, .mdb, etc ... e grava o resultado em um arquivo de texto delimitado por vírgula. Você pode trazer o arquivo de texto para o Excel, veja o exemplo de código abaixo:

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 você estiver usando o ArcGIS 10.1 (ou posterior) para Desktop, há outra resposta aqui que usa o arcpy.da.Walk que não estava disponível na versão 10.0 ou anterior.

artwork21
fonte
Você pode verificar seu código. Ele só pesquisará o gdb se encontrar uma forma primeiro. Parece que o recuo está todo bagunçado.
Nathan W
Eu também não f.find é o uso correto aqui. Isso seria melhor escrito assim: gist.github.com/4577289 Não testado, é claro.
Nathan W
Não acho que f.find **
Nathan W
Outras simplificações podem incluir o uso do csvmódulo para abstrair um pouco a gravação do arquivo e o uso arcpy.da.walkno 10.1 SP1 para permitir que o ArcGIS identifique os tipos de dados GIS.
precisa saber é o seguinte
Obrigado! Estou trabalhando para extrair o máximo de informações possível desse banco de dados antigo.
blu_sr
0

Se você deseja evitar a programação, esse pode ser o método mais fácil e rápido.

Há um complemento para o Excel chamado Utilitários ASAP . Há uma avaliação gratuita de 90 dias, mas depois disso, custa US $ 49 para uso comercial. É gratuito para uso pessoal ou para estudantes. O complemento adiciona muitas funções úteis. Um deles é criar uma lista de arquivos em uma estrutura de pastas. Ele também fornece propriedades do arquivo. Você pode limitar os resultados por tipo de arquivo, se desejar.

Aqui está um vídeo de como fazer isso.

Eu usei esse complemento antes e os resultados são muito rápidos.

Observe que não sou afiliado a esta empresa de software.

Fezter
fonte
1
Thnx Fezter, mas eu não acho que ele irá buscar os tipos de arquivo GIS como antes. O .shp não é apenas .shp, possui muitos outros arquivos.
blu_sr
Pode obter todo e qualquer tipo de arquivo em uma pasta.
Fezter
2
@Fetzer, a menos que saiba ler conjuntos de dados GIS nos Arquivos e Geodatabases Pessoais, ficaria surpreso se funcionasse aqui, pois não há uma correlação verdadeira entre cada arquivo e cada conjunto de dados
nicksan
Oh sim, você está certo. Eu senti falta de que você tinha geodatabases. Isso não funcionaria para você. Me desculpe por isso. Mas, de qualquer maneira, é um bom plug-in.
Fezter
0

Não consegui que as outras respostas funcionassem completamente.

No primeiro exemplo, em um diretório com geodatabases e shapefiles, apenas obtive uma lista das classes de recursos no geodatabase, mas quando comentei a parte do script de geodatabases, obtive uma lista de shapefiles.

No segundo exemplo, a parte dos bancos de dados geográficos não funcionou, então copiei na parte dos bancos de dados geográficos do primeiro exemplo. Mais uma vez, recebi uma lista apenas de geodatabases.

Então me ocorreu: os bancos de dados geográficos são lidos antes dos shapefiles, e o script para na parte breakdos bancos de dados geográficos.

Sendo um novato em python, não sei por que breaké necessário, mas sem ele o script parece ter um loop infinito, mas, como breaké necessário, ocorreu-me que colocar os geodatabases em seu próprio loop, após o outro arquivo tipos estão listados, resolveria o 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 fiz isso, recebi minha lista completa.

bkepl
fonte