ArcPy का उपयोग करके * .rr फ़ाइलों में फ़ीचर डेटासेट से जुड़े डेटा स्रोत पथ को बदलना


11

आर्कपी का उपयोग करके फ़ोल्डर X में प्रत्येक परत फ़ाइल के लिए स्रोत डेटा पथ कैसे बदल सकता है?

मैंने अपने सबसे अच्छे रूप में चापलूसी के साथ डेटा स्रोतों को अपडेट और फिक्सिंग का पालन ​​किया है , फिर भी मुझे Runtime error <type 'exceptions.ValueError'>: Layer: Unexpected errorजो भी मिल रहा है वह एक अनहेल्दी है जो मुझे यह बताने के लिए पर्याप्त नहीं है कि क्या गलत है या गायब है।

कोड का उपयोग करता है (एकल परत फ़ाइल का परीक्षण करने के लिए सरलीकृत):

import arcpy, os

fname = r'K:\Layers\xxx.lyr'
lyr = arcpy.mapping.Layer(fname)
oldpath = lyr.workspacePath
print 'oldpath: ', oldpath
lyr.findAndReplaceWorkspacePath(oldpath, r'C:\some\other.gdb')
print 'newpath: ', lyr.workspacePath

और परिणाम:

oldpath:  K:\Canvec_Utility\Temp.gdb
Traceback (most recent call last):
  File "x10x.py", line 12, in <module>
    lyr.findAndReplaceWorkspacePath(oldpath, r'C:\some\other.gdb')
  File "C:\ESRI\ArcGIS\Desktop10.0\arcpy\arcpy\utils.py", line 181, in fn_
    return fn(*args, **kw)
  File "C:\ESRI\ArcGIS\Desktop10.0\arcpy\arcpy\_mapping.py", line 601, in findAndReplaceWorkspacePath
    return convertArcObjectToPythonObject(self._arc_object.findAndReplaceWorkspacePath(*gp_fixargs((find_workspace_path, replace_workspace_path, validate), True
)))
ValueError: Layer: Unexpected error

((उत्तर में 'अद्यतन' अनुभाग स्थानांतरित)


Runtime error...ऊपर उद्धृत Arccatalog में इंटरैक्टिव अजगर खोल, जो एक ट्रैस नहीं देता से है। ट्रेसबैक के परिणाम एक कमांड शेल से कॉपी किए जाते हैं।
मैट विल्की

1
क्या आप डेटा सुविधा के साथ-साथ कार्यक्षेत्र में या उससे बाहर डेटा स्थानांतरित कर रहे हैं?
जियोग्राफिका

@geographika: हाँ एफडीएस के साथ-साथ कार्यक्षेत्र भी बदल रहा है। मुझे प्रलेखन द्वारा गुमराह किया गया जो कहता है कि एफडीएस निर्दिष्ट नहीं करते हैं, और यह कि एमएक्सडी और लियर की उपेक्षा करते हैं। दूसरी ओर मान्य उन्हें अनदेखा नहीं करता है, या कम से कम पूरी तरह से नहीं है (मेरा उत्तर देखें)।
मैट विल्की

जवाबों:


7

वर्कस्पेस और फीचर डेटापत्रों को स्विच करते समय उपयोग करने के लिए यह सही विधि की तरह दिखता है। lyr.replaceDataSource () । यहाँ मेरी स्क्रिप्ट काम कर रही है:

''' Change the datasource path for the given layer file '''

import arcpy, os

# layer file to re-path
fname = arcpy.GetParameterAsText(0)
# new path to workspace containing the feature class
target_wspace = arcpy.GetParameterAsText(1)
# where to save the layer files
savedir = arcpy.GetParameterAsText(2)

lyr = arcpy.mapping.Layer(fname)

fixed_fname = os.path.join(savedir, lyr.longName)

print '\nOld layer properties (%s)' % (fname)
print 'workspace:\t', lyr.workspacePath
print 'full path:\t', lyr.dataSource

try:
    lyr.replaceDataSource(target_wspace, 'FILEGDB_WORKSPACE', lyr.datasetName, True)
    lyr.saveACopy(fixed_fname)
except:
    print arcpy.GetMessages()

print '\nNew layer properties (%s)' % (fixed_fname)
print 'workspace:\t', lyr.workspacePath
print 'full path:\t', lyr.dataSource

del lyr

परीक्षण में ऐसा लगता है सत्यापित करें इस पद्धति में फिर से अलग है: यह सत्यापित करता है नया कार्यक्षेत्र मान्य है, लेकिन सुविधा वर्ग और सुविधा डेटासेट पर ध्यान नहीं देता - जिसका अर्थ है यह एक त्रुटि नहीं लौटेगा यदि लक्ष्य एफसी वहाँ नहीं है।

दूसरी ओर, यदि लक्ष्य FC मौजूद है, तो एक अलग सुविधा डेटासेट के अंदर भी, नया डेटा स्रोत पथ इसके अनुसार अनुकूलित है, भले ही वह सत्य हो या गलत हो।

अद्यतन: अब आसान साझाकरण और संशोधन के लिए अनुमति देने के लिए Github पर


क्या यह काम करता है जब मैं एक नए के साथ। श्रोत फ़ाइल को बदलना चाहता हूं? मुझे ValueError: परत: अप्रत्याशित त्रुटि मिली।
५:४१ पर जॉर्ज

@GeorgeC - मुझे पता है कि यह एक पुरानी पोस्ट है, लेकिन अगर किसी को यह खोज इंजन के माध्यम से मिलता है, तो इस त्रुटि का समाधान डेटासेट नाम से .shp को छोड़ने की संभावना है। IOW को तीसरा arg रिप्लेस करनाडाटा सोर्स को "newfile" नहीं "newfile.shp" होना चाहिए
perrygeo

6

unexpected errorइस उदाहरण में अनहेल्दी का अर्थ है "नया रास्ता मौजूद नहीं है"validateयदि निर्दिष्ट नहीं है, तो वैकल्पिक पैरामीटर True को डिफॉल्ट करता है। झूठी के साथ, स्क्रिप्ट त्रुटि के बिना पूरी होती है लेकिन परिणामी परत फाइलें अभी भी टूटी हुई थीं, भले ही गंतव्य पथ और सुविधा वर्ग मौजूद हो।

...    
lyr.findAndReplaceWorkspacePath(oldpath, r'C:\some\other.gdb', False)
...

परिणाम

oldpath:  K:\code\Canvec\Scripts\Temp.gdb
newpath:  C:\some\other.gdb

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

यह पता चलता है कि मान्य इस पर थोड़ा अलग कोण है। हां यह कोई फर्क नहीं पड़ता कि नए जियोडेटाबेस (कार्यक्षेत्र) में टारगेट फीचर क्लास रहता है , शीर्ष स्तर पर या पूरी तरह से अलग फीचर डेटासेट में। हालाँकि लक्ष्य कार्यक्षेत्र में एक ही नाम या मान्य विफल के साथ एक सुविधा डेटासेट होना चाहिए

टूटी और "फिक्स्ड" परतें, जैसा कि वे Arccatalog और Arcmap में देखते हैं

स्रोत :

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.