क्या QGIS प्रोजेक्ट में डायनामिक लेयर नाम होना संभव है?


9

मेरे पास परतों के साथ एक QGIS परियोजना है, जो PostGIS SQL प्रश्नों पर आधारित है जो वर्तमान तिथि का उपयोग करते हैं। चूंकि डेटाबेस में डेटा बदलता है, इसलिए ये क्वेरीज़ हर नए दिन में अलग-अलग डेटा लौटाती हैं।

क्या परत वृक्ष पैनल में परत के नाम को गतिशील रूप से बदलना संभव है, इसलिए यह वर्तमान तिथि का प्रतिनिधित्व करता है? (जैसे परत नाम Traffic on 24.01.2015, जैसे कि हर दिन बदलता है)। कैप्शन के लिए डेटा को एक परत में किसी भी विशेषता के विशेषता से लिया जाना चाहिए - वे सभी फ़ील्ड के लिए समान मूल्य हैं traffic_date


वास्तव में आप अपने डेटाबेस तालिका, "ट्रैफ़िक" या वर्तमान तिथि से क्या निकालेंगे?
जर्मेन कैरिलो

मैं एक लेयर के लिए करंट डेट के लिए डेटा निकाल रहा हूं और अन्य लेयर्स के लिए डेटा का पूर्वानुमान लगा रहा हूं। तो "24.01.2015" वास्तव में एक क्षेत्र मूल्य है, जो डेटाबेस से आता है। मुझे तिथि के अनुसार स्वचालित रूप से बदलने के लिए परियोजना में परत नाम की आवश्यकता है।
मोफयोडा

क्या हर बार प्रोजेक्ट लोड होने पर नाम बदलना ठीक रहेगा?
नाथन डब्ल्यू

जवाबों:


13

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

प्रोजेक्ट खुलने पर आपको हर बार पायथन मैक्रो लिखने की आवश्यकता होगी। यह वर्कफ़्लो होगा:

  1. निम्नलिखित पायथन कोड के साथ जाएं QGIS->Project->Project Propertiesऔर बदलें openProject():

    def openProject():
        import re, qgis     
        iface = qgis.utils.iface
        layers = iface.mapCanvas().layers()
        for lyr in layers:
            # Get date from layer
            it=lyr.getFeatures()
            feat = next(it)
            idx = lyr.fieldNameIndex('traffic_da')
            currDate = feat.attributes()[idx]
    
            # Set new layer name
            name = lyr.name()
            if re.search(' on \d{2,2}.\d{2,2}.\d{4,4}$', name):
                 name = name[:-14]
            name = name + " on " + currDate
            lyr.setLayerName( name )

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

    नोट 1: मैंने इसे शेपफाइल्स पर टेस्ट किया, इसलिए जिस फील्ड से मैं traffic_daडेट लेता हूं, वह यह है कि शेपफाइल्स फील्ड नामों में अधिक अक्षरों का समर्थन नहीं करते हैं। अपनी परतों पर काम करने के लिए कोड में समायोजित करें।

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

  2. सुनिश्चित करें कि आप अपने प्रोजेक्ट पर मैक्रोज़ को सक्षम करें, इस तरह से: Settings->Options->General->Enable macros: Always

  3. अपनी परतों को प्रोजेक्ट में लोड करें।

  4. अपना प्रोजेक्ट सहेजें।

हर बार जब आप इस बिंदु से अपनी परियोजना खोलते हैं, तो आपकी परत के नाम गतिशील होंगे, तिथि traffic_dateप्रत्येक परत की विशेषता तालिका पर फ़ील्ड से ली जाएगी ।

पहली बार मैंने इस परियोजना को खोला, इस तरह से मेरी परत के नाम गतिशील रूप से उत्पन्न हुए:

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

मुझे लगता है कि इससे आपको शुरुआत करने में मदद मिल सकती है। मुझे बताएं कि क्या आप गैर-स्पष्ट मुसीबतों का सामना कर रहे हैं।


मुझे आपकी टिप्पणी पढ़कर पता चला, 1 एस पोस्ट करने से पहले मैंने जवाब प्रस्तुत किया। परतों की विशिष्ट व्यवस्था को फिट करने के लिए कोड में कुछ समायोजन किए जाने चाहिए, लेकिन मुझे उम्मीद है कि @mofoyoda उनसे निपट सकता है।
जर्मेन कैरिलो

1
हाँ, यह अच्छा है पहले जाओ। तुम भी onregex का उपयोग करने पर बचाने के लिए अंत में वहाँ से और पट्टी के सूचकांक पा सकते हैं ।
नाथन डब्ल्यू

1
@gcarrillo तीव्र! लेकिन महान!
DPSSpatial

1
@gcarrillo बहुत अच्छा, धन्यवाद! फिर भी यह पता लगाने की कोशिश की जा रही है कि केवल कुछ परतों पर कैसे लागू किया जाए, मुझे आशा है कि मैं इसे बनाऊंगा। एक महान जवाब के लिए धन्यवाद!
मोफयोदा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.