21 votos

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

¿Hay una manera con ArcPy para identificar la versión de un Mapa del documento (MXD). Estoy trabajando en una solución para inventario de nuestros MXD y quisiera saber si un documento es 8.1, 9.2, 10.0, etc.

Actualmente utilizo ArcGIS 10.0, pero si hay alguna actualización en 10.1 que no exista en 10.0, también agradecería saberlo.

Veo que hay una pregunta anterior de ¿Cómo se puede encontrar la versión de ArcGIS mediante programación? pero hace referencia a todas las soluciones ArcObjects (que supongo que podría llamada desde python pero preferiría no hacerlo).

24voto

Jerry B Puntos 113

Sé que esta pregunta es de hace unos meses, pero la publico por si ayuda a otros. He desarrollado este kludge para analizar los números de versión de los documentos MXD. Básicamente lee los primeros 4000 caracteres de un documento MXD y busca un número de versión. He probado 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

He aquí un ejemplo de exploración de una carpeta en busca de archivos mxd e impresión de 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

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

15voto

Fitzcarraldo Puntos 423

La siguiente función se basa en la idea de Ryan, pero es un poco más directa. Los documentos cartográficos de ArcGIS son en realidad documentos OLE, que pueden analizarse con la función oletools (disponible en pypi: https://pypi.python.org/pypi/oletools ). 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]))

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X