ArcGIS फील्ड कैलकुलेटर के पायथन पार्सर में बेसिक अगर / फिर?


18

मैं डेस्कटॉप के लिए ArcGIS 10.2 का उपयोग कर रहा हूं, और मैं इस साइट को देख रहा हूं, और अभी तक मेरे उत्तर का पता नहीं लगा सकता। वीबीए और पायथन के लिए बहुत नया है, लेकिन आर्कगिस के साथ बहुत साल। मुझे पता है कि मैं सिलेक्ट बाय अटेंशन के साथ इसे धीमा कर सकता हूं, लेकिन यह समय लेने वाला है।

मैं एक बीमारी (पॉइंट लेयर) और यूएस सेंसस ट्रैक्ट्स (बहुभुज परत) के मामलों के बीच एक स्थानिक जुड़ाव का प्रयास कर रहा हूं। इसके लिए गिनती डेटा की आवश्यकता होती है। प्रत्येक बिंदु / मामले के लिए, मेरे पास एक फ़ील्ड है जिसका नाम YEAR है जिसकी तिथि 2001 से 2012 है और यह निर्भर करता है कि मामला किस वर्ष हुआ। मुझे प्रत्येक वर्ष के लिए एक गणना कॉलम की आवश्यकता है। उदाहरण के लिए, मैं पहला COUNT01 कह रहा हूं। यदि YEAR में केस की तारीख 2001 है, तो COUNT01 में 1 होगा। यदि यह किसी अन्य वर्ष (2002-2012) है, तो 0. होना आवश्यक है। मेरे पास COUNT02, COUNT03 ... COUNT12 कॉलम होंगे। "शून्य" मान नहीं हो सकता।

यहाँ मैंने अभी तक क्या किया है

यहाँ छवि विवरण दर्ज करें

और यहां आर्क में डेटा कैसा दिखता है।

यहाँ छवि विवरण दर्ज करें


3
मेरा सुझाव है कि आप पायथन का उपयोग करके ऐसा करते हैं vbaऔर vbscriptटैग के साथ टैग को बदलने के लिए अपने प्रश्न को संपादित करते हैं python। हालांकि अभी तक नहीं गया है VBScript वंचित होने की प्रक्रिया में है । मुझे उम्मीद है कि एक बार और अधिक विस्तृत विवरण प्रदान करने के लिए यह पायथन पार्सर के साथ करना आसान होगा जिसमें वास्तविक इनपुट और अपेक्षित आउटपुट दिखाने वाले कुछ नमूना पंक्तियों की एक तस्वीर / तालिका शामिल है। क्या YEAR एक दिनांक फ़ील्ड या एक पूर्णांक फ़ील्ड है जिसमें वर्षों से संबंधित मान हैं?
PolyGeo

सलाह और मदद के लिए धन्यवाद। मैंने विशेषता तालिका की एक छवि जोड़ी है। YEAR इनपुट वैरिएबल वर्तमान में एक डबल के रूप में संग्रहीत किया गया है (इसे एसएएस डेट से पार्स किया गया था), और आउटपुट वेरिएबल कॉलम काउंट्स 01 को शॉर्ट इंटेगर के रूप में संग्रहीत किया गया है।
बेनडब्ल्यू

1
क्या आपने अपने मामले के क्षेत्र के रूप में YEAR के साथ सारांश सांख्यिकी का उपयोग करने पर विचार किया है ? आपको पायथन या फील्ड कैलकुलेटर का उपयोग करने की आवश्यकता के बिना प्रत्येक वर्ष के लिए आपको COUNT देना चाहिए।
PolyGeo

आपके सुझाव के लिए धन्यवाद। मैंने सारांश सांख्यिकी पर विचार किया, लेकिन अंतिम लक्ष्य 1,249 व्यक्तिगत जनगणना पथों के अनुसार वार्षिक मामले की गणना करना है, जहां से मैं प्रति 100k वार्षिक और 10yr औसत घटनाओं की गणना कर सकता हूं। कुछ जनगणना ट्रैकों में कोई मामला नहीं था, कुछ में एक टन था, लेकिन मुझे उन सभी को शामिल करने की आवश्यकता है। यहां तक ​​कि वर्ष तक ट्रैक्ट को संक्षेप में प्रस्तुत करना उन 278 में से किसी भी मामले में नहीं है।
BenW

जवाबों:


38

मुझे लगता है कि यह वही है जो आप चाहते हैं .... अजगर का उपयोग करके आप निम्नलिखित कार्य कर सकते हैं (YEAR और COUNT0X फ़ील्ड पूर्णांक हैं)

  • नीचे हाइलाइट किए गए पायथन में बदलें
  • कोड को 'प्री लॉजिक' इनपुट बॉक्स में जोड़ें
  • गणना करें कि आपके द्वारा गणना की जाने वाली प्रत्येक फ़ील्ड के लिए आवश्यकतानुसार वर्ष (2001 का उपयोग करना होगा), Count02 2002 का उपयोग करेगा, आदि)

ध्यान दें कि कोड को पार्स करने के लिए इंडेंटेशन का उपयोग करते हुए पायथन सुनिश्चित करें कि रिक्ति सही है।

def myCalc(year,yearVal):
  if (year == yearVal):
    return 1
  else:
    return 0

इस


3
@BenW - यदि इससे आपकी समस्या हल हो गई है, तो कृपया इसे उत्तर के रूप में चिह्नित करें (उत्तर मतगणना के तहत चेक बॉक्स)।
चाड कूपर

यदि मुझे कथन में स्ट्रिंग मान की जाँच करनी हो तो क्या करना चाहिए जिसमें उच्चारण अक्षर शामिल हैं?
ग्रेलाइन

यदि फ़ील्ड दूसरे प्रकार जैसे टेक्स्ट, डबल, आदि पर हों तो क्या करें?
खलीफ

@khaliff आप अजगर कोड में कुछ प्रकार के रूपांतरण फ़ंक्शन सम्मिलित कर सकते हैं उदाहरण के लिए if (int(year) == yearVal): , या अन्य (देखें: Informit.com/articles/article.aspx?p=459269&seqNum=7 )।
जिंससाइड

धन्यवाद। क्या आपके पास एक लिंक भी है जहाँ मैं अपने बारे में पा सकता हूँ कि myCalc, myFunc, Reclass इत्यादि का उपयोग कब करना है?
खलीफ

8

यह उत्तर अनिवार्य रूप से ऊपर सूचीबद्ध के समान है, हालांकि यह कोड ब्लॉक का उपयोग नहीं करने का एक तरीका है ... काउंट01 फ़ील्ड के लिए, आप पार्सर को पायथन में सेट करेंगे और फिर अपनी गणना को इसमें सेट करेंगे

1 if !YEAR! == 2001 else 0

यह जिस तरह से पढ़ता है वह है: फ़ील्ड को 1 पर सेट करें यदि YEAR फ़ील्ड 2001 है, अगर यह 2001 नहीं है, तो इसे 0 पर सेट करें ...

यदि आपके पास कई स्थितियां हैं, तो आप 2 (और बाद के) "घोंसले" को घोंसले में रख सकते हैं, यदि "कथन" के अंदर स्थितियां, जैसे कि ...

1 if !YEAR! == 2001 else (2 if !YEAR! == 2002 else 0)

जिस तरह से यह पढ़ता है: फ़ील्ड को 1 पर सेट करें यदि YEAR फ़ील्ड 2001 है, अगर यह 2001 नहीं है, तो इसे 2 पर सेट करें यदि यह 2002 है, यदि नहीं, तो इसे 0 पर सेट करें ...


यदि मेरी एक से अधिक स्थिति है, तो मुझे इस गणना को कैसे संशोधित करना चाहिए, मेरा मतलब है जैसे हम "एलिफ" का उपयोग कर रहे हैं?
खलीफ

यदि आपके पास एक से अधिक स्थितियां हैं, तो आप 2 (और बाद में) "घोंसले" को घोंसले में रख सकते हैं, "यदि किसी अन्य कथन के अंदर स्थितियां हैं ... तो आप कुछ इस तरह से समाप्त कर सकते हैं ...1 if !YEAR! == 2001 else (2 if !YEAR! == 2002 else (3 if !YEAR! == 2003 else 0))
जेसन मिलर

6

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

सही फ़ील्ड कैलकुलेटर का उपयोग


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