Używasz ArcPy do ustalenia wersji dokumentu ArcMap?

21

Czy w ArcPy istnieje sposób na identyfikację wersji dokumentu mapy (MXD). Pracuję nad rozwiązaniem inwentaryzacji naszych MXD i chciałbym wiedzieć, czy dokument ma wartość 8,1, 9,2, 10,0 itd.

Obecnie używam ArcGIS 10.0, ale jeśli istnieje aktualizacja w 10.1, która nie istnieje w 10.0, byłbym wdzięczny za to.

Widzę, że jest poprzednie pytanie: Jak programowo znaleźć wersję ArcGIS? , ale odwołuje się do wszystkich rozwiązań ArcObjects (które, jak sądzę, mógłbym wywołać z Pythona , ale wolałbym tego nie robić ).

RyanDalton
źródło
2
Myślę, że może to wymagać żądania rozszerzenia właściwości wersji tylko do odczytu, która zostanie dodana do obiektu MapDocument. Jeśli znajdziesz / utwórz taki link, kliknij link do niego tutaj, a ja głosuję na niego.
PolyGeo
Istnieje kontrola wersji ArcGis Idea. (cóż, 3 połączone w jeden)
gm70560
Skopiowałem twój skrypt, zmodyfikowałem go nieco dla mojego środowiska i uruchomiłem na niektórych moich plikach, ale niektóre pliki nie zwróciły wersji, chociaż wiem, że zostały zapisane w wersji 9.3 lub 10.0. Nie jestem pewien, czy zepsute źródła danych zepsułyby twój skrypt.
Powiązane: gisnuts.com/terra/blog/2014/02/24/... Doskonałe znalezisko autorstwa @danjurgell w komentarzu do pytania uzupełniającego do zaakceptowanej odpowiedzi tutaj. Na podstawie tego postu na blogu nie ma w 100% niezawodnego sposobu, aby to zrobić, ponieważ informacje po prostu nie są przechowywane w pliku w przewidywalny sposób. Obie odpowiedzi tutaj będą działać przez pewien czas, ale nie przez cały czas.
Chris W

Odpowiedzi:

23

Wiem, że to pytanie ma kilka miesięcy, ale zamieszczam je na wypadek, gdyby pomogło to innym. Opracowałem tę kludge, aby analizować numery wersji z dokumentów MXD. Zasadniczo odczytuje około 4000 pierwszych znaków dokumentu MXD i wyszukuje numer wersji. Testowałem z wersjami MXD 9.2, 9.3, 10.0 i 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

Oto przykład skanowania folderu w poszukiwaniu plików MXD i drukowania wersji i nazw

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

Który zwraca to:

>>> 
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.
źródło
To jest bardzo fajne! Bardzo przydatne. Czy teraz możemy to zrobić również z warstwami i geobazami?
Mike
To jest niesamowite!
dchaboya
Pracuj we wcześniejszych wersjach niż 10.4. Analizowałem mxd z czytnikiem Hexa, a pozycja wersji uległa zmianie (jest przed ścieżką przed, a dziś jest przed ścieżką i dodaje następną wartość przedrostka „Numer kompilacji” (10.4.0.5524). mają 10.3.6 w części wartości
heksadecymalnej
1
wydaje mi się, że to nie działa, sprawdzając, czy 10.6.1 mxds zostało ponownie zapisane do 10.2.2 (nie można ustalić wszystkich zwracanych wersji) ... czy były jakieś aktualizacje w dokumentach mxd do zintegrowania z tym skryptem?
JasonBK
14

Poniższa funkcja oparta jest na pomyśle Ryana, ale jest nieco bardziej bezpośrednia. Dokumenty mapy ArcGIS są w rzeczywistości dokumentami OLE, które można analizować z oletoolsmodułem (dostępne na pypi: https://pypi.python.org/pypi/oletools ). Funkcja otwiera plik i odczytuje ciąg wersji. Testowany z 9.0, 9.3, 10.1 i 10.3, ale powinien działać z czymkolwiek (nie jestem pewien co do wersji 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
źródło
1
To także świetna funkcja. Jedyne wahanie, które chciałbym mieć przeciwko użyciu tej funkcji, to to, że wymaga ona pobrania / zainstalowania biblioteki strony trzeciej (oletools), czego w niektórych organizacjach użytkownicy mogą nie być w stanie zrobić.
RyanDalton
Mam tylko jeden głos, ale zadziała to w przypadkach, gdy druga odpowiedź nie.
DWynne,
Snorfalorpagus działa dobrze do 10.3, ale dla 10.4 istnieje inny klucz strumienia „Informacje o wersji dokumentu Mx” z pełną wersją numeru wersji. Sprawdziłem inną wersję Arcgis i moja ostatnia wersja zwróciła 10.4.0.5524
GeoStoneMarten
Ciekawy. Nie uaktualniłem jeszcze do 10.4. Czy możesz mi udostępnić pusty mxd, który zobaczę?
Snorfalorpagus
1
@GeoStoneMarten Thanks. Przejrzałem wysłany dokument. Wygląda na to, że działa z oryginalnym kodem - nie widzę strumienia „Informacje o wersji dokumentu Mx”?
Snorfalorpagus