Usando ArcPy per determinare la versione del documento ArcMap?


21

Esiste un modo con ArcPy per identificare la versione di un documento mappa (MXD). Sto lavorando a una soluzione per inventario dei nostri MXD e vorrei sapere se un documento è 8.1, 9.2, 10.0, ecc.

Attualmente sto usando ArcGIS 10.0, ma se c'è un aggiornamento in 10.1 che non esiste in 10.0, apprezzerei anche questo.

Vedo che c'è una domanda precedente su Come trovare la versione ArcGIS a livello di codice? , ma fa riferimento a tutte le soluzioni ArcObjects (che suppongo di poter chiamare da Python , ma preferirei non farlo).


2
Penso che potrebbe essere necessaria una richiesta di miglioramento per aggiungere una proprietà della versione di sola lettura all'oggetto MapDocument. Se ne trovi / crei uno, collegalo qui e voterò per questo.
PolyGeo

Esiste un controllo versione ArcGis Idea. (bene, 3 uniti in uno)
gm70560

Ho copiato il tuo script, l'ho modificato leggermente per il mio ambiente e l'ho eseguito su alcuni dei miei file, ma alcuni dei file non hanno restituito una versione anche se so che sono stati salvati in 9.3 o 10.0. Non sono sicuro che fonti di dati non funzionanti rovinerebbero il tuo script.

Correlati: gisnuts.com/terra/blog/2014/02/24/… Un'eccellente scoperta di @danjurgell in un commento su una domanda di follow-up alla risposta accettata qui. Sulla base di quel post sul blog, non esiste un modo affidabile al 100% per farlo perché le informazioni non sono memorizzate nel file in modo prevedibile. Entrambe le risposte qui funzioneranno un po ' del tempo ma non sempre .
Chris W,

Risposte:


23

So che questa domanda ha qualche mese, ma sto pubblicando questo nel caso in cui aiuti gli altri. Ho sviluppato questo kludge per analizzare i numeri di versione dai documenti MXD. In pratica legge i primi 4000 caratteri di un documento MXD e cerca un numero di versione. Ho provato con le versioni MXD 9.2, 9.3, 10.0 e 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

Ecco un esempio di scansione di una cartella per i file mxd e stampa della versione e dei nomi

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

Che restituisce questo:

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

Questo è molto bello! Molto utile. Ora possiamo farlo anche con layer e geodatabase?
Mike,

Questo è semplicemente fantastico!
dchaboya,

Lavora prima del 10.4 Ho analizzato mxd con il lettore Hexa e la posizione della versione è cambiata (è dopo il percorso prima e oggi è prima del percorso e aggiungi il prefisso "Build Number" il valore successivo è (10.4.0.5524). Con 10.3.1 I hanno 10.3.6 nella parte in valore
esadecimale

1
questo non sembra funzionare per me, controllando 10.6.1 mxds che sono stati salvati in 10.2.2 (non è stato possibile determinare la versione "restituita") ... ci sono stati aggiornamenti nei documenti mxd da integrare in questo script?
JasonBK,

14

La funzione seguente si basa sull'idea di Ryan, ma è un po 'più diretta. I documenti cartografici ArcGIS sono in realtà documenti OLE, che possono essere analizzati con il oletoolsmodulo (disponibile su pypi: https://pypi.python.org/pypi/oletools ). La funzione apre il file e legge la stringa della versione. Testato con 9.0, 9.3, 10.1 e 10.3, ma dovrebbe funzionare con qualsiasi cosa (non sono sicuro di 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
Anche questa è un'ottima funzione. L'unica esitazione che avrei sull'uso di questa funzione è che richiede all'utente di scaricare / installare una libreria di terze parti (oletools) che in alcune organizzazioni gli utenti potrebbero non essere in grado di fare.
Ryan Dalton,

Ho solo un voto, ma funzionerà nei casi in cui l'altra risposta non lo fa.
DWynne,

Snorfalorpagus funziona bene fino alla 10.3 ma per 10.4 c'è un'altra chiave di flusso "Informazioni sulla versione del documento Mx" con la versione del numero di build completo. Ho controllato con diverse versioni di arcgis e la mia ultima versione restituiva 10.4.0.5524
GeoStoneMarten,

Interessante. Non ho ancora eseguito l'aggiornamento a 10.4. Potresti condividere un mxd vuoto per me vedere?
Snorfalorpagus,

1
@GeoStoneMarten Grazie. Ho esaminato il documento che hai inviato. Sembra funzionare con il codice originale - Non vedo lo stream "Informazioni sulla versione del documento Mx"?
Snorfalorpagus,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.