एक बदले हुए डेटा स्रोत से Qgis लेयर अपडेट करें


13

जब उनके डेटा स्रोत में बदलाव होता है, तो मैं स्वचालित रूप से अपडेट होने के लिए लेयर्स प्राप्त करने की कोशिश कर रहा हूं। मैं R का उपयोग एक विशेषता के साथ एक आकृति लिखने के लिए कर रहा हूं, और QGIS में उस विशेषता के अनुसार रंग भर रहा हूं।

मैं अलग-अलग विशेषता मानों के साथ एक नया आकार लिखना चाहता हूं, और Qgis मानचित्र रंग अपडेट है। चरण 1 उस प्रक्रिया को चालू कर रहा है, चरण 2 संशोधित आकारफाइल से परत को फिर से लोड कर रहा है। इसका चरण 2 मैं यहां चिंता कर रहा हूं।

अन्य प्रश्न / मेलिंग सूची चट्टर triggerRepaintपरत पर उपयोग का उल्लेख करता है - जो काम नहीं करता है। अन्य सुझावों में शामिल हैं setCacheImage(None)और फिर से काम नहीं करता है। परत अंततः अपडेट करती है, लेकिन मैं वास्तव में तर्क नहीं देख सकता हूं, और कभी-कभी आश्चर्य के बाद ऐसा होता है कि मैंने कुछ भी नहीं किया है। या शायद मैंने दो मिनट पहले कुछ किया था।

इसे अपडेट करने का एक प्रतिलिपि प्रस्तुत करने योग्य तरीका यह है कि लीजेंड मेनू से लेयर को डुप्लिकेट किया जाए - डुप्लिकेट को हमेशा अपना डेटा वर्तमान शेपफाइल से मिलता है, और मूल लेयर स्वयं भी अपडेट होता है! इसलिए इसे करने का कोई तरीका होना चाहिए।

मुझे लगता है कि यह 2.8 में बेहतर काम कर रहा था, लेकिन यह 2.10 है इसलिए शायद कहीं एक नया बग है।

संबंधित, लेकिन मेरे लिए 2.10 में काम नहीं करता है:

यदि QGIS में स्रोत को बदल दिया जाता है तो रास्टर परतों को स्वचालित रूप से पुनः लोड कैसे करें?

अन्य चीजें जो मैंने कोशिश की हैं:

  • layer.dataProvider().dataChanged.emit() - एक बार काम किया है, फिर एक ही परत पर नहीं

मुझे लगता है कि मैंने इस बात पर नज़र रखी है कि परत का काम दोहराता क्यों है - अगर मैं अपडेटेड लेयर के आधार पर एक नई थ्रोअर लेयर बनाता हूं और फिर .triggerRepaint()अपडेटेड लेयर पर कॉल करता हूं , तो यह मैप कैनवास पर अपडेट होती है:

QgsVectorLayer( layer.source(), "layer copy", layer.providerType() )
layer.triggerRepaint()

अगर मैं एक अलग परत स्रोत का उपयोग करता हूं तो यह काम नहीं करता है, इसलिए ऐसा लगता है कि यदि आप एक ही परत स्रोत के आधार पर एक परत वस्तु बनाते हैं ...

एक त्वरित परीक्षण अभी एक रेखापुंज परत (एक GeoTIFF से) के साथ, और सिर्फ कॉल rlayer.triggerRepaint()करने से मज़बूती से मैप कैनवास में रेखापुंज के दृश्य को अद्यतन करने के लिए लगता है।


आपको कुछ नमूना कोड पोस्ट करने की आवश्यकता हो सकती है।
नाथन डब्ल्यू

@NathanW मैं जो कुछ भी कर रहा हूं, वह सबसे ज्यादा है, जो इसे लोड करने वाली परत से है, इसे स्टाइल करते हैं - फिर इसकी सिर्फ लेयर और उन कुछ लाइनों को पायथन कंसोल में। जब तक मुझे पता है कि मैं सिद्धांत काम कर सकता हूं, तब तक मुझे इसे एक प्लगइन के ढांचे में रखने के लिए विघटित किया जाता है! मैं उम्मीद कर रहा था कि वहाँ एक त्वरित उत्तर होगा ("कॉल लेयर ।updateFromNewDataYouFool ()") लेकिन मैं इसे और अधिक कोड (आर कोड सहित शेपफाइल बनाने के लिए) के साथ भर दूंगा।
Spacedman

सुनिश्चित करने के लिए, आपने बाद में दोनों आदेशों का उपयोग करने की कोशिश की: layer.setCacheImage(None)और layer.triggerRepaint()?
मथियास कुह्न

हां @MatthiasKuhn - हालांकि कभी-कभी यह काम करता है, लेकिन अक्सर नहीं। मैंने सिर्फ एक संशोधित आकृति लिखा है, उन दोनों चीजों को पायथन कंसोल (दाईं परत पर), कोई दृश्य अद्यतन नहीं किया। सबसे सरल बात जो अब तक 100% काम कर चुकी है वह मूल परत स्रोत के आधार पर एक नई थ्रो लेयर ऑब्जेक्ट ऑब्जेक्ट बना रही है जैसा कि ऊपर बताया गया है और फिर triggerRepaint()मूल परत पर। v 2.10.1-पीसा
स्पेसमैन

मुझे संदेह है कि यह ओजीआर कनेक्शन पूल की शुरुआत से संबंधित हो सकता है। यदि आप डिस्क पर फ़ाइल को प्रतिस्थापित करते हैं या मौजूदा फ़ाइल को संपादित करते हैं तो क्या कोई अंतर है, क्या आप कुछ परीक्षण कर सकते हैं ?
मथायस कुह्न

जवाबों:


5

यह ओजीआर कनेक्शन पूल की शुरुआत से संबंधित है। [1]

QGIS 2.10 से पहले, एक फाइल को हर एक एक्सेस (जैसे repaint) पर फिर से खोल दिया गया था।

क्यूजीआईएस 2.10 के बाद से फाइल हैंडल को खुला रखा जाता है और इसका मतलब है कि अगर फाइल को हैंडल से बदल दिया जाता है तब भी यूनिक्स सिस्टम पर पुरानी फाइल को इंगित करता है।

QGIS 2.10: वर्कअराउंड

दुर्भाग्य से QGIS 2.10 में फ़ाइल को फिर से खोलने के लिए QGIS को मजबूर करने के लिए कोई API नहीं है। वर्कअराउंड के रूप में आप एक बदसूरत हैक का उपयोग कर सकते हैं:

layer.dataProvider().changeAttributeValues( { -1: { 0: 0 } } )
layer.triggerRepaint()

QGIS 2.12: समाधान

मैंने अभी एक नया तरीका पेश किया है जो कि QGIS 2.12 से शुरू होगा।

layer.dataProvider().forceReload()
layer.triggerRepaint()

सामान्य पहूंच

यदि आपके पास यह नियंत्रित करने की संभावना है कि फ़ाइल को कैसे अधिलेखित किया जा रहा है, तो आप मौजूदा फ़ाइलों को लिखने की अनुमति के साथ खोल सकते हैं और डिस्क पर फ़ाइलों को पूरी तरह से बदलने (हटाने / पुनः बनाने) के बजाय सामग्री को बदल सकते हैं।

[१] कनेक्शन पूल को कुछ डेटा स्रोतों तक पहुंचने में महत्वपूर्ण रूप से तेजी लाने के लिए पेश किया गया था।


सबसे अच्छा समाधान की तरह लग रहा है। .changeAttributeValuesलाता है एक "त्रुटि 1: (-1) सुविधा आईडी के साथ आकार पढ़ने के लिए उपलब्ध सीमा से बाहर का प्रयास करें।" पर यह ठीक है।
21

2

यदि आप पैन करते हैं या अन्यथा मानचित्र को ताज़ा करते हैं तो इसे अपडेट करना चाहिए।

यह लेख कहता है कि आप PyQGIS में निम्नलिखित का उपयोग कर सकते हैं:

myLayer.triggerRepaint()

फ़ंक्शन के बाद सभी परतों को ताज़ा करने के लिए इस्तेमाल किया जा सकता है:

def refresh_layers(self):
    for layer in qgis.utils.iface.mapCanvas().layers():
         layer.triggerRepaint()

जैसा कि मैंने अपने प्रश्न में कहा था, और जैसा कि मैंने दिए गए लिंक में बताया है, triggerRepaint()काम नहीं करता है। refresh()मानचित्र पर कैनवास काम नहीं करता है। None(जो अब एपीआई डॉक्स में पदावनत है) कैश इमेज सेट करना काम नहीं करता है। मैं सिर्फ एक नई संशोधित आकार की परत पर इन सभी चीजों की कोशिश की, नक्शे के बारे में panned, पर और बंद toggled, यह काम नहीं किया। परत को "डुप्लिकेट" करें और यह तुरंत अपडेट हो जाए। क्या आपने खुद इन चीजों को आजमाया है (2.10 पर)?
स्पेसमैन

मुझे लगता है कि हमें इसका जवाब देने के लिए @ nathan-w की आवश्यकता है। मैंने खुद इसकी कोशिश नहीं की है ...
एलेक्स लेथ

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