¿Utilizando ArcPy para determinar la versión del documento de ArcMap?

21

¿Hay alguna manera con ArcPy de identificar la versión de un Documento de mapa (MXD). Estoy trabajando en una solución para inventario de nuestros MXD y me gustaría saber si un documento es 8.1, 9.2, 10.0, etc.

Actualmente estoy usando ArcGIS 10.0, pero si hay una actualización en 10.1 que no existe en 10.0, también me gustaría escuchar eso.

Veo que hay una pregunta anterior de ¿Cómo puede encontrar ArcGIS? ¿Versión programática? , pero hace referencia a todas las soluciones de ArcObjects (que supongo que podría call from python , pero preferiría no hacerlo.

    
pregunta RyanDalton 29.05.2013 - 00:08

2 respuestas

23

Sé que esta pregunta tiene algunos meses de antigüedad, pero la estoy publicando en caso de que ayude a otros. Desarrollé este kludge para analizar números de versión de documentos MXD. Básicamente lee los primeros 4000 o más caracteres de un documento MXD y busca un número de versión. Probé con MXD versiones 9.2, 9.3, 10.0 y 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

Aquí hay un ejemplo de escanear una carpeta para archivos mxd e imprimir la versión y los nombres

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

Lo que devuelve esto:

>>> 
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
>>>
    
respondido por el Ryan S. 16.10.2013 - 06:36
13

La siguiente función se basa en la idea de Ryan, pero es un poco más directa. Los documentos de mapa de ArcGIS son en realidad documentos OLE, que se pueden analizar con el módulo oletools (disponible en pypi: enlace ). La función abre el archivo y lee la cadena de versión. Probado con 9.0, 9.3, 10.1 y 10.3, pero debería funcionar con cualquier cosa (no estoy seguro acerca de 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]))
    
respondido por el Snorfalorpagus 15.04.2015 - 16:56

Lea otras preguntas en las etiquetas