ArcPy का उपयोग करके प्रोग्राम में शामिल होने का पता लगाना?


10

मेरे पास कुछ पायथन कोड है जो एक आर्कपॉज परियोजना के भीतर से लॉन्च किया गया है। मेरे कोड को चलाने के लिए उपयोगकर्ता द्वारा प्रोजेक्ट में बनाए गए किसी भी जोड़ को हटाया जाना चाहिए। दुर्भाग्य से, कोड जो एक जॉइन को हटाता है ... arcpy.RemoveJoin_management ("layer1", "layer2") ... कुछ परत गुणों को भी तोड़ता है जो मेरे अनुप्रयोग (हाइलाइट किए गए फ़ील्ड, रीड-ओनली फ़ील्ड, आदि) के लिए महत्वपूर्ण हैं।

यदि ArcMap में लेयर को राइट-क्लिक करके और "जॉइन रिमूव्स" को चुनकर जॉइंट्स हटा दिए जाते हैं तो लेयर प्रॉपर्टीज़ बरकरार रहती हैं।

यदि मैं यह पता लगा सकता हूं कि मेरे कोड के भीतर एक जॉइन मौजूद है, तो मैं कोड से बाहर निकलूंगा और एक संदेश प्रदर्शित करूंगा कि कोड को चलाने का प्रयास करने से पहले उपयोगकर्ता को मैन्युअल रूप से अपने जॉइन को निकालना होगा। तो ... क्या एक जॉइन प्रोग्रामेटिकली पता लगाया जा सकता है?


मैं थोड़ा हटा दिया गया है कि कैसे चापलूसी के माध्यम से RemoveJoin समस्याओं का कारण बनता है। यह केवल पढ़ने योग्य क्षेत्र को बर्बाद करने के बारे में कैसे जा रहा है? इसके अलावा, ArcMap में निकालें में शामिल उपकरण का उपयोग करता है एक ही मुद्दों का कारण?
नाथानुस

हो सकता है कि इससे निपटने का एक और तरीका आपके अजगर कोड को जुड़ने के लिए असंवेदनशील बनाना होगा?
दान एस।

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

@ दान एस। - मैं अपने कोड में इन्सर्ट कर्सर और इस तरह का उपयोग कर रहा हूँ। मुझे नहीं पता कि मैं अपने कोड को जुड़ने के लिए असंवेदनशील कैसे बनाऊंगा।
ब्रायन पेस्ले

1
खैर, यह पूछने लायक था। ;) मंचों .esri.com/Thread.asp?c=93&f=1729&t=293173 को लगता है कि आप तालिका नाम से कॉलम नामों को जोड़कर पूर्वनिर्धारित तालिका में मान अपडेट कर सकते हैं, हालाँकि; शायद यह एक सम्मिलित भर में भी काम करेगा?
दान एस।

जवाबों:


8

बहुत बुरा वहाँ एक है नहीं है। संपत्ति पर संपत्ति । परत वर्ग । मुझे लगता है कि आप फील्ड के नामों को देखकर जॉइन कर सकते हैं। यहां फ़ाइल जियोडेटाबेस में डेटा के लिए अवधारणा का एक सरल प्रमाण है:

import arcpy, arcpy.mapping as arc

def joinCheck(lyr):
  fList = arcpy.Describe(lyr).fields
  for f in fList:
    if f.name.find(lyr.datasetName) > -1:
      return True
  return False

arcpy.env.workspace = r'<path_to_your_gdb>'
mxd = arc.MapDocument(r'<path_to_your_mxd>')
lyrs = arc.ListLayers(mxd)
for lyr in lyrs:
  # ignore group layers
  if not lyr.isGroupLayer:
    hasJoin = joinCheck(lyr)
    if hasJoin:
      print '\nFound a join: %s.' % lyr.datasetName
    else:
      print '\nNo join found on %s.' % lyr.datasetName

यह होनहार लग रहा है! मुझे समझ में नहीं आ रहा है कि यह क्या कर रहा है: "अगर f.name.find (lyr.datasetName)> -1:", लेकिन मैं इसे कुछ दिनों में आज़माऊंगा और वापस रिपोर्ट करूंगा (मैं बर्फ़ जमने वाला हूँ) & शक्ति खोना!) ... धन्यवाद!
ब्रायन पेस्ले

मदद करने में खुशी। अजगर स्ट्रिंग्स के लिए बिल्ट इन फाइंड मेथड को देखें : docs.python.org/library/string.html और साथ ही आर्कफी फील्ड ऑब्जेक्ट्स के लिए डॉक: help.arcgis.com/en/arcgisdesktop/10/help/index.html#/ फ़ील्ड /… मैं कहूंगा कि इस कोड को अपने डेटा के साथ एक शॉट दें और देखें कि क्या यह काम करता है।
डेरेक स्विंगले

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

फ़ील्ड नाम के दृष्टिकोण में "डॉट" आर्कपी.एमपी (प्रो) मॉड्यूल के साथ एक विकल्प है क्योंकि लेयर के लिए कोई डेटासेट नहीं है। संपत्ति
आमिर सुलेमान

1

मुझे लगता है कि आप पाएंगे कि GP ऑब्जेक्ट्स के साथ ऐसा करने का कोई बुलेटप्रूफ तरीका नहीं है, आपको ArcObjects और कॉमोडिप का उपयोग करना होगा। ईएसआरआई मंचों से मानक जीपी उपकरण / ऑब्जेक्ट्स के साथ जुड़ने में कठिनाइयों पर कुछ चर्चा यहां दी गई है: https://geonet.esri.com/thread/20317


ArcObjects और comtypes इस परियोजना के लिए समाधान नहीं होने जा रहे हैं, वे मेरे लिए विदेशी हैं और यह परियोजना कल होने वाली है। मुझे उस मंच के धागे की ओर इशारा करने के लिए धन्यवाद! मैं वहां प्रस्तुत विचार की कोशिश करने जा रहा हूं: "... जांचें कि क्या fieldname.split (") में से कोई भी परिणाम 2 भागों में होगा, जिसमें सबसे पहले ज्वाइन टेबल होगा! "
BrianPeasley
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.