পাইকিজিআইএস ব্যবহার করে নিয়ম-ভিত্তিক লেবেলিং নিয়ন্ত্রণ করছেন?


15

এই প্রশ্নটি অনুসরণ করে: কিউজিআইএস-এর সমস্ত স্তরগুলির সমস্ত লেবেল কীভাবে চালু / বন্ধ করবেন , ওপি তার মন্তব্যে উল্লেখ করেছেন যে তিনি নিয়ম-ভিত্তিক লেবেল ব্যবহার করেন। আমি এই ধরণের লেবেলগুলি কীভাবে পড়তে এবং সংশোধন করতে পারি তা কেবল অনলাইনে অনুসন্ধান করার চেষ্টা করেছি তবে কেবল লট্রাকনসালটিং থেকে এই পোস্টটি সন্ধান করতে পেরেছি :

নিয়ম-ভিত্তিক লেবেলিং যুক্ত করার সুবিধার্থে, কিউজিসআইএস লেবেলিং ইঞ্জিন ইন্টারফেসে কিছু অভ্যন্তরীণ পরিবর্তন করা হয়েছিল। লেবেলিংটি এখন নতুন ক্লাস দ্বারা চালিত হয়েছে QgsLabelingEngineV2যার সাথে এর সাথে যুক্ত হতে পারে বেশ কয়েকটি লেবেল সরবরাহকারী।

শুনে ভালো লাগছে. যাইহোক, কিউজএলবেলিংয়েজিনভি 2 ক্লাসের মাধ্যমে পড়ার সময় এটি উল্লেখ করে:

এই শ্রেণিটি এখনও সর্বজনীন API এর অংশ নয়।

পাইথন ব্যবহার করে নিয়ম-ভিত্তিক লেবেলিং নিয়ন্ত্রণ করা কি বর্তমানে সম্ভব?


1
আমি গিথুবের কিগিস ডকুমেন্টেশন প্রকল্পে এখানে একটি উন্মুক্ত সমস্যা পেয়েছি যার মধ্যে এটির উল্লেখ রয়েছে । আমি মাস্টার বা 2.18 শাখায় class শ্রেণীর জন্য একটি এসআইপি বাঁধাই করতে পারি না, তাই আমার সন্দেহ হয় যে এটি এখনও কেবল সি ++ কোডে উপলব্ধ।
স্টিভেন কে

@ স্টিভেনকে - দুর্দান্ত সন্ধান, ধন্যবাদ! তারা যদি এটির জন্য একটি এপিআই তৈরি করে তবে বেশ কার্যকর হবে ... সম্পাদনার জন্য ধন্যবাদ, আমি ভেবেছিলাম আমি ক্লাসের জন্য সঠিক লিঙ্কটি পেস্ট করেছি :)
জোসেফ

@ স্টিভেনকে - আমি মনে করি তারা এখনই এটির জন্য একটি এপিআই করেছে, বিশেষত কিউজেসরুলবেসড লেবেলিং ক্লাস :)
জোসেফ

উত্তর:


6

নতুন কিউজিআইএস 3 এপিআই দিয়ে স্ক্র্যাচ থেকে নিয়ম ভিত্তিক লেবেলিং সেটআপ করতে কিছু সহায়তার নীচে

#Configure label settings
settings = QgsPalLayerSettings()
settings.fieldName = 'myFieldName'
textFormat = QgsTextFormat()
textFormat.setSize(10)
settings.setFormat(textFormat)
#create and append a new rule
root = QgsRuleBasedLabeling.Rule(QgsPalLayerSettings())
rule = QgsRuleBasedLabeling.Rule(settings)
rule.setDescription(fieldName)
rule.setFilterExpression('myExpression')
root.appendChild(rule)
#Apply label configuration
rules = QgsRuleBasedLabeling(root)
myLayer.setLabeling(rules)
myLayer.triggerRepaint()

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

সম্পাদনা

এটি এখন স্থির হয়েছে, লেবেলিং () ফাংশনটি একটি QgsRuleBasedLabeling () ফেরত দেয়: https://github.com/qgis/QGIS/commit/4b365a8f47d96b35f7609859e580388927ae0606


আপনার উত্তরের জন্য ধন্যবাদ, সুন্দরভাবে কাজ করেছে! আশা করি আপনার আপত্তি নেই তবে আমি আপনার পোস্টটি সামান্য সম্পাদনা myLayer.triggerRepaint()করে স্তরটি রিফ্রেশ করার জন্য অন্তর্ভুক্ত করেছি এবং নিয়মগুলি স্থির করার সাথে সাথে লেবেলগুলি প্রদর্শন করার অনুমতি দেয় :)
জোসেফ

3

কিউজিআইএস 3 থেকে , একটি নতুন কিউজস রুলবেসড লেবেলিং ক্লাস রয়েছে যা আপনাকে নতুন এপিআই ব্যবহার করে নিয়ম-ভিত্তিক লেবেলিং নিয়ন্ত্রণ করতে দেয়।

QgsRuleBasedLabeling :: বিধি ব্যবহার করে বিধিগুলি যুক্ত করা যায়


( দুর্ভাগ্যক্রমে, আমি এই মুহুর্তে ২.৯৯ সংস্করণটি পরীক্ষা করতে পারছি না But তবে আমি যদি উত্তরটির কোনও কার্যকারণ উদাহরণ সরবরাহ করে তবে আমি আনন্দের সাথে গ্রহণ করব ))


1

QGIS 2.18 এর অধীনে নিয়ম-ভিত্তিক প্রতীকায় একটি ফিল্টার এক্সপ্রেশনটি পরিবর্তন করতে আমি এটি ব্যবহার করি, আপনি যা চাইছেন তা নিশ্চিত না। Http://qgis.org/api/2.18/classQgsRuleBasedRendererV2.html এ এপিআই রেফারেন্স

import re
lddLrs = qgis.utils.iface.legendInterface().layers()    #get all loaded layers
for lyr in lddLrs:
    if (lyr.type()==QgsMapLayer.VectorLayer and lyr.name()=='layer_with_rules'): rLyr = lyr

newType = 1
for child in rLyr.rendererV2().rootRule().children():
    oldFilter = child.filterExpression()  #you can print this to see what the old expression is
    print oldFilter

    newFilter = re.sub(r"type = (\d*)", r"type = {0}".format(newType), oldFilter)  #this is an example to substitute a rule-based filter to a new number
    print newFilter

    child.setFilterExpression(newFilter)

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