वैकल्पिक लेबल को बदलना अगर पहला लेबल QGIS में फिट नहीं होता है?


10

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

मैं जो करना चाहूंगा उसकी कुछ प्रकार की अभिव्यक्ति है जो मैं चयन कर सकता हूं कि मानचित्र पर किस लेबल का उपयोग करना है और कौन सी पंक्तियों को विशेषता तालिका में शामिल करना है। कुछ ऐसा है isLabelledजो नक्शे के पैमाने, लेबल की लंबाई, फ़ॉन्ट आकार आदि को ध्यान में रखने में सक्षम होगा।


2
ध्यान रखें, कि यह मानचित्र के उपयोगकर्ता के लिए भ्रामक हो सकता है, जब एक ही फीचर क्लास के पॉलीगॉन को अलग-अलग तरीकों से लेबल किया जाता है और इसके अलावा उनमें से केवल एक विशेषता तालिका में दिखाई देती है।
लोंगिस्ट्रॉन

मैं GB की काउंटी नक्शा के बारे में सोच रहा हूँ
इयान Turton

फिट होने के लिए फ़ॉन्ट को गतिशील रूप से बदलने के बारे में क्या? आप सुविधाओं के आयामों में सबसे लंबे समय तक ले जा सकते हैं, लेबल स्ट्रिंग में कितने वर्णों से विभाजित कर सकते हैं, और या तो पैमाने के साथ कुछ गणित कर सकते हैं या केवल अपने पहले से सेट किए गए फ़ॉन्ट आकार को बदलने के लिए उपयोग कर सकते हैं ... वैकल्पिक रूप से आप उस माप का उपयोग कर सकते हैं (सबसे लंबे समय तक सुविधा आयाम / स्ट्रिंग के लेन) और अगर यह आईडी के साथ बहुत लंबा लेबल है।
जेसी मैकमिलन

ज्यादातर मैं पठनीयता के साथ संबंध रहा हूँ तो मैं करते फ़ॉन्ट आकार के साथ गड़बड़ नहीं करना चाहता
इयान Turton

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

जवाबों:


8

इसे करने के लिए कुछ हद तक अनुमानित (लेकिन उम्मीद के मुताबिक प्रभावी) तरीका है।

पहले कुछ गणित। हमें यह पता लगाने की जरूरत है कि एक निश्चित फ़ॉन्ट-आकार में कितने वर्णों में एक विशेषता हो सकती है। यहाँ जानने के लिए बातें / धारणाएँ:

  • मीट्रिक इकाइयाँ ग्रहण करते हुए, (नीचे थोड़ा परिवर्तन किया गया है जो हमारे लिए फुट क्रैस का काम कर सकता है।)
  • फ़ॉन्ट आकार फ़ॉन्ट ऊंचाई का एक माप है। ज्यादातर फॉन्ट उतने ही चौड़े होते हैं जितने ऊंचे होते हैं।
  • फ़ॉन्ट ऊंचाई के लिए pt का उपयोग करते हुए, 1pt को 0.035CM माना जाता है
  • यह मानते हुए कि आपके पार्सल लगभग आयताकार / नियमित हैं

यह जानने के लिए कि स्क्रीन / प्रिंट पर कोई आइटम कितनी देर तक है, हम इसका सबसे लंबे आयाम (लंबाई या ऊँचाई, या सिर्फ लंबाई का उपयोग कर सकते हैं यदि आपके लेबल केवल क्षैतिज हैं) / स्केल * 100 (एम से सीएम तक जाने के लिए)

तब हम देख सकते हैं कि क्या हमारा लेबल फिट होगा।

आप यह सब अभिव्यक्ति इंजन में कर सकते हैं, लेकिन एक कस्टम अजगर अभिव्यक्ति अधिक कुशल होगी। यहाँ कैसे एक बनाने के लिए एक ट्यूटोरियल है।

मेरी कस्टम अभिव्यक्ति:

from qgis.core import *
from qgis.gui import *

@qgsfunction(args='auto', group='Custom')
def labelFits(labelStr, fontPt, scaleM, feature, parent):
    # returns true if a label will fit in the feature at a given
    # font size and scale

    bbox = feature.geometry().boundingBox()

    # for CRS in us foot
    # fontWidth = fontPt * 0.0875

    # for CRS in metric
    # 1pt = 0.035CM
    fontWidth = fontPt * 0.035 * 0.5

    # length of maximum dimension on-screen/print in CM
    labelRoom =  max(bbox.width(),bbox.height()) / scaleM * 100

    # approx length of our label in CM based on font height * 0.5
    labelLen = len(labelStr) * fontWidth

    if labelRoom > labelLen:
        return True
    else:
        return False

तो बस लेबल में उस अभिव्यक्ति का उपयोग करें:

if(labelFits( "yourAttribute" , 8 , @map_scale ), "yourAttribute",$id)

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

आप उस अभिव्यक्ति का उपयोग उन चीजों को करने के लिए भी कर सकते हैं जैसे लेबल फिट होने या न होने के आधार पर रंग बदलना।


मानचित्र कैनवास के बाहर इस अभिव्यक्ति का उपयोग करने के लिए (जैसे कि एक संगीतकार लेबल या विशेषता तालिका में) हमें किसी दिए गए मानचित्र आइटम के पैमाने को प्रोग्रामेटिक रूप से प्राप्त करने का एक तरीका चाहिए। मैंने यह सुनिश्चित करने के लिए कोड पोस्ट किया है कि यहां एक अन्य उत्तर में विधि हमें एक अभिव्यक्ति getScale ('चित्रण', 'mapname') देती है ताकि इसे हमारी अभिव्यक्ति में शामिल किया जा सके:

if(
    labelFits( "yourAttribute" , 8 , getScale('composername','mapname')),
    "yourAttribute",$id)

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

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

केवल मामूली समस्या यह है कि फ़ंक्शन प्रिंट संगीतकार में विशेषता तालिकाओं में एक फिल्टर के रूप में काम नहीं करता है।
इयान Turton

क्या आपके नक्शे का पैमाना पृष्ठ-दर-पृष्ठ भिन्न होता है? @Map_scale वैरिएबल के बजाय स्केल में मैन्युअल रूप से डालने का प्रयास करें। मेरा अनुमान है कि विशेषता तालिका में आपके नक्शे पैमाने को जानने का कोई तरीका नहीं होगा। (क्योंकि उदाहरण के लिए आपके पास अलग-अलग पैमानों पर संगीतकार में कई मैप आइटम हो सकते हैं)
जेसी मैकमिलन

1
@iant मैंने एक और कस्टम अभिव्यक्ति के लिए एक लिंक पोस्ट किया है जो प्रोग्रामर मैप के पैमाने को प्रोग्रामेटिक रूप से प्राप्त करेगा।
जेसी मैकमिलन

3

परत को डुप्लिकेट करें, जिसमें कोई सहजीवन नहीं है, और प्रत्येक के लिए लेबल के लिए अलग ज़ूम स्तर / बाधा सेटिंग्स सेट करें।


1

मेरे पास हर सड़क को सड़क की परत में लेबल करने के दायित्व के साथ एक समान स्थिति थी। मेरा समाधान कैनवास को बड़े आकार में बनाना था, पीडीएफ को निर्यात करना और फिर पीडीएफ को उस आकार में प्रिंट करना था जो आवश्यक था।

उदाहरण के लिए, तैयार उत्पाद को A3 होना आवश्यक था। A3 पर कैनवास पर मैं सभी लेबल फिट नहीं कर सका। इसलिए मैंने कैनवास को A2 बनाया और इसने सभी लेबल को देखने की अनुमति दी। A2 आकार के नक्शे की एक पीडीएफ बनाएँ और इसे A3 के रूप में प्रिंट करें।

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