आर्कपी का उपयोग करके लेबल शैलियों (फ़ॉन्ट, रंग, आकार, आदि) को बदलना?


9

मैं आर्कजीआईएस 10.2 के लिए एक अजगर मैक्रो लिखने की कोशिश कर रहा हूं जो विभिन्न प्रकार के अपार्टमेंट के आधार पर एक परत में बिंदुओं को लेबल करने की प्रक्रिया को स्वचालित करेगा। उदाहरण के लिए, अपार्टमेंट की एक शैली में एक लेबल के रूप में सफेद बोल्ड पाठ के साथ एक नीला वर्ग होगा; दूसरे में काले रंग के बोल्ड टेक्स्ट के साथ एक गुलाबी वर्ग होगा; दूसरे में एक सफेद बोल्ड पाठ के साथ एक लाल वर्ग होगा, आदि।

इन लेबलों की शैली को बदलने के लिए आप आर्कपी में किस अभिव्यक्ति या कार्य का उपयोग करेंगे?

वर्तमान में, स्क्रिप्ट एक मैप कोड द्वारा अपार्टमेंट को लेबल करती है और अपना नाम TOC में अपार्टमेंट में बदल देती है, जैसा कि यह होना चाहिए।

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

अब मैं प्रत्येक के लिए एक अनूठा लेबल बनाने के लिए लेबल के फ़ॉन्ट, ग्राफिक और आकार को बदलना चाहता हूं, और फिर किसी भी समय हमें इन परतों में से किसी एक को करने के लिए प्रक्रिया को स्वचालित करने के लिए एक बटन दबाना होगा।

क्या पायथन स्क्रिप्टिंग (ArcPy, IDLE, आदि) के उपयोग से फोंट, लेबल और ग्राफिक्स को बदला जा सकता है?


मैंने इस पोस्ट को संपादित करने का फैसला किया, जो मैं यहां के लिए जा रहा हूं, इसका अंतिम विवरण देने के लिए ताकि कोई भ्रम न हो। अनिवार्य रूप से, नक्शे पर अंक इस से ऊपर की तस्वीर की तरह लगेंगे:

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


मैंने lblClass.expressionफ़ंक्शन का उपयोग करने की कोशिश की है, हालांकि मैं जिस कोड का उपयोग करने की कोशिश कर रहा हूं वह काम नहीं करता है। मुझे लगता है कि शायद सही दिशा में कदम है। नीचे कुछ कोड हैं जो मैंने लेबल के फोंट को बदलने के लिए लेबलक्लास.कप्रेशन प्राप्त करने के लिए उपयोग करने का प्रयास किया है।

for lblClass in aptLayer.labelClasses:
lblClass.showClassLabels = True
def getLabel (Code, Type):
if Type == "MRR":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
elif Type == "TAX":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
elif Type == "MRT":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
elif Type == "GSS":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
elif Type == "TGS":
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"
else:
    return "<FNT name = 'Arial' size = '12'>" & Code & "</FNT>"

lblClass.expression = getLabel( [Map_Code],[Type])

जवाबों:


7

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

आपको सिम्बॉलॉजी / लेबल बनाने की आवश्यकता है कि आप कैसे चाहते हैं, और इसे एक लेयर फाइल में सेव करें। फिर उस परत फ़ाइल को arcpy.mapping.UpdateLayer () का उपयोग करके लोड करें ।

यदि कई लोगों को अजगर ऐड-इन को चलाने की आवश्यकता है, तो आपको परत फ़ाइल को सभी के लिए सुलभ बनाने की आवश्यकता है, जैसे कि सार्वजनिक नेटवर्क ड्राइव।


मैंने एक कस्टम अपडेट लेयर प्रॉपर्टीज़ बॉक्स बनाया । यह आपको ArcMap TOC में एक परत का चयन करने की अनुमति देता है, और फिर एक इनपुट परत फ़ाइल का चयन करता है। यह तब परत फ़ाइल के भीतर सभी गुणों के साथ परत को अद्यतन करता है, और मूल सुविधा वर्ग में वापस-स्रोत। यह gdb, mdb, shp या sde में डेटा के साथ काम करेगा।

स्रोत कोड देखें

यदि आपके कोई सवाल हैं तो कृपया मुझे बताएं।

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


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

ऐसा करने के लिए मैं किस तरह के कार्यों की तलाश करूंगा? मैं फिर से सोर्सिंग से परिचित नहीं हूँ। मैं इस तरह से आपकी मदद की सराहना करता हूं।
टायलर स्पीयर्स

मैंने अपने कोड को फिट करने के लिए इसे समायोजित करने की कोशिश की। यह अपडेटलेयर फ़ंक्शन के माध्यम से काम करता है, लेकिन लाइन 35 पर: refocus_layer = arcpy.mapping.ListLayers(mxd, original_fc_name)[0]यह यह कहते हुए एक त्रुटि फेंकता है कि सूचकांक सीमा से बाहर है।
टायलर स्पीयर्स

इसका मतलब है कि arcpy.mapping.ListLayersविधि वर्तमान mxd में एक ही नाम के साथ एक परत नहीं पा रही है जैसा कि आपका input_layer_file( [0]सूची से बाहर लौटने का सूचकांक का मतलब है कि सूची में कोई आइटम नहीं हैं)।
XIY

मैंने किया था, और मुझे ऐसा लगता है कि यह बहुत करीब है, लेकिन समस्या यह है कि अपडेटलेयर भाग के खत्म होने के बाद, यह निम्नलिखित त्रुटि फेंकता है:Traceback (most recent call last): File "E:\_Tyler Temp\Python\IanTest.py", line 30, in <module> refocus_layer = arcpy.mapping.ListLayers(mxd, original_fc_name)[0] IndexError: list index out of range
टायलर स्पीयर्स

6

एक अन्य विकल्प अजगर पर कस्टम लेयर एक्सप्रेशन को बदलना (आकार और रंग को बदलना) है।

जैसे

def FindLabel ( [NAME], [POPULATION] ):
  if long([POPULATION]) >= 250000:
    return "<CLR red='255'><FNT size = '14'>" + [NAME] + "</FNT></CLR>"
  else:
    return [NAME]

बिल्डिंग लेबल के भाव

वे के माध्यम से सेट किया जा सकता है:

लेबलक्लास (आर्कपी। टैपिंग)

संपादित करें:

इसे इस्तेमाल करे:

def FindLabel ([Code], [Type]):
  if [Type] == "MRR":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  elif [Type] == "TAX":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  elif [Type] == "MRT":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  elif [Type] == "GSS":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  elif [Type] == "TGS":
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"
  else:
    return "<FNT name = 'Arial' size = '12'>" + Code + "</FNT>"

आप अपने अन्य लाइन स्टेटमेंट (लूप, लैबक्लास और कॉल टू फंक्शन के लिए) को हटा सकते हैं। साथ ही, फ़ंक्शन को FindLabel कहा जाना चाहिए।


मैंने इस तरह के एक फ़ंक्शन के समान कुछ का उपयोग करने की कोशिश की। मैंने एक परिभाषा बनाई, जिसे def getLabel (Code, Type)मैंने उपयोग किए जाने वाले अलग-अलग मानचित्र कोड के लिए if-else स्टेटमेंट सेट करने के बाद, मैंने तब 'lblClass.expression = getLabel ("[Map_Code]", "[Type]") सेट किया, जो अभी वापस आता है एक त्रुटि TypeError: unsupported operand type(s) for &: 'str' and 'str'मैं मूल रूप से Esri वेबसाइट के उदाहरणों का अनुसरण कर रहा हूं। अगर मैं बस साबित कर सकता हूं कि मैं फ़ॉन्ट बदल सकता हूं, तो मैं और अधिक कठिन पहलुओं (जैसे लेबल का आकार, पृष्ठभूमि और रंग) को समायोजित करने के लिए आगे बढ़ सकता हूं।
टायलर स्पीयर्स

@ टायलर स्पीयर्स, क्षेत्र के नामों के आसपास के दोहरे कोट्स को हटाने का प्रयास करें।
कलाकृति

जब मैं ऐसा करता हूं, तो यह कहता है कि पैरामीटर परिभाषित नहीं हैं।
टायलर स्पीयर्स

@ टायलर स्पीयर्स, क्या आप अपने प्रश्न में अपना कोड पोस्ट कर सकते हैं? आपके पास फ़ंक्शन कोष्ठकों के बाहर एक एकल उद्धरण है।
कलाकृति

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