Как сделать инвентаризацию ГИС?

21

В моем офисе будут большие изменения в разделе ГИС. Этот раздел функционирует с 1980-х годов и содержит огромный набор данных ГИС (т. Е. Шейп-файлы, растровые файлы, данные и т. Д.), Но никогда не проходил никакой инвентаризации. Теперь это произойдет.

Существует ли какой-либо автоматизированный способ извлечения всей информации о данных ГИС (т. Е. Шейп-файл, покрытие дуговой информации, файл слоя, * .mxd, gdb, растровый файл и т. Д.) С ПК в файл Excel? Информация может включать дату создания, дату последнего редактирования, имя папки или контейнера и т. Д.

blu_sr
источник
3
В какой версии ArcGIS вы находитесь? На 10.1 SP1 это стало намного проще arcpy.da.walk.
blah238
1
Это никогда не повредит начать с визуальной инвентаризации и набросков дизайна, прежде чем приступить к атаке на старый сервер с Python.
Рой
В ответ на @Roy - вы могли бы начать с этой бесплатной загрузки: voyagergis.com
Czed
Вы могли бы также рассмотреть портал поиска метаданных, такой как бесплатный Геопортальный Сервер
Стивен Лид

Ответы:

18

Это работает для меня, используя arcpy.da.Walkфункцию в 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])

csvМодуль также используется для упрощения записи выходного файла. Excel может открывать файлы CSV, чтобы вы могли просматривать их в виде электронных таблиц.

Смотрите arcpy.Describeфункцию для дополнительных свойств, которые вы можете включить в вывод.

Если вы специально хотите проанализировать информацию из фактических метаданных , посмотрите сценарий в этом ответе: Создание таблицы, содержащей все имена файлов (и, возможно, метаданные) в файловой базе геоданных

blah238
источник
@ blah239, Excel тоже может открывать текстовые файлы, просто нужно указать разделитель.
artwork21
4
Да, но диалект Excel CSV решает все сложные вопросы, такие как кавычки, переводы строки и запятые. Это также не требует прохождения мастера, чтобы просто открыть файл.
blah238
Спасибо за разъяснение.
artwork21
10

Когда вы используете Python, вы должны использовать правильные модули, чтобы делать то, что вы хотите. Например, чтобы найти все файлы в каталоге с расширением shp, есть гораздо более простые решения, которые были представлены без перерыва, что ужасно ... (как решение, представленное Натаном В., но есть много, много других, просто поиск в интернете)

Некоторые примеры с соответствующими модулями:

1) с модулем glob:

только шейп-файлы:

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

шейп-файлы и базы геоданных:

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

если вы хотите искать также в подкаталогах:

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

2) с os.listdir и пониманием списка (в две строки) -> список результатов

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) с модулем fnmatch:

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

и многие другие решения, рекурсивные и т. д.

ген
источник
как игнорировать файлы .shp.xml, используя метод * .shp?
artwork21
1
Вы пробовали это? glob.glob ("*. shp") не возвращает файлы .shp.xml на моем конце.
blah238
@ blah238, нет не пробовал, спасибо.
artwork21
5

Спасибо artwork21 и Натану W за ваш ответ. И да, код Нэтена сотворил магию.

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

Только имя файла и местоположение. На компьютере, с которым я буду работать, есть большой файл покрытия (файл arc-info), он тоже будет работать на них?

blu_sr
источник
Что касается версии моего программного обеспечения, я использую AG 10.1 SP1, но другие ПК используют различные версии программного обеспечения ESRI - в основном информация о Arc.
blu_sr
Я на самом деле не уверен, если arcpy.da.walkбудет перечислять покрытия, но я бы не догадался, так как он не указан в dataType или типах фильтров.
blah238
Вот более короткая версия кода: gist.github.com/4577289 . Поскольку логика для shp, lyr и img одинакова, мы просто делаем их в одном ifутверждении.
Натан W
2
Вам также не нужно, txt.close()если вы используете, withпотому что он сделает это за вас, когда блок выйдет.
Натан W
4

Если у вас есть ArcGIS Desktop 10.0 (или любой из его пакетов обновления), я думаю, что вам лучше всего написать скрипт на python, который использует os.walk для просмотра определенного каталога ГИС и поиска общих расширений файлов ГИС, таких как .shp,. gdb, .mdb и т.д ... и записывает результат в текстовый файл с разделителями-запятыми. Затем вы можете перевести текстовый файл в Excel, см. Пример кода ниже:

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

Если вы используете ArcGIS 10.1 (или более позднюю версию) для Desktop, то здесь есть другой ответ, использующий arcpy.da.Walk, который не был доступен в версии 10.0 или более ранней.

artwork21
источник
Вы можете проверить свой код. Он будет искать GDB, только если сначала найдет форму. Кажется, отступ все перепутан.
Натан W
Я также не f.find является правильным использованием здесь. Это было бы лучше написать так: gist.github.com/4577289 Конечно, не проверено .
Натан Вт
не думаю, что f.find **
Натан W
Другие упрощения могут включать в себя использование csvмодуля, чтобы немного абстрагировать запись файла, и использование arcpy.da.walkв 10.1 SP1, чтобы позволить ArcGIS обрабатывать список типов данных ГИС.
blah238
Благодарность! Я работаю над тем, чтобы извлечь как можно больше информации из этой вековой базы данных.
blu_sr
0

Если вы хотите избежать программирования, это может быть самый простой и быстрый способ.

Существует дополнение для Excel, которое называется ASAP Utilities . Существует 90-дневная бесплатная пробная версия, но после этого она составляет 49 долларов США для коммерческого использования. Это бесплатно для студентов или личного пользования. Дополнение добавляет много полезных функций. Одним из которых является создание списка файлов в структуре папок. Он также предоставляет свойства файла. Вы можете ограничить результаты по типу файла, если хотите.

Вот видео как это сделать.

Я использовал это дополнение раньше, и результаты очень быстрые.

Обратите внимание, я не связан с этой компанией-разработчиком программного обеспечения.

Фезтер
источник
1
Thnx Fezter, но я не думаю, что он будет загружать типы файлов ГИС, как раньше. .Shp - это не просто .shp, он содержит много других файлов.
blu_sr
Он может получить любой и все типы файлов в папке.
Фезтер
2
@Fetzer, если он не знает, как читать наборы данных ГИС из файловой и личной баз геоданных, я был бы удивлен, если бы он работал здесь, поскольку нет истинной корреляции между каждым файлом и каждым набором данных
nicksan
Ах да, ты прав. Я пропустил, что у вас есть базы геоданных. Это не сработает для вас. Прости за это. Но это хороший плагин в любом случае.
Фезтер
0

Я не мог заставить другие ответы работать полностью.

В первом примере, в каталоге с базами геоданных и шейп-файлами, я получил только список классов пространственных объектов в базе геоданных, но когда я закомментировал часть сценария баз геоданных, я получил список шейп-файлов.

Во втором примере часть базы геоданных вообще не работала, поэтому я скопировал часть базы геоданных первого примера. Я снова получил список только геоданных.

Затем меня поразило: базы геоданных читаются до шейп-файлов, и сценарий останавливается breakв части базы геоданных.

Будучи новичком в Python, я не знаю, зачем breakэто нужно, но без этого скрипт, кажется, идет бесконечным циклом, но, поскольку breakон мне нужен, мне пришло в голову, что помещение базы геоданных в отдельный цикл, после другого файла типы перечислены, решит проблему:

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

Когда я это сделал, я получил полный список.

bkepl
источник