Використовуючи ArcPy для визначення версії документа ArcMap?


21

Чи існує спосіб з ArcPy визначити версію картографічного документа (MXD). Я працюю над рішенням про інвентаризацію наших MXD і хотів би знати, чи є документ 8.1, 9.2, 10.0 тощо.

Зараз я використовую ArcGIS 10.0, але якщо є оновлення в 10.1, яке не існує в 10.0, я також вдячний почути це.

Я бачу, що існує попереднє запитання про те, як можна знайти програму ArcGIS програмно? , але він посилається на всі рішення ArcObjects (які, мабуть, я міг би зателефонувати з python , але я вважаю за краще не робити).


2
Я думаю, для цього може знадобитися запит на вдосконалення для додавання до об’єкта MapDocument властивості версії лише для читання. Якщо ви знайдете / створіть його, то посилання на нього тут, і я проголосую за нього.
PolyGeo

Існує ArcGis Idea для управління версіями . (ну 3 злиті в одне)
gm70560

Я скопіював ваш сценарій, трохи змінив його для мого оточення і запустив його на деякі мої файли, але деякі файли не повернули версію, хоча я знаю, що вони були збережені в 9.3 або 10.0. Я не впевнений, якщо зламані джерела даних зіпсують ваш сценарій.

Пов’язано: gisnuts.com/terra/blog/2014/02/24/… Відмінна знахідка @danjurgell у коментарі до подальшого запитання до прийнятої відповіді тут. Виходячи з цього повідомлення в блозі, не існує 100% надійного способу зробити це, оскільки інформація просто не зберігається у файлі передбачувано. Обидві відповіді тут працюватимуть деякий час, але не весь час.
Кріс Ш

Відповіді:


23

Я знаю, що це питання вже кілька місяців, але я публікую це, якщо це допомагає іншим. Я розробив цю помилку для розбору номерів версій з документів MXD. В основному він читає перші 4000 символів документа MXD і шукає номер версії. Я тестував версії MXD 9.2, 9.3, 10.0 та 10.1.

import re

def getMXDVersion(mxdFile):
    matchPattern = re.compile("9.2|9.3|10.0|10.1|10.2")
    with open(mxdFile, 'rb') as mxd:
        fileContents = mxd.read().decode('latin1')[1000:4500]
        removedChars = [x for x in fileContents if x not in [u'\xff',u'\x00',u'\x01',u'\t']]
        joinedChars = ''.join(removedChars)
        regexMatch = re.findall(matchPattern, joinedChars)
        if len(regexMatch) > 0:
            version = regexMatch[0]
            return version
        else:
            return 'version could not be determined for ' + mxdFile

Ось приклад сканування папки для файлів mxd та друку версії та імен

import os
import glob
folder = r'C:\Users\Administrator\Desktop\mxd_examples'
mxdFiles = glob.glob(os.path.join(folder, '*.mxd'))
for mxdFile in mxdFiles:
    fileName = os.path.basename(mxdFile)
    version = getMXDVersion(mxdFile)
    print version, fileName

Що повертає це:

>>> 
10.0 Arch_Cape_DRG.mxd
9.2 class_exercise.mxd
9.3 colored_relief2.mxd
10.1 CountyIcons.mxd
10.0 DEM_Template.mxd
9.2 ex_2.mxd
10.0 nairobimap.mxd
10.0 slope_script_example.mxd
10.1 TrailMapTemplateBetter.mxd
10.0 Wickiup_Mountain_DEM.mxd
>>>

Це дуже круто! Дуже корисний. Тепер ми можемо це зробити і з шарами, і з геоданими?
Майк

Це чисто дивовижно!
дчабоя

Попрацюйте заздалегідь до 10.4 Я проаналізував mxd з програвачем Hexa, і позиція версії має змінитись (це після шляху до цього, а сьогодні - до шляху та додайте значення префіксу "Номер збірки", наступне значення (10.4.0.5524). З 10.3.1 я мають 10.3.6 у частині значення гекса
GeoStoneMarten

1
це, здається, не працює для мене, перевіряючи наявність 10.6.1 mxds, які були відновлені до 10.2.2 (усі повернення 'не вдалося визначити') ... Чи були якісь оновлення в mxd docs для інтеграції в цей скрипт?
JasonBK

14

Функція нижче заснована на ідеї Райана, але є трохи більш прямою. Документи карти ArcGIS - це фактично документи OLE, які можна проаналізувати за допомогою oletoolsмодуля (доступний на pypi: https://pypi.python.org/pypi/oletools ). Функція відкриває файл і зчитує рядок версії. Тестували з 9.0, 9.3, 10.1 та 10.3, але повинні працювати з чим завгодно (не впевнений у 3.x ...).

from oletools.thirdparty import olefile

def mxd_version(filename):
    ofile = olefile.OleFileIO(filename)
    stream = ofile.openstream('Version')
    data = stream.read().decode('utf-16')
    version = data.split('\x00')[1]
    return version

if __name__ == '__main__':
    import sys
    print(mxd_version(sys.argv[-1]))

1
Це теж чудова функція. Єдине вагання, яке я мав би проти використання цієї функції, полягає в тому, що вона вимагає від користувача завантаження / встановлення сторонньої бібліотеки (oletools), що в деяких організаціях користувачі можуть не мати можливості.
РайанДалтон

Я отримую лише один голос, але це спрацює у випадках, коли інша відповідь не відповідає.
DWynne

Snorfalorpagus працює добре до 10.3, але для 10.4 є інший потіковий ключ "Mx Document Version Info" з повною версією номера збірки. Я перевірив іншу версію arcgis і повернувся до останньої версії 10.4.0.5524
GeoStoneMarten

Цікаво. Я ще не оновив до 10,4. Не могли б ви поділитися порожнім mxd для мене?
Snorfalorpagus

1
@GeoStoneMarten Дякую Я подивився надісланий вами документ. Здається, працює з оригінальним кодом - я не бачу потоку "Інформація про версію документа Mx"?
Snorfalorpagus
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.