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


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.