अधिक

स्क्रिप्ट टूल में ArcPy.TableToExcel_conversion का उपयोग करने से स्वचालित रूप से जोड़ा गया डेटा हटा दिया जाता है

स्क्रिप्ट टूल में ArcPy.TableToExcel_conversion का उपयोग करने से स्वचालित रूप से जोड़ा गया डेटा हटा दिया जाता है


मैं उपयोग कर रहा हूँडेस्कटॉप के लिए आर्कजीआईएस १०.३.०.४३२२.

मेरे पास एक अजीबोगरीब घटना है जिसे मैं पूरी तरह से समझ नहीं पा रहा हूं। मेरे पास एक पायथन स्क्रिप्ट टूल है जो कई अलग-अलग चीजें करता है, जिसमें का उपयोग करना शामिल हैआर्कपी मैपिंग मॉड्यूलमें नया अधिग्रहीत डेटा जोड़ने के लिएवर्तमान.mxd देखने के लिए। यह पूरी तरह से ठीक काम करता है, सिवाय इसके कि जब थोड़ा अतिरिक्त कोड (पोस्ट के नीचे) चल रहा हो, जो वैकल्पिक रूप से (उपयोगकर्ता इनपुट के आधार पर) का उपयोग करता हैarcpy.TableToExcel_conversionउपयोगकर्ता को उनके द्वारा पूछे गए फीचर क्लास डेटा का एक्सेल स्प्रेडशीट संस्करण प्रदान करने के लिए टूल। स्क्रिप्ट को चलते हुए देखते समय, नया फीचर वर्ग,क्वेरी लेयर, .mxd की विषय-सूची में दिखाई देता है, केवल उसके तुरंत बाद गायब होने के लिए। जांच करते समय, फीचर वर्ग अभी भी मौजूद है और ठीक है (जैसा कि अपेक्षित होगा), जैसा किarcpy.TableToExcel_conversionउपकरण स्रोत फ़ाइल को नहीं हटाता है, यह केवल एक नई रूपांतरित फ़ाइल बनाता है। तो यह स्पष्ट है कि रूपांतरण के दौरान/बाद में कुछ हो रहा है (जैसा कि रूपांतरण के बिना यह ठीक काम करता है), लेकिन मुझे समझ में नहीं आता कि यह .mxd के डेटा फ्रेम/टीओसी से नए जोड़े गए फीचर वर्ग को क्यों हटा रहा है .

इस घटना के निवारण के अपने निरंतर प्रयासों में मैंने कुछ और भी चौंकाने वाला सीखा है। स्क्रिप्ट टूल जीयूआई में रहते हुए, अगर मैं जानबूझकर वैकल्पिक एक्सेल इनपुट को खाली छोड़ना चुनता हूं, इसलिए इसे जहां पर बनाना हैटेबल टू एक्सेलटूल नहीं चलेगा, फीचर क्लास डेटा अभी भी टीओसी से हटा दिया गया है। फिर से, जो मैं पहले से जानता था, उसकी पुन: पुष्टि करने के लिए, मैंने एक्सेल कोड (#) को कोड किया, और देखो और देखो, इसने पूरी तरह से ठीक काम किया और फीचर क्लास को टीओसी (और रुका हुआ) में जोड़ा गया। मुझे नहीं पता कि ऐसा क्यों/कैसे हो सकता है?

संपादित करें (६ जुलाई २०१५): जब इसे चलाने की कोशिश की जा रही होTableToExcel_रूपांतरणआर्कपी मैपिंग कोड से पहले उपकरण, मुझे यह त्रुटि प्राप्त होती है:

ट्रेसबैक (सबसे हालिया कॉल अंतिम): फ़ाइल "C:UserslwilsonDesktop est.py", पंक्ति 156, addLayer = arcpy.mapping.Layer(queryLayer) में # queryLayer फ़ाइल के लिए चर सेट करें "c:program फ़ाइलें (x86)arcgisdesktop10.3arcpyarcpyarcobjectsmixins.py", लाइन ३८९, में इस में सुपर (लेयरमिक्सिन, सेल्फ)।इस में(lyrfile) फ़ाइल "c:program files (x86)arcgisdesktop10.3arcpyarcpyarcobjects_base.py", लाइन 47, में इस में args में arg के लिए)) ValueError: Object: CreateObject Layer अमान्य डेटा स्रोत

मुझे पूरा यकीन नहीं है कि कोड के चलने के क्रम को बदलने के कारण परत अचानक एक अमान्य डेटा स्रोत कैसे है?

# आयात आर्कपी मॉड्यूल आयात आर्कपी # उपयोगकर्ता को डेटा आउटपुट के लिए उपयोग करने के लिए जियोडेटाबेस कार्यक्षेत्र का चयन करने के लिए कहें उपयोगकर्ता वर्कस्पेस = आर्कपी। गेटपैरामीटरएएसटेक्स्ट (0) # उपयोगकर्ता की पसंद के आधार पर कार्यक्षेत्र का वातावरण सेट करें आर्कपी.एनवी.वर्कस्पेस = उपयोगकर्ता वर्कस्पेस कनेक्शन oracleDB = arcpy.GetParameterAsText(1) # उपयोगकर्ता से क्वेरी लेयर का नाम पूछने के लिए कहें queryLayer = arcpy.GetParameterAsText(2) # उपयोगकर्ता से पूछें कि क्या वे पहले से नामित क्वेरी लेयर को अधिलेखित करना चाहते हैं Q = arcpy.GetParameterAsText(3) # उपयोगकर्ता से एक के लिए पूछें SQL क्वेरी एक्सप्रेशन को चयनित Oracle dB sqlQuery = arcpy.GetParameterAsText(4) के विरुद्ध चलाया जाना है # उपयोगकर्ता को एक्सेल फ़ाइल के आउटपुट का नाम देने के लिए कहें (यह वैकल्पिक है, जो एक्सेल विश्लेषण करना चाहते हैं) excelName = arcpy.GetParameterAsText(5 ) # उपयोगकर्ता से पूछें कि क्या वे पहले से नामित एक्सेल फ़ाइल को अधिलेखित करना चाहते हैं E = arcpy.GetParameterAsText(6) # उपयोगकर्ता को एक्सेल फ़ाइल के फ़ोल्डर आउटपुट का चयन करने के लिए कहें (वैकल्पिक रूप से, इस पर निर्भर करता है कि उपयोगकर्ता एक्सेल फ़ाइल चाहता है) excelFol der = arcpy.GetParameterAsText(7) # queryLayer को असाइन करने के लिए स्थानिक संदर्भ चर बनाएं SpatialRef = arcpy.SpatialReference("W:Coordinate SystemsLRS Lambert.prj") # प्रक्रिया: 'मेक क्वेरी लेयर' - का उपयोग करके एक क्वेरी लेयर बनाता है उपयोगकर्ता की Oracle dB और SQL क्वेरी अभिव्यक्ति arcpy.MakeQueryLayer_management(oracleDB, "Temp_Layer", sqlQuery, "UNIQUE_ID", "POINT", "1050010", स्थानिकRef) # क्वेरी लेयर के लिए उपयोगकर्ता की पसंद के लिए ओवरराइट आउटपुट सेट करें arcpy.env.overwriteOutput = overwriteQ # प्रोसेस: 'कॉपी फीचर्स' - अस्थायी क्वेरी लेयर को कॉपी करता है और इसे एक स्थायी फीचर क्लास आर्कपी के रूप में स्टोर करता है।CopyFeatures_management("Temp_Layer", queryLayer) # प्रोसेस: 'डिलीट फीचर्स' - अस्थायी फाइल को डिलीट करता है Temp_Layer # यह मल्टीपल के लिए अनुमति देता है त्रुटि के बिना एक ही ArcMap सत्र के भीतर इस उपकरण का निष्पादन arcpy.Delete_management("Temp_Layer") # प्रक्रिया: 'डिफाइन प्रोजेक्शन' - क्वेरीलेयर फीचर क्लास आउटपुट आर्कपी के प्रोजेक्शन को परिभाषित करता है। डिफाइनप्रोजेक्शन_मैनेजमेंट (क्वेरीलेयर, स्पैटियलरेफ) # पीआर ocess: 'फ़ील्ड जोड़ें' - queryLayer arcpy में नए कॉलम फ़ील्ड जोड़ता है। AddField_management(queryLayer, "First_Time", "DATE") # पहला LOGDT पिंग arcpy.AddField_management(queryLayer, "Last_Time", "DATE") # अंतिम LOGDT पिंग arcpy.AddField_management(queryLayer, "Total_Time", "STRING") # समय में पहले से अंतिम पिंग का योग आर्कपी। AddField_management(queryLayer, "Total_Pings", "INTEGER") # पिंग की कुल संख्या (पंक्तियाँ) आर्कपी। AddField_management (queryLayer, "Possible_Pings", "INTEGER") # दिए गए समय-सीमा में संभव पिंग की कुल संख्या arcpy.AddField_management(queryLayer, "Time_to_Process", "DATE") # प्रत्येक पिंग को संसाधित होने में कितना समय लगा # की कुल संख्या की गणना करता है Total_Pings फ़ील्ड के लिए पंक्तियाँ (पिंग) numRows = int(arcpy.GetCount_management(queryLayer).getOutput(0)) # UpdateCursor जो Total_Pings फ़ील्ड कर्सर को numRows का मान लिखेगा = arcpy.da.UpdateCursor(queryLayer, "Total_Pings" ) कर्सर में पंक्ति के लिए: पंक्ति [0] = numRows कर्सर.अपडेटरो (पंक्ति) # SearchCursor t टोपी LOGDT के मूल्यों को पढ़ेगा और पहला मान लौटाएगा (जल्द से जल्द) प्रयास करें: # उपयोगकर्ता की SQL क्वेरी के आधार पर मानों में पढ़ने का प्रयास करें firstLogdt = [row[0] पंक्ति के लिए arcpy.da.SearchCursor(queryLayer, "LOGDT" )] [0] को छोड़कर: # अपवाद त्रुटि यदि उपयोगकर्ता की SQL क्वेरी कोई वापसी त्रुटि उत्पन्न नहीं करती है = "SQL क्वेरी के माध्यम से कोई परिणाम नहीं मिला
SCRIPT EXITED" # त्रुटि संदेश चर arcpy.AddError(err) # प्रिंट त्रुटि संदेश sys.exit() # स्क्रिप्ट से बाहर निकलता है, आगे कोई भी चलाने का प्रयास नहीं करता है # UpdateCursor जो कर्सर में पंक्ति के लिए First_Time फ़ील्ड कर्सर = arcpy.da.UpdateCursor(queryLayer, "First_Time") को पहला (सबसे पुराना) LOGDT मान लिखेगा: पंक्ति [0 ] = firstLogdt कर्सर.updateRow(row) # SearchCursor जो LOGDT के मानों को पढ़ेगा और arcpy.da.SearchCursor(queryLayer, "LOGDT") में पंक्ति के लिए अंतिम मान (नवीनतम) lastLogdt = [row[0] लौटाएगा]] -1] # UpdateCursor जो Last_Time फ़ील्ड कर्सर को अंतिम (नवीनतम) LOGDT मान लिखेगा = arcpy.da.UpdateCursor(queryLayer, "Last_Time") कर्सर में पंक्ति के लिए: पंक्ति[ 0] = lastLogdt कर्सर.अपडेटरो (पंक्ति) # firstLogdt और lastLogdt timeDiff = lastLogdt - firstLogdt के बीच अंतर की गणना करता है # एक टाइमडेल्टा ऑब्जेक्ट बनाता है, डेटाइम नहीं # टाइमडिफ टाइम से सेकंड की कुल संख्या की गणना करता है। फ़ंक्शन जो टाइमसेक को एक पठनीय प्रारूप में बदल देगा (yy:dd:hh:mm:ss) डीईएफ़ रीडटाइम (सेकंड): मिनट, सेकंड = डिवमॉड (सेकंड, 60) घंटे, मिनट = डिवमॉड (मिनट, 60) दिन, घंटे = divmod(घंटे, 24) वर्ष, दिन = divmod(दिन, 365) वापसी '%02d:%02d:%02d:%02d:%02d'% (वर्ष, दिन, घंटे, मिनट, सेकंड) # UpdateCursor जो लिखेगा Total_Time फ़ील्ड कर्सर के लिए समय अंतर गणना = arcpy.da.UpdateCursor(queryLayer, "Total_Time") कर्सर में पंक्ति के लिए: पंक्ति [0] = रीडटाइम (टाइमसेक) कर्सर.अपडेटरो (पंक्ति) # पिंग की कुल संख्या की गणना करता है जो इष्टतम स्वागत संभव के साथ होगाPings = timeSecs/5 # 1 पिंग हर 5 सेकंड में # UpdateCursor जो पिंग की कुल संख्या को possib लिखेगा कर्सर में पंक्ति के लिए संभावित_पिंग्स फ़ील्ड कर्सर = arcpy.da.UpdateCursor(queryLayer, "Possible_Pings") पर ले जाएं: पंक्ति [0] = संभवपिंग कर्सर.अपडेट पंक्ति (पंक्ति) # वर्तमान .mxd मानचित्र प्रदर्शन में क्वेरी लेयर जोड़ने के लिए आर्कपी मैपिंग मॉड्यूल का उपयोग करना और इसे ज़ूम करें mxd = arcpy.mapping.MapDocument("CURRENT") # वैरिएबल को वर्तमान में सक्रिय पर सेट करें .mxd dataFrame = arcpy.mapping.ListDataFrames(mxd)[0] # mxd addLayer के भीतर पहले डेटा फ्रेम के बराबर वैरिएबल सेट करें = arcpy.mapping.Layer(queryLayer) # queryLayer के लिए चर सेट करें arcpy.mapping.AddLayer(dataFrame, addLayer) # मैप में queryLayer जोड़ता है dataFrame.zoomToSelectedFeatures() # queryLayer arcpy.RefreshActiveView() पर ज़ूम करता है # सक्रिय डेटा फ़्रेम के दृश्य को ताज़ा करता है # एक्सेल फाइल के लिए ओवरराइट आउटपुट को यूजर की पसंद के लिए सेट करें arcpy.env.overwriteOutput = overwriteE # वर्कस्पेस का वातावरण बदलें जहां यूजर चाहता है कि एक्सेल फाइल को सेव किया जाए: # एनवायरनमेंट वर्कस्पेस को यूजर के वैकल्पिक एक्सेल आउटपुट फोल्डर आर्कपी में बदलने की कोशिश करता है। env.workspace = एक्सेलएफ पुराने को छोड़कर: पास # यदि उपयोगकर्ता ने एक्सेल फ़ोल्डर इनपुट निर्दिष्ट नहीं किया है, तो पास होने दें और जारी रखें # प्रक्रिया: 'टेबल टू एक्सेल' - अंतिम क्वेरी किए गए डेटा को एक्सेल स्प्रेडशीट फ़ाइल में परिवर्तित करता है (वैकल्पिक) प्रयास करें: # टूल को चलाने का प्रयास करता है (केवल तभी काम करेगा जब उपयोगकर्ता वैकल्पिक एक्सेल इनपुट निर्दिष्ट करता है) arcpy.TableToExcel_conversion(queryLayer, excelName+'.xls') को छोड़कर: पास # यदि उपयोगकर्ता ने वैकल्पिक एक्सेल इनपुट निर्दिष्ट नहीं किया है, तो पास करें और जारी रखें # कर्सर हटाएं, पंक्ति चर डेल कर्सर , पंक्ति

मेरी भी यही समस्या थी। मैंने पहले एक्सेल में निर्यात करके संचालन के क्रम को उलट दिया, फिर परत को जोड़ा। या अगर वह काम नहीं करता है तो आप परत को फिर से जोड़ सकते हैं, नहीं?


वीडियो देखना: ArcGIS Data Interoperability In Action