ใช้ ArcPy เพื่อกำหนดรุ่นของเอกสาร ArcMap หรือไม่


21

มีวิธีใดบ้างในการใช้ ArcPy เพื่อระบุรุ่นของเอกสารแผนที่ (MXD) ฉันกำลังหาทางแก้ไขสินค้าคงคลัง MXD ของเราและต้องการทราบว่าเอกสารคือ 8.1, 9.2, 10.0 หรือไม่

ฉันกำลังใช้ ArcGIS 10.0 แต่ถ้ามีการอัพเดทใน 10.1 ที่ไม่มีอยู่ใน 10.0 ฉันก็ยินดีที่ได้ยินเช่นกัน

ฉันเห็นว่ามีคำถามก่อนหน้านี้ของวิธีที่คุณสามารถหารุ่น ArcGIS โดยทางโปรแกรม? แต่มันอ้างอิงการแก้ปัญหาทั้งหมดของ ArcObjects (ซึ่งฉันคิดว่าฉันสามารถโทรจากไพธ อนได้ แต่ฉันไม่ต้องการ)


2
ฉันคิดว่านี่อาจต้องมีการร้องขอการปรับปรุงสำหรับคุณสมบัติรุ่นอ่านอย่างเดียวเพื่อเพิ่มลงในวัตถุ MapDocument หากคุณพบ / สร้างลิงก์ให้ลิงค์ที่นี่แล้วฉันจะลงคะแนนให้
PolyGeo

มีArcGis Idea สำหรับควบคุมเวอร์ชัน (รวม 3 เข้าด้วยกันเป็นหนึ่งเดียว)
gm70560

ฉันคัดลอกสคริปต์ของคุณแก้ไขมันเล็กน้อยสำหรับสภาพแวดล้อมของฉันและรันมันบนไฟล์บางไฟล์ของฉัน แต่ไฟล์บางไฟล์ไม่ส่งคืนเวอร์ชันแม้ว่าฉันจะรู้ว่าพวกเขาบันทึกไว้ใน 9.3 หรือ 10.0 ฉันไม่แน่ใจว่าแหล่งข้อมูลที่เสียหายจะทำให้สคริปต์ของคุณเสียหายหรือไม่

ที่เกี่ยวข้อง: gisnuts.com/terra/blog/2014/02/24/…การค้นพบที่ยอดเยี่ยมโดย @danjurgell ในความคิดเห็นเกี่ยวกับคำถามติดตามเพื่อคำตอบที่ยอมรับได้ที่นี่ จากการโพสต์บล็อกนั้นไม่มีวิธีที่เชื่อถือได้ 100% ในการทำเช่นนี้เพราะข้อมูลไม่ได้ถูกจัดเก็บในไฟล์ในลักษณะที่คาดการณ์ได้ คำตอบทั้งสองที่นี่จะทำงานบางครั้ง แต่ไม่ตลอดเวลา
Chris W

คำตอบ:


23

ฉันรู้ว่าคำถามนี้อายุไม่กี่เดือน แต่ฉันโพสต์นี้ในกรณีที่มันช่วยคนอื่น ฉันพัฒนา kludge นี้เพื่อแยกวิเคราะห์หมายเลขรุ่นจากเอกสาร MXD โดยทั่วไปจะอ่านอักขระ 4000 ตัวแรกหรือมากกว่านั้นของเอกสาร MXD และค้นหาหมายเลขเวอร์ชัน ฉันทดสอบด้วย MXD รุ่น 9.2, 9.3, 10.0 และ 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

นี่คือตัวอย่างของการสแกนโฟลเดอร์สำหรับไฟล์ mxd และพิมพ์รุ่นและชื่อ

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

ซึ่งส่งคืนสิ่งนี้:

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

นี่มันเจ๋งมาก! มีประโยชน์มาก. ตอนนี้เราสามารถทำกับเลเยอร์และฐานข้อมูลภูมิศาสตร์ได้หรือไม่
Mike

นี่คือบริสุทธิ์ที่ยอดเยี่ยม!
dchaboya

Weel ทำงานก่อน 10.4 ฉันได้วิเคราะห์ mxd ด้วย Hexa reader และตำแหน่งเวอร์ชันมีการเปลี่ยนแปลง (หลังจาก path ก่อนและวันนี้เป็นก่อน path และเพิ่ม "Build Number" คำนำหน้าค่าคำถัดไปคือ (10.4.0.5524) ด้วย 10.3.1 I มี 10.3.6 ในส่วนค่า hexa
GeoStoneMarten

1
ดูเหมือนว่ามันจะไม่ทำงานสำหรับฉันการตรวจสอบ 10.6.1 mxds ที่ถูกบันทึกใหม่เป็น 10.2.2 (ไม่สามารถระบุรุ่นที่ส่งคืนได้ทั้งหมด)) ... มีการอัปเดตใด ๆ ใน mxd docs ที่รวมเข้ากับสคริปต์นี้หรือไม่
JasonBK

14

ฟังก์ชั่นด้านล่างนี้เป็นไปตามความคิดของไรอัน แต่ก็ค่อนข้างตรงไปตรงมา เอกสารแผนที่ ArcGIS เป็นเอกสาร OLE ซึ่งสามารถแยกวิเคราะห์ด้วยoletoolsโมดูล (มีอยู่ใน pypi: https://pypi.python.org/pypi/oletools ) ฟังก์ชั่นเปิดไฟล์และอ่านสตริงรุ่น ทดสอบกับ 9.0, 9.3, 10.1 และ 10.3 แต่ควรใช้งานได้ทุกอย่าง (ไม่แน่ใจเกี่ยวกับ 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]))

1
นั่นเป็นฟังก์ชั่นที่ยอดเยี่ยมเช่นกัน ความลังเลเพียงอย่างเดียวที่ฉันมีต่อการใช้งานฟังก์ชั่นนี้คือต้องการให้ผู้ใช้ดาวน์โหลด / ติดตั้งไลบรารีบุคคลที่สาม (oletools) ซึ่งในบางองค์กรผู้ใช้อาจไม่สามารถทำได้
RyanDalton

ฉันได้รับเพียงหนึ่งเสียง แต่มันจะใช้ได้ในกรณีที่คำตอบอื่นไม่ได้
DWynne

Snorfalorpagus ใช้งานได้ดีจนถึง 10.3 แต่สำหรับ 10.4 จะมีคีย์สตรีมอื่น ๆ 'Mx Document Version Info' พร้อมกับหมายเลขบิลด์เต็ม ฉันตรวจสอบกับรุ่นต่าง ๆ ของ arcgis และรุ่นล่าสุดของฉันส่งคืน 10.4.0.5524
GeoStoneMarten

น่าสนใจ ฉันยังไม่อัปเกรดเป็น 10.4 คุณช่วยแบ่งปันเปล่า mxd ให้ฉันดูได้ไหม?
Snorfalorpagus

1
@GeoStoneMarten ขอบคุณ ฉันดูเอกสารที่คุณส่งไปแล้ว ดูเหมือนว่าจะทำงานกับรหัสต้นฉบับ - ฉันไม่เห็นกระแสข้อมูล "Mx Document Version Info" หรือไม่
Snorfalorpagus
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.