Verwenden von ArcPy zum Ermitteln der ArcMap-Dokumentversion?

21

Gibt es eine Möglichkeit mit ArcPy die Version eines zu identifizieren Kartendokument (MXD). Ich arbeite an einer Lösung zur Inventarisierung unserer MXDs und möchte wissen, ob ein Dokument 8.1, 9.2, 10.0 usw. ist.

Ich verwende derzeit ArcGIS 10.0. Wenn es jedoch ein Update in 10.1 gibt, das in 10.0 nicht vorhanden ist, würde ich dies ebenfalls begrüßen.

Es wurde eine frühere Frage zu " Wie können Sie die ArcGIS-Version programmgesteuert finden?" Es verweist jedoch auf alle ArcObjects-Lösungen (die ich vermutlich von Python aus aufrufen könnte , aber ich würde es vorziehen, dies nicht zu tun ).

RyanDalton
quelle
2
Ich denke, dies erfordert möglicherweise eine Erweiterungsanforderung, damit eine schreibgeschützte Versionseigenschaft zum MapDocument-Objekt hinzugefügt wird. Wenn Sie einen finden / erstellen, verlinken Sie ihn hier und ich werde dafür stimmen.
PolyGeo
Es gibt eine Versionskontrolle für ArcGis Idea. (
Nun
Ich habe Ihr Skript kopiert, es geringfügig für meine Umgebung geändert und es für einige meiner Dateien ausgeführt, aber einige Dateien haben keine Version zurückgegeben, obwohl ich weiß, dass sie in 9.3 oder 10.0 gespeichert wurden. Ich bin nicht sicher, ob beschädigte Datenquellen Ihr Skript durcheinander bringen würden.
Related: gisnuts.com/terra/blog/2014/02/24/… Ein ausgezeichneter Fund von @danjurgell in einem Kommentar zu einer Folgefrage zu der akzeptierten Antwort hier. Basierend auf diesem Blog-Beitrag gibt es keine 100% zuverlässige Möglichkeit, dies zu tun, da die Informationen nicht auf vorhersehbare Weise in der Datei gespeichert werden. Beide Antworten hier arbeiten einige der Zeit , aber nicht alle der Zeit.
Chris W

Antworten:

23

Ich weiß, dass diese Frage ein paar Monate alt ist, aber ich poste dies, falls es anderen hilft. Ich habe diesen Kludge entwickelt, um Versionsnummern aus MXD-Dokumenten zu analysieren. Grundsätzlich werden die ersten 4000 Zeichen eines MXD-Dokuments gelesen und nach einer Versionsnummer gesucht. Ich habe mit MXD-Versionen 9.2, 9.3, 10.0 und 10.1 getestet.

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

Hier ist ein Beispiel für das Scannen eines Ordners nach MXD-Dateien und das Drucken der Version und der Namen

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

Was dies zurückgibt:

>>> 
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.
quelle
Das ist sehr cool! Sehr hilfreich. Können wir das jetzt auch mit Layern und Geodatabases tun?
Mike
Das ist echt der Hammer!
Dchaboya
Arbeitswoche vor 10.4 Ich habe mxd mit Hexa Reader analysiert und Versionsposition geändert (es ist nach Pfad vor und heute ist es vor Pfad und addiere "Build Number" Präfixwörter Wert ist als nächstes (10.4.0.5524). Mit 10.3.1 I haben 10.3.6 im Hexa-Wert-Teil
GeoStoneMarten
1
Dies scheint bei mir nicht zu funktionieren, da ich nach 10.6.1-Mxds gesucht habe, die auf 10.2.2 zurückgespeichert wurden (alle zurückgegebenen "Versionen konnten nicht ermittelt werden"). Gab es Aktualisierungen in mxd-Dokumenten, die in dieses Skript integriert werden sollten?
JasonBK
14

Die folgende Funktion basiert auf Ryans Idee, ist jedoch etwas direkter. ArcGIS- oletoolsKartendokumente sind tatsächlich OLE-Dokumente, die mit dem Modul analysiert werden können (verfügbar unter pypi: https://pypi.python.org/pypi/oletools ). Die Funktion öffnet die Datei und liest den Versionsstring. Getestet mit 9.0, 9.3, 10.1 und 10.3, sollte aber mit allem funktionieren (nicht sicher über 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
quelle
1
Das ist auch eine großartige Funktion. Ich würde nur zögern, diese Funktion zu verwenden, weil der Benutzer eine Drittanbieter-Bibliothek (Oletools) herunterladen / installieren muss, was in einigen Organisationen möglicherweise nicht möglich ist.
RyanDalton
Ich bekomme nur eine Stimme, aber das funktioniert in Fällen, in denen die andere Antwort nicht stimmt.
DWynne
Snorfalorpagus funktioniert bis 10.3, aber für 10.4 gibt es einen anderen Stream-Schlüssel 'Mx Document Version Info' mit der vollständigen Build-Nummer-Version. Ich habe mit einer anderen Version von arcgis nachgesehen und meine letzte Version hat 10.4.0.5524
GeoStoneMarten
Interessant. Ich habe noch kein Upgrade auf 10.4 durchgeführt. Könntest du ein leeres MxD für mich freigeben?
Snorfalorpagus
1
@GeoStoneMarten Danke. Ich habe mir das Dokument angesehen, das Sie gesendet haben. Es scheint mit dem Originalcode zu funktionieren - Ich sehe den Stream "Mx Document Version Info" nicht?
Snorfalorpagus