Utilisation d'ArcPy pour déterminer la version du document ArcMap?

21

Existe-t-il un moyen avec ArcPy d'identifier la version d'un document cartographique (MXD). Je travaille sur une solution pour inventorier nos MXD et je voudrais savoir si un document est 8.1, 9.2, 10.0, etc.

J'utilise actuellement ArcGIS 10.0, mais s'il existe une mise à jour dans 10.1 qui n'existe pas dans 10.0, j'apprécierais également d'entendre cela.

Je vois qu'il y a une question précédente de Comment trouver la version d'ArcGIS par programme? , mais il fait référence à toutes les solutions ArcObjects (que je suppose que je pourrais appeler à partir de python , mais je préférerais ne pas le faire).

RyanKDalton-OffTheGridMaps
la source
2
Je pense que cela pourrait nécessiter une demande d'amélioration pour qu'une propriété de version en lecture seule soit ajoutée à l'objet MapDocument. Si vous en trouvez / créez un, liez-le ici et je voterai pour.
PolyGeo
Il existe un contrôle de version ArcGis Idea. (enfin, 3 fusionnés en un)
gm70560
J'ai copié votre script, l'ai légèrement modifié pour mon environnement et l'ai exécuté sur certains de mes fichiers, mais certains fichiers n'ont pas renvoyé de version même si je sais qu'ils ont été enregistrés en 9.3 ou 10.0. Je ne sais pas si des sources de données cassées gâcheraient votre script.
Connexes: gisnuts.com/terra/blog/2014/02/24/… Une excellente découverte par @danjurgell dans un commentaire sur une question de suivi de la réponse acceptée ici. Sur la base de ce billet de blog, il n'y a aucun moyen fiable à 100% de le faire, car les informations ne sont tout simplement pas stockées dans le fichier de manière prévisible. Les deux réponses ici fonctionneront une partie du temps mais pas tout le temps.
Chris W

Réponses:

23

Je sais que cette question remonte à quelques mois, mais je la poste au cas où cela aiderait les autres. J'ai développé ce kludge pour analyser les numéros de version à partir des documents MXD. Il lit essentiellement les 4000 premiers caractères d'un document MXD et recherche un numéro de version. J'ai testé avec les versions 9.2, 9.3, 10.0 et 10.1 de MXD.

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

Voici un exemple d'analyse d'un dossier pour les fichiers mxd et d'impression de la version et des noms

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

Ce qui renvoie ceci:

>>> 
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
>>>
Ryan S.
la source
C'est très cool! Très utile. Maintenant, pouvons-nous faire cela avec les couches et les géodatabases également?
Mike
C'est vraiment génial!
dchaboya
Travail avant 10.4 J'ai analysé mxd avec le lecteur Hexa et la position de la version a changé (c'est après le chemin avant et aujourd'hui c'est avant le chemin et j'ajoute le mot de préfixe "Build Number" la valeur est (10.4.0.5524). Avec 10.3.1 I avoir 10,3,6 dans la partie de valeur hexa
GeoStoneMarten
1
cela ne semble pas fonctionner pour moi, en vérifiant les 10.6.1 mxds qui ont été réenregistrés en 10.2.2 (tous les retours 'version n'a pas pu être déterminée') ... y a-t-il eu des mises à jour dans les documents mxd à intégrer dans ce script?
JasonBK
14

La fonction ci-dessous est basée sur l'idée de Ryan, mais est un peu plus directe. Les documents cartographiques ArcGIS sont en fait des documents OLE, qui peuvent être analysés avec le oletoolsmodule (disponible sur pypi: https://pypi.python.org/pypi/oletools ). La fonction ouvre le fichier et lit la chaîne de version. Testé avec 9.0, 9.3, 10.1 et 10.3, mais devrait fonctionner avec n'importe quoi (pas sûr 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]))
Snorfalorpagus
la source
1
C'est aussi une excellente fonction. La seule hésitation que j'aurais contre l'utilisation de cette fonction est qu'elle nécessite que l'utilisateur télécharge / installe une bibliothèque tierce (oletools) que dans certaines organisations les utilisateurs peuvent ne pas être en mesure de faire.
RyanKDalton-OffTheGridMaps
Je n'ai qu'un seul vote, mais cela fonctionnera dans les cas où l'autre réponse ne fonctionne pas.
DWynne
Snorfalorpagus ça marche bien jusqu'à 10.3 mais pour 10.4 il y a une autre clé de flux 'Mx Document Version Info' avec la version complète du numéro de build. J'ai vérifié avec différentes versions d'arcgis et ma dernière version retourne 10.4.0.5524
GeoStoneMarten
Intéressant. Je ne suis pas encore passé à 10.4. Pourriez-vous partager un mxd vierge que je puisse voir?
Snorfalorpagus
1
@GeoStoneMarten Merci. J'ai regardé le document que vous avez envoyé. Il semble fonctionner avec le code d'origine - je ne vois pas le flux "Mx Document Version Info"?
Snorfalorpagus