ArcMap दस्तावेज़ संस्करण का निर्धारण करने के लिए ArcPy का उपयोग करना?


21

क्या एक मैप दस्तावेज़ (एमएक्सडी) के संस्करण की पहचान करने के लिए आर्कपी के साथ एक तरीका है । मैं हमारे MXD के इन्वेंट्री के समाधान पर काम कर रहा हूं और जानना चाहता हूं कि कोई दस्तावेज 8.1, 9.2, 10.0 आदि है या नहीं।

मैं वर्तमान में आर्कजीआईएस 10.0 का उपयोग कर रहा हूं, लेकिन अगर 10.1 में कोई अद्यतन है जो 10.0 में मौजूद नहीं है, तो मुझे यह भी सुनना अच्छा लगेगा।

मैं देखता हूं कि आर्कजीआईएस संस्करण को आप प्रोग्रामिक रूप से कैसे पा सकते हैं? , लेकिन यह सभी आर्कोबजेक्ट्स समाधानों का संदर्भ देता है (जो मुझे लगता है कि मैं अजगर से कॉल कर सकता हूं , लेकिन मैं पसंद नहीं करूंगा)।


2
मुझे लगता है कि इसे MapDocument ऑब्जेक्ट में जोड़ने के लिए केवल-पढ़ने के लिए संस्करण संपत्ति के लिए एन्हांसमेंट अनुरोध की आवश्यकता हो सकती है । यदि आप एक खोजते हैं / बनाते हैं तो इसे यहां लिंक करें और मैं इसे वोट करूंगा।
पॉलिगियो

एक संस्करण नियंत्रण आर्किस आइडिया है। (ठीक है, 3 एक में विलय हो गया)
gm70560

मैंने आपकी स्क्रिप्ट की प्रतिलिपि बनाई, इसे अपने वातावरण के लिए थोड़ा संशोधित किया और इसे अपनी कुछ फ़ाइलों पर चलाया, लेकिन कुछ फ़ाइलों ने एक संस्करण को वापस नहीं किया, हालांकि मुझे पता है कि वे 9.3 या 10.0 में सहेजे गए थे। मुझे यकीन नहीं है कि अगर टूटे हुए डेटा स्रोत आपकी स्क्रिप्ट को गड़बड़ कर देंगे।

संबंधित: gisnuts.com/terra/blog/2014/02/24/… एक अनुत्तरित प्रश्न के उत्तर में एक टिप्पणी में @danjurgell द्वारा एक उत्कृष्ट खोज यहाँ स्वीकृत उत्तर के लिए। उस ब्लॉग पोस्ट के आधार पर, ऐसा करने के लिए कोई 100% विश्वसनीय तरीका नहीं है क्योंकि जानकारी अभी फ़ाइल में अनुमानित रूप से संग्रहीत नहीं है। यहां दोनों उत्तर कुछ समय के काम आएंगे , लेकिन सभी समय के नहीं।
क्रिस डब्ल्यू

जवाबों:


23

मुझे पता है कि यह सवाल कुछ महीने पुराना है, लेकिन मैं इस मामले में पोस्ट कर रहा हूं क्योंकि यह दूसरों की मदद करता है। मैंने एमएक्सडी दस्तावेजों से संस्करण संख्याओं को पार्स करने के लिए इस कीचड़ को विकसित किया। यह मूल रूप से एमएक्सडी दस्तावेज़ के पहले 4000 या तो पात्रों को पढ़ता है और एक संस्करण संख्या के लिए खोज करता है। मैंने एमएक्सडी संस्करण 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
>>>

यह बहुत अच्छा है! बहुत उपयोगी। अब क्या हम इसे लेयर्स और जियोडेट डेटाबेस के साथ भी कर सकते हैं?
माइक

यह शुद्ध भयानक है!
ढोबेबा

10.4 से पहले वर्क वेल में मैंने हेक्सा रीडर के साथ mxd का विश्लेषण किया है और संस्करण की स्थिति बदल गई है (यह पथ से पहले है और आज यह पथ से पहले है और "बिल्ड नंबर" उपसर्ग शब्द मान जोड़ें अगला है (10.4.0.5524) 10.2.1 के साथ। हेक्सा मूल्य भाग में 10.3.6 है
जियोस्टोनमार्टन

1
यह मेरे लिए काम नहीं करता है, 10.6.1 mxds के लिए जाँच जो 10.2.2 को फिर से शुरू किया गया है (सभी वापसी 'संस्करण निर्धारित नहीं किया जा सका') ... इस स्क्रिप्ट को एकीकृत करने के लिए mxd डॉक्स में कोई अद्यतन किया गया है?
जेसनबेक १B

14

नीचे दिया गया फ़ंक्शन रयान के विचार पर आधारित है, लेकिन थोड़ा अधिक प्रत्यक्ष है। आर्कजीस मैप दस्तावेज़ वास्तव में 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
यह एक महान कार्य भी है। इस फ़ंक्शन का उपयोग करने के लिए मेरे पास एकमात्र झिझक यह है कि इसके लिए उपयोगकर्ता को एक थर्ड पार्टी लाइब्रेरी (ओलेट्स) डाउनलोड करने / इंस्टॉल करने की आवश्यकता होती है, जो कुछ संगठनों में उपयोगकर्ता करने में सक्षम नहीं हो सकते हैं।
रयानडाल्टन

मुझे केवल एक वोट मिलता है, लेकिन यह उन मामलों में काम करेगा जहां अन्य जवाब नहीं देता है।
डीडवाना

Snorfalorpagus यह 10.3 तक अच्छी तरह से काम करता है लेकिन 10.4 के लिए पूर्ण बिल्ड नंबर संस्करण के साथ एक अन्य स्ट्रीम कुंजी 'Mx दस्तावेज़ संस्करण जानकारी' है। मैंने आर्कगिस के विभिन्न संस्करण और मेरे पिछले संस्करण के साथ जाँच की 10.4.0.5524
जियोस्टोनमार्टन

दिलचस्प। मैंने अभी तक 10.4 में अपग्रेड नहीं किया है। क्या आप मुझे देखने के लिए एक खाली mxd साझा कर सकते हैं?
स्नोरफालोर्पस

1
@GeoStoneMarten धन्यवाद। मैंने आपके द्वारा भेजे गए दस्तावेज़ को देखा है। ऐसा लगता है कि मूल कोड के साथ काम करने के लिए - मुझे "Mx दस्तावेज़ संस्करण जानकारी" स्ट्रीम दिखाई नहीं दे रही है?
स्नोरफालोर्पगस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.