Як зробити інвентар ГІС?


21

У моєму кабінеті відбудеться велика зміна у розділі ГІС. Цей розділ функціонує з 1980-х років і має величезну колекцію даних ГІС (тобто файли форм, растрові файли, дані тощо), але ніколи не проходив жодної інвентаризації. Зараз це станеться.

Чи є який-небудь автоматизований спосіб витягти всю інформацію про дані ГІС (наприклад, форм-файл, покриття дугової інформації, файл шару, * .mxd, gdb, растровий файл тощо) з ПК у файл Excel? Інформація може включати дату створення, дату останнього редагування, назву папки чи контейнера тощо.


3
В якій версії ArcGIS ви знаходитесь? У 10.1 SP1 це значно спрощується arcpy.da.walk.
blah238

1
Починати ніколи не боляче, зробивши візуальний інвентар та замальовуючи дизайн, перш ніж потрапити на атаку на старий сервер з python.
Рой

У відповідь на @Roy - ви можете розглянути можливість початку цього БЕЗКОШТОВНОГО завантаження: voyagergis.com
Czed

Ви також можете розглянути портал пошуку метаданих, наприклад, безкоштовний сервер Geoportal
Stephen Lead

Відповіді:


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функцію для додаткових властивостей, які можна включити у висновок.

Якщо ви спеціально хочете розібрати інформацію з фактичних метаданих , дивіться сценарій у цій відповіді: Створення таблиці, що містить усі назви файлів (і, можливо, метаданих) у базі даних Geodata


@ blah239, excel теж може відкривати текстові файли, просто потрібно вказати роздільник.
мистецтво21

4
Щоправда, але діалект CSV Excel піклується про всі складні питання, такі як вбудовані котирування, нові рядки та коми. Також не потрібно пройти майстра, щоб просто відкрити файл.
blah238

THX для уточнення.
художній твір21

10

Використовуючи Python, ви повинні використовувати правильні модулі, щоб робити те, що ви хочете. Наприклад, щоб знайти всі файли в каталозі з розширенням shp, наприклад, є набагато простіші рішення, які були представлені без перерви, що жахливо ... (як рішення, представлене Nathan W, але є багато, багато інших, просто пошук в Інтернеті)

Деякі приклади з відповідними модулями:

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'?
художній твір21

1
Ви пробували? glob.glob ("*. shp") не повертає файли .shp.xml на мій кінець.
blah238

@ blah238, ніхто не пробував, thx.
художній твір21

5

Дякуємо artwork21 та Nathan 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")

Тільки ім'я та місцезнаходження файлу. ПК, з яким я буду працювати, має багато покриття (файл дугової інформації), чи буде він працювати і на них?


Що стосується версії мого програмного забезпечення, то я використовую AG 10.1 SP1, але інші ПК використовують в основному різні версії програмного забезпечення ESRI - здебільшого інформація про дугу.
blu_sr

Я фактично не впевнений, чи arcpy.da.walkбуде перераховано покриття, але я б не здогадувався, оскільки він не вказаний у фільтрах даних або типу.
blah238

Ось коротка версія коду: gist.github.com/4577289 . Оскільки логіка для shp, lyr та img однакова, ми їх просто робимо в одному ifтвердженні.
Nathan W

2
Вам також не потрібно, txt.close()якщо ви використовуєте, withтому що це зробить це для вас, коли блок вийде.
Nathan W

4

Якщо у вас є ArcGIS Desktop 10.0 (або будь-який з його пакетів послуг), я думаю, що найкраще зробити це написання сценарію python, який використовує os.walk для перегляду визначеного каталогу GIS та пошуку загальних розширень файлів GIS, таких як .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 (або пізнішої версії) для робочого столу, тут є ще один відповідь, який використовує arcpy.da.Walk, який не був доступний в 10.0 або раніше.


Ви можете перевірити свій код. Він буде шукати gdb, лише якщо він спочатку знайде форму. Здається, відступ все змінено.
Натан Вт

Я також не думаю, що тут правильне використання. Краще буде написано так: gist.github.com/4577289 Неперевірено, звичайно.
Натан Ш

не думайте, що знайдеться **
Натан Ш

Інші спрощення можуть включати використання csvмодуля для трохи абстрагування написання файлу та використання arcpy.da.walk10.1 SP1 для дозволу ArcGIS обробляти перелік типів даних ГІС.
blah238

Спасибі! Я працюю над тим, щоб отримати якомога більше інформації з тієї вікової бази даних.
blu_sr

0

Якщо ви хочете уникати програмування, це може бути найпростішим і швидким методом.

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

Ось відео, як це зробити.

Я раніше використовував цю надбудову, і результати дуже швидкі.

Зауважте, я не пов'язаний з цією програмною компанією.


1
Thnx Fezter, але я не думаю, що він отримає типи файлів GIS, як і раніше. .Shp - це не просто .shp, має багато інших файлів із ним.
blu_sr

Він може отримати будь-який і всі типи файлів у папці.
Фестер

2
@Fetzer, якщо він не знає, як читати набори даних ГІС з файлових та особистих баз даних, я буду здивований, якщо він працює тут, оскільки між кожним файлом та кожним набором даних немає справжньої кореляції
nicksan

О так, ти маєш рацію. Я пропустив, що у вас є геодані. Це не працює для вас. Вибач за це. Але, це все-таки хороший штекер.
Фестер

0

Я не міг отримати інших відповідей, щоб повноцінно працювати.

У першому прикладі в каталозі з обома базами геоданих та формами файлів я отримав лише перелік класів функцій в базі даних геоданих, але коли я прокоментував частину баз геоданих скрипту, я отримав список форм файлів.

У другому прикладі частина баз геоданих взагалі не працювала, тому я скопіював у частину геоданих баз першого прикладу. Знову я потрапив у список лише геоданих.

Потім мене вдарило: бази даних геоданих читаються перед формати, а сценарій зупиняється на breakчастині геоданих.

Будучи новачком-пітоном, я не знаю, для чого 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...]

Коли я це зробив, я отримав повний список.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.