Menggunakan ArcPy untuk menentukan versi dokumen ArcMap?

21

Apakah ada cara dengan ArcPy untuk mengidentifikasi versi Dokumen Peta (MXD). Saya sedang mengerjakan solusi untuk menginventarisir MXD kami dan ingin tahu apakah suatu dokumen 8.1, 9.2, 10.0, dll.

Saya saat ini menggunakan ArcGIS 10.0, tetapi jika ada pembaruan di 10.1 yang tidak ada di 10.0, saya akan sangat senang mendengarnya juga.

Saya melihat ada pertanyaan sebelumnya tentang Bagaimana Anda dapat menemukan versi ArcGIS secara terprogram? , tetapi referensi semua solusi ArcObjects (yang saya kira saya bisa menelepon dari python , tapi saya lebih suka tidak melakukannya).

Ryan Dalton
sumber
2
Saya pikir ini mungkin memerlukan permintaan tambahan untuk properti versi read-only untuk ditambahkan ke objek MapDocument. Jika Anda menemukan / membuat satu maka tautkan ke sini dan saya akan memilihnya.
PolyGeo
Ada kontrol versi ArcGis Idea. (yah, 3 digabung menjadi satu)
gm70560
Saya menyalin skrip Anda, memodifikasinya sedikit untuk lingkungan saya dan menjalankannya pada beberapa file saya, tetapi beberapa file tidak mengembalikan versi walaupun saya tahu mereka disimpan di 9.3 atau 10.0. Saya tidak yakin apakah sumber data yang rusak akan mengacaukan skrip Anda.
Terkait: gisnuts.com/terra/blog/2014/02/24 /... Temuan hebat oleh @danjurgell dalam komentar pada pertanyaan lanjutan untuk jawaban yang diterima di sini. Berdasarkan posting blog itu, tidak ada cara yang dapat diandalkan 100% untuk melakukan ini karena info tidak disimpan dalam file dengan cara yang dapat diprediksi. Kedua jawaban di sini akan bekerja beberapa waktu tetapi tidak semua waktu.
Chris W

Jawaban:

23

Saya tahu pertanyaan ini berumur beberapa bulan, tetapi saya memposting ini kalau-kalau membantu orang lain. Saya mengembangkan kludge ini untuk mem-parsing nomor versi dari dokumen MXD. Ini pada dasarnya membaca 4000 atau lebih karakter pertama dari dokumen MXD dan mencari nomor versi. Saya menguji dengan versi MXD 9.2, 9.3, 10.0, dan 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

Berikut adalah contoh pemindaian folder untuk file mxd dan mencetak versi dan namanya

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

Yang mengembalikan ini:

>>> 
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.
sumber
Ini keren sekali! Sangat berguna. Sekarang bisakah kita melakukan ini dengan layer dan geodatabase juga?
Mike
Ini benar-benar luar biasa!
dchaboya
Work weel before 10.4 Saya telah menganalisis mxd dengan Hexa reader dan posisi versi telah berubah (setelah path sebelum dan hari ini sebelum path dan menambahkan nilai awalan "Build Number" kata berikutnya adalah (10.4.0.5524). Dengan 10.3.1 I memiliki 10.3.6 di bagian nilai hexa
GeoStoneMarten
1
ini sepertinya tidak bekerja untuk saya, memeriksa 10.6.1 mxds yang telah direseksi ke 10.2.2 (semua kembali 'versi tidak dapat ditentukan') ... apakah ada pembaruan dalam dokumen mxd untuk diintegrasikan ke dalam skrip ini?
JasonBK
14

Fungsi di bawah ini didasarkan pada ide Ryan, tetapi sedikit lebih langsung. Dokumen peta ArcGIS sebenarnya adalah dokumen OLE, yang dapat diuraikan dengan oletoolsmodul (tersedia di pypi: https://pypi.python.org/pypi/oletools ). Fungsi membuka file dan membaca string versi. Diuji dengan 9.0, 9.3, 10.1 dan 10.3, tetapi harus bekerja dengan apa saja (tidak yakin tentang 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
sumber
1
Itu fungsi yang hebat juga. Satu-satunya keraguan saya akan menentang penggunaan fungsi ini adalah bahwa hal itu mengharuskan pengguna untuk mengunduh / menginstal perpustakaan pihak ketiga (oletools) yang di beberapa organisasi pengguna mungkin tidak dapat melakukannya.
RyanDalton
Saya hanya mendapatkan satu suara, tetapi ini akan berhasil jika jawaban yang lain tidak.
DWynne
Snorfalorpagus berfungsi dengan baik hingga 10.3 tetapi untuk 10.4 ada kunci aliran lainnya 'Info Versi Dokumen Mx' dengan versi nomor versi lengkap. Saya memeriksa versi arcgis yang berbeda dan versi terakhir saya mengembalikan 10.4.0.5524
GeoStoneMarten
Menarik. Saya belum memutakhirkan ke 10.4. Bisakah Anda membagikan MXD kosong untuk saya lihat?
Snorfalorpagus
1
@ GeoStoneMarten Terima kasih. Saya telah melihat dokumen yang Anda kirim. Tampaknya berfungsi dengan kode asli - Saya tidak melihat aliran "Info Versi Dokumen Mx"?
Snorfalorpagus