আর্কপি ব্যবহার করে লেবেল শৈলীর (ফন্ট, রঙ, আকার, ইত্যাদি) পরিবর্তন করছেন?


9

আমি আর্কজিআইএস 10.2 এর জন্য পাইথন ম্যাক্রো লেখার চেষ্টা করছি যা বিভিন্ন ধরণের অ্যাপার্টমেন্টের ভিত্তিতে একটি স্তরে লেবেল পয়েন্টগুলির প্রক্রিয়াটি স্বয়ংক্রিয় করবে auto উদাহরণস্বরূপ, এক স্টাইলের অ্যাপার্টমেন্টে একটি নীল বর্গক্ষেত্র থাকবে যেখানে একটি লেবেল হিসাবে সাদা গা bold় পাঠ্য থাকবে; অন্যটির কালো গোলাপী পাঠ্য সহ গোলাপী বর্গক্ষেত্র থাকবে; অন্য একটিতে একটি সাদা বোল্ড পাঠ্য সহ একটি লাল স্কোয়ার থাকবে have

এই লেবেলের শৈলীর পরিবর্তন করতে আপনি আরকিপিতে কোন অভিব্যক্তি বা ফাংশন ব্যবহার করবেন?

বর্তমানে, স্ক্রিপ্টটি একটি মানচিত্রের কোড দ্বারা অ্যাপার্টমেন্টগুলিকে লেবেল করেছে এবং এটিটির নামটি টিওসি-তে অ্যাপার্টমেন্টগুলিতে পরিবর্তন করা উচিত, যেমনটি হওয়া উচিত।

এখানে চিত্র বর্ণনা লিখুন

এখন আমি প্রত্যেকটির জন্য একটি অনন্য লেবেল তৈরি করতে দেখতে লেবেলের ফন্ট, গ্রাফিক এবং আকার পরিবর্তন করতে চাই এবং তারপরে একটি বোতাম টিপুন এবং কেবল আমাদের যখন এই স্তরগুলির একটি করতে হবে তখন প্রক্রিয়াটি স্বয়ংক্রিয়ভাবে স্বয়ংক্রিয়ভাবে তৈরি করতে চাই।

পাইথন স্ক্রিপ্টিং (আরকিপি, আইডিএল, ইত্যাদি) ব্যবহার করে হরফ, লেবেল এবং গ্রাফিকগুলি কীভাবে পরিবর্তন করা যায়?


আমি এখানে যাচ্ছি তার চূড়ান্ত বিবরণ দিতে এই পোস্টটি সম্পাদনা করার সিদ্ধান্ত নিয়েছি যাতে কোনও বিভ্রান্তি নেই। মূলত, মানচিত্রের পয়েন্টগুলি উপরের ছবির মতো দেখতে এই দিকে যাবে:

এখানে চিত্র বর্ণনা লিখুন


আমি 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

আরকিপি.ম্যাপিং এপিআই কেবলমাত্র সীমিত সংখ্যক স্তর বৈশিষ্ট্যে অ্যাক্সেস সরবরাহ করে যা সরাসরি সংশোধন করা যায় তবে স্তর বৈশিষ্ট্য ডায়ালগ বাক্সে পাওয়া সমস্ত বৈশিষ্ট্য আপডেটলায়ার ফাংশনটি ব্যবহার করে সংশোধন করা যেতে পারে। তথ্যটি একটি উত্স স্তর থেকে নিষ্কাশন করা হয় এবং মানচিত্রে নথিতে স্তরে প্রয়োগ করা হয় যা আপডেট করা দরকার। উত্স_লেয়ারটি হয় মানচিত্রের নথির মধ্যে একটি স্তর (.lyr) ফাইল বা একটি স্তর হতে পারে। আপডেট লেয়ার একটি শক্তিশালী ফাংশন কারণ এটি বিভিন্ন ফলাফল উত্পাদন করতে বিভিন্ন উপায়ে ব্যবহার করা যেতে পারে।

আপনার কীভাবে প্রতীক / লেবেল তৈরি করতে হবে এবং এটি একটি স্তর ফাইলে সংরক্ষণ করতে হবে। তারপরে আরসিপি.ম্যাপিং.আপডেটলায়ার () ব্যবহার করে সেই স্তর ফাইলটি লোড করুন ।

যদি একাধিক ব্যক্তিকে পাইথন অ্যাড-ইন চালানো দরকার হয়, তবে আপনাকে স্তর ফাইলটি সবার জন্য অ্যাক্সেসযোগ্য যেমন একটি পাবলিক নেটওয়ার্ক ড্রাইভ তৈরি করতে হবে।


আমি একটি কাস্টম আপডেট লেয়ার প্রোপার্টি টুলবক্স তৈরি শেষ করেছি । এটি আপনাকে আর্কম্যাপ টিওসিতে একটি স্তর নির্বাচন করতে এবং তারপরে একটি ইনপুট স্তর ফাইল নির্বাচন করতে দেয়। তারপরে এটি স্তর ফাইলের মধ্যে সমস্ত বৈশিষ্ট্য সহ স্তরটিকে আপডেট করে এবং পুনরায় উত্সগুলি মূল বৈশিষ্ট্য শ্রেণিতে ফিরে আসে। এটি gdb, mdb, shp, বা sde- তে থাকা ডেটা নিয়ে কাজ করবে।

উত্স কোড দেখুন

আপনার কোনো প্রশ্ন থাকলে আমাকে জানান.

এখানে চিত্র বর্ণনা লিখুন


আমি সমস্ত সেট (সিমোলজি এবং লেবেল) এর সাথে অন্য পয়েন্ট ভিত্তিক ডেটা স্তর থেকে একটি পৃথক স্তর ফাইল তৈরি করেছি, এটি কার্যকর করে, তবে এটি যা করায় সেটি লেবেলযুক্ত, আনসিম্বলাইজড অ্যাপার্টমেন্ট ফাইলটিকে (যাকে আমি যুক্ত করতে বেছে নেব) সম্পূর্ণরূপে প্রতিস্থাপন করা হবে সোর্স লাইয়ার অ্যাপার্টমেন্ট ফাইল। আমি ধরে নিচ্ছি যে এটি "শুধুমাত্র আপডেটের প্রতীকতত্ত্ব" বিভাগে ভুয়া কারণে। এমন কোনও উপায় রয়েছে যা এটি সম্পাদন করা যায় তাই এটি কেবলমাত্র প্রতীক এবং লেবেল প্রয়োগ করবে তবে পয়েন্টগুলি অন্য কোনও জায়গায় সরিয়ে দেবে না?
টাইলার স্পিয়ার্স

এটি করার জন্য আমি কী ধরণের ফাংশন সন্ধান করব? আমি রি-সোর্সিংয়ের সাথে খুব বেশি পরিচিত নই। আমি এখন পর্যন্ত আপনার সাহায্যের প্রশংসা করি।
টাইলার স্পিয়ারস

আমি আমার কোড ফিট করার জন্য এটি সামঞ্জস্য করার চেষ্টা করেছি। এটি আপডেটলায়ার ফাংশনটির মাধ্যমে কাজ করে তবে ৩৫ তম লাইনে: refocus_layer = arcpy.mapping.ListLayers(mxd, original_fc_name)[0]এটি ত্রুটি ছুঁড়ে বলেছে যে সূচকটি সীমার বাইরে।
টাইলার স্পিয়ার্স

এর অর্থ হল যে arcpy.mapping.ListLayersপদ্ধতিটি আপনার বর্তমান নাম অনুসারে বর্তমান এমএক্সডিতে একটি স্তর খুঁজে পাচ্ছে না input_layer_file( [0]তালিকা অনুসারে রেট ছাড়ার সূচকটি বোঝায় যে তালিকায় কোনও আইটেম নেই)।
দ্বাদশ

আমি করেছি, এবং আমার মনে হচ্ছে এটি খুব কাছাকাছি, তবে সমস্যাটি হ'ল আপডেট লেয়ার অংশটি শেষ হওয়ার পরে এটি নিম্নলিখিত ত্রুটিটি ছুঁড়ে ফেলেছে: 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 ("[মানচিত্র_কোড]", "[টাইপ]")' সেট করেছিলাম, যা কেবল ফিরে আসে একটি ত্রুটি TypeError: unsupported operand type(s) for &: 'str' and 'str'আমি মূলত Esri ওয়েবসাইটের উদাহরণ অনুসরণ করছি। আমি যদি সহজভাবে প্রমাণ করতে পারি যে আমি ফন্টটি পরিবর্তন করতে পারি তবে আমি আরও জটিল দিকগুলি (যেমন লেবেলের আকার, পটভূমি এবং রঙ) সামঞ্জস্য করতে এগিয়ে যেতে পারি।
টাইলার স্পিয়ারস

@ টাইলার স্পিয়ার্স, মাঠের নামগুলির কাছাকাছি দ্বিগুণ উদ্ধৃতি সরিয়ে ফেলার চেষ্টা করুন।
শিল্পকর্ম 21

আমি যখন এটি করি, তখন এটি বলে যে প্যারামিটারগুলি সংজ্ঞায়িত হয়নি।
টাইলার স্পিয়ারস

@ টাইলার স্পিয়ার্স, আপনি কি আপনার প্রশ্নে আপনার কোড পোস্ট করতে পারেন? ফাংশন বন্ধনীর বাইরে আপনার একক উদ্ধৃতি রয়েছে।
শিল্পকর্ম 21

অবশ্যই, আমি আমার কোডটি দেখানোর জন্য আমার প্রশ্ন আপডেট করেছি।
টাইলার স্পিয়ার্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.