Değiştirilmiş bir veri kaynağından Qgis katmanı güncellemesi yapma


13

Veri kaynağı değiştiğinde katmanları otomatik olarak güncellemeye çalışıyorum. Bir özniteliği olan bir şekil dosyası yazmak ve QGIS'deki bu özniteliğe göre renklendirmek için R kullanıyorum.

Farklı öznitelik değerlerine sahip yeni bir şekil dosyası yazmak ve Qgis eşleme renklerinin güncellenmesini istiyorum. Adım 1 bu işlemi tetikliyor, adım 2 katmanı değiştirilmiş şekil dosyasından yeniden yüklüyor. Adım 2 Burada endişeleniyorum.

triggerRepaintKatmanda kullanılan diğer sorular / posta listesi sohbeti - işe yaramaz. Diğer öneriler arasında setCacheImage(None)ve yine işe yaramaz. Katman sonunda güncellenir, ama gerçekten mantığı göremiyorum ve bazen hiçbir şey yapmadıktan sonra sürpriz oluyor. Ya da belki iki dakika önce bir şey yaptım.

Güncellemenin tekrarlanabilir bir yolu, katmanı açıklama menüsünden çoğaltmaktır - kopya her zaman verilerini geçerli şekil dosyasından alır ve orijinal katman da kendisini günceller! Yani bunu yapmanın bir yolu olmalı.

Ben 2.8 daha iyi çalıştığını düşünüyorum, ama bu 2.10 yani belki bir yerde yeni bir hata var.

İlgili, ama 2.10 benim için çalışmıyor:

QGIS'te kaynak değiştirilirse raster katmanları otomatik olarak nasıl yeniden yüklenir?

Denediğim diğer şeyler:

  • layer.dataProvider().dataChanged.emit() - bir kez çalıştı, sonra tekrar aynı katmanda değil

Sanırım katmanı çoğaltmanın neden işe yaradığını izledim - güncellenmiş katmana dayalı yeni bir ayrılabilir katman oluşturup güncellenen katmanı çağırırsam .triggerRepaint(), harita tuvalinde güncellenir:

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

Farklı bir katman kaynağı kullanırsam işe yaramaz, bu nedenle aynı katman kaynağına dayalı bir katman nesnesi oluşturursanız ...

Şu anda raster katmanı (GeoTIFF'den) ile yapılan hızlı bir test ve sadece arama rlayer.triggerRepaint(), harita tuvalindeki raster görünümünü güvenilir bir şekilde güncelliyor gibi görünüyor.


Bazı örnek kodlar göndermeniz gerekebilir.
Nathan W

@NathanW Yaptığım şeylerin çoğu gui - load katmanından, stilden - daha sonra katmanı ve Python konsolundaki birkaç satırı alıyor. Prensibi işe yaratabileceğimi bilinceye kadar bunu bir eklenti çerçevesinde yapıştırmak istemiyorum! Ben hızlı bir cevap ("call layer.updateFromNewDataYouFool ()") olacağını umuyordum ama daha sonra daha fazla kod (shapefiles yapmak için R kodu dahil) ile bu doldurur.
Spacedman

Emin olmak için, her iki komutu daha sonra kullanmayı denediniz: layer.setCacheImage(None)ve layer.triggerRepaint()?
Matthias Kuhn

Evet @MatthiasKuhn - bazen işe yarıyor olsa da , genellikle değil. Sadece değiştirilmiş bir şekil dosyası yazdım, her iki şeyi de Python konsolunda yaptım (sağ katmanda), görsel güncelleme yok. Şimdiye kadar% 100 çalışan en basit şey, yukarıda belirtildiği gibi orijinal katman kaynağına ve daha sonra orijinal katmana dayanan yeni bir atıl katman katmanı nesnesidir triggerRepaint(). v 2.10.1-Pisa
Spacedman

Bunun OGR bağlantı havuzunun tanıtımı ile ilgili olabileceğinden şüphe duyuyorum. Diskteki dosyayı değiştirirseniz veya mevcut dosyayı düzenlerseniz fark olursa bazı testler yapabilir misiniz ?
Matthias Kuhn

Yanıtlar:


5

Bu, OGR bağlantı havuzunun tanıtımı ile ilgilidir. [1]

QGIS 2.10'dan önce, her bir erişimde bir dosya yeniden açıldı (örn. Yeniden boyama).

QGIS 2.10'dan beri dosya tanıtıcısı açık tutulur ve bir dosya değiştirilirse tanıtıcı hala Unix tabanlı sistemlerde eski dosyayı gösterir.

QGIS 2.10: geçici çözüm

Ne yazık ki, QGIS'i dosyayı QGIS 2.10'da yeniden açmaya zorlayacak bir API yok. Geçici bir çözüm olarak çirkin bir hack kullanabilirsiniz:

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

QGIS 2.12: çözüm

Sadece yeni bir yöntem tanıttı QGIS 2.12 edinilebilir başlangıç olacaktır:

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

Genel yaklaşım

Dosyanın üzerine nasıl yazıldığını denetleme olanağınız varsa , varolan dosyaları yazma izinleriyle açabilir ve diskteki dosyaları tamamen değiştirmek (silmek / yeniden oluşturmak) yerine içeriği değiştirebilirsiniz.

[1] Belirli veri kaynaklarına erişimi önemli ölçüde hızlandırmak için bağlantı havuzu kullanıma sunuldu.


En iyi çözüm gibi görünüyor. .changeAttributeValues": Özelliği kimliğine sahip şekil okuma (1) mevcut aralık dışında deneyin HATA 1." Bir getirir ama sorun değil.
Spacedman

2

Haritayı kaydırırsanız veya başka bir şekilde yenilerseniz haritanın güncellenmesi gerekir.

Bu makalede , PyQGIS içinde aşağıdakileri kullanabileceğiniz belirtilmektedir:

myLayer.triggerRepaint()

Tüm katmanları yenilemek için aşağıdaki fonksiyon kullanılabilir:

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

Sorumda söylediğim gibi ve verdiğim bağlantıda belirtildiği gibi triggerRepaint()çalışmıyor. refresh()harita üzerinde tuval çalışmıyor. Önbellek görüntüsünü None(şimdi API dokümanlarında kullanımdan kaldırılmıştır) olarak ayarlamak işe yaramaz. Tüm bunları yeni değiştirilmiş bir şekil dosyası katmanında denedim, haritayı kaydırdım, görüşmeyi açıp kapadım, işe yaramadı. Katmanın "Çoğaltılması" ve anında güncellenir. Bunları kendiniz mi denediniz (2.10'da)?
Spacedman

Sanırım buna cevap vermek için @ nathan-w'ye ihtiyacımız var. Kendim denemedim ...
Alex Leith

IRC üzerinde # qgis üzerinde çalıştım ama belki qgis-dev posta listesine posta göndermem gerekiyor ...
Spacedman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.