ArcMap belge versiyonunu belirlemek için ArcPy kullanıyor musunuz?


21

ArcPy ile Harita Dokümanının (MXD) versiyonunu tanımlamanın bir yolu var mı ? MXD'lerimizi envanterlemek için bir çözüm üzerinde çalışıyorum ve bir belgenin 8.1, 9.2, 10.0, vb. Olup olmadığını bilmek istiyorum.

Şu anda ArcGIS 10.0 kullanıyorum, ancak 10.0'da 10.0'da bulunmayan bir güncelleme varsa, bunu da duymak isterim.

ArcGIS sürümünü programlı olarak nasıl bulabilirim? , ancak tüm ArcObjects çözümlerine atıfta bulunuyor (sanırım python'dan arayabilirim ama yapmamayı tercih ederim).


2
Bunun MapDocument nesnesine eklenecek salt okunur bir sürüm özelliği için bir geliştirme isteğine ihtiyacı olabileceğini düşünüyorum . Bir tane bulursanız / yaratırsanız, buraya link verin ve ben oylayacağım.
PolyGeo

ArcGis Idea'nın bir sürüm kontrolü var. (peki, 3
birle

Komut dosyanızı kopyaladım, ortamım için biraz değiştirdim ve dosyalarımın bazılarına koştum, ancak 9.3 veya 10.0'a kaydedildiklerini bilmeme rağmen dosyaların bazıları sürümü döndürmedi. Bozuk veri kaynaklarının betiğinizi karıştırıp karıştırmayacağından emin değilim.

Related: gisnuts.com/terra/blog/2014/02/24/… @danjurgell tarafından buradaki kabul edilmiş cevabın takip sorusu üzerine yapılan yorumda mükemmel bir bulgu . Bu blog gönderisine dayanarak, bunu yapmanın% 100 güvenilir bir yolu yoktur, çünkü bilgi dosyada öngörülebilir bir şekilde saklanmaz. Buradaki her iki cevap da zaman zaman işe yarar , fakat her zaman işe yaramaz .
Chris W,

Yanıtlar:


23

Bu sorunun birkaç aylık olduğunu biliyorum, ancak başkalarına yardımcı olması durumunda bunu gönderiyorum. MXD belgelerindeki sürüm numaralarını ayrıştırmak için bu çamuru geliştirdim. Temel olarak bir MXD belgesinin ilk 4000 karakterini okur ve sürüm numarasını arar. MXD versiyonları 9.2, 9.3, 10.0 ve 10.1 ile test ettim.

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

İşte mxd dosyaları için bir klasör tarama ve sürüm ve adların basılması örneği

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

Bunu döndüren:

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

Bu çok havalı! Çok kullanışlı. Şimdi bunu katman ve coğrafi veri tabanları ile de yapabilir miyiz?
Mike,

Bu saf harika!
dchaboya

10.4'ten önceki iş çalışmaları Hexa okuyuculu mxd'yi analiz ettim ve sürüm pozisyonu değişti (bundan önce ve bugünden sonra yoldan önce ve "Derleme Numarası" önek kelimeleri ekleyeceksin değeri (10.4.0.5524). 10.3.1 ile heksa değeri bölümünde
10.3.6 var

1
bu benim için işe yaramıyor gibi görünüyor, 10.2.2'ye geri yüklenen 10.6.1 mxds'yi kontrol ediyor (tüm iade 'sürümü belirlenemedi') ... mxd docs'da bu betiğe entegre edilecek herhangi bir güncelleme oldu mu?
JasonBK

14

Aşağıdaki işlev Ryan'ın fikrine dayanıyor ancak biraz daha doğrudan. ArcGIS harita belgeleri aslında oletoolsmodül ile ayrıştırılabilecek OLE belgeleridir (pypi'de bulunabilir: https://pypi.python.org/pypi/oletools ). İşlev dosyayı açar ve sürüm dizesini okur. 9.0, 9.3, 10.1 ve 10.3 ile test edilmiştir, ancak herhangi bir şeyle çalışmalıdır (3.x… 'den emin değil).

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
Bu da harika bir fonksiyon. Bu işlevi kullanmama karşı alacağım tek tereddüt, kullanıcının bazı kuruluşlarda kullanıcıların yapamayabileceği bir üçüncü taraf kütüphanesini (oletools) indirmesini / yüklemesini gerektirmesidir.
RyanDalton

Sadece bir oy alacağım, ancak diğer cevabın olmadığı durumlarda işe yarayacak.
DWynne

Snorfalorpagus 10.3'e kadar iyi çalışıyor ancak 10.4 için tam sürüm numarası sürümüne sahip başka bir 'Mx Document Version Info' akış anahtarı var. Arcgis'in farklı versiyonlarını kontrol ettim ve son versiyonum 10.4.0.5524 'e döndü
GeoStoneMarten

İlginç. Henüz 10.4'e yükseltme yapmadım. Görmem için boş bir mxd paylaşır mısınız?
Snorfalorpagus,

1
@GeoStoneMarten Teşekkürler. Gönderdiğiniz belgeye baktım. Orijinal kodla çalışıyor gibi görünüyor - "Mx Doküman Sürümü Bilgisi" akışını görmüyorum?
Snorfalorpagus,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.