Korzystam z następującego kodu w pyqgis, aby wyłapać błędy / ostrzeżenia z warstwy WMS, aby wywołać odmalowanie natychmiast po wykryciu błędu / ostrzeżenia (na podstawie poprzedniego pytania: Jak złapać komunikat o błędzie WMS z panelu komunikatów dziennika w QGIS z pythonem? )
Ale najwyraźniej dostawca „WMS” wydaje się mieć ograniczenie nie wysyłania więcej niż 100 żądań błędu do dziennika komunikatów, co oznacza, że po 100. błędzie / ostrzeżeniu nie jestem w stanie złapać żadnego sygnału, nawet jeśli warstwa WMS jest nadal nie reaguje poprawnie. Niemniej jednak, jeśli wysyłam własne wiadomości do panelu dziennika, wydaje się, że nie ma żadnych ograniczeń (patrz kod poniżej).
Czy istnieje możliwość wychwycenia błędu / ostrzeżenia bezpośrednio z instancji, która jest tutaj odpowiedzialna (chyba jest to dostawca WMS), zamiast korzystania z panelu dziennika komunikatów? A może po prostu wyczyść / zresetuj panel komunikatów dziennika w trwającym procesie lub usuń ograniczenie?
Używam QGIS 2.18.2 na Windows 10.
Oto kod python:
# coding=utf-8
from qgis.core import *
wmsLayer_name="wms-dtk50_wgs"
url_with_params ='url=http://sg.geodatenzentrum.de/wms_dtk50?&crs=EPSG:25832&featureCount=10&format=image/png&layers=DTK50&styles='
wmsLayer = QgsRasterLayer(url_with_params, wmsLayer_name,'wms')
QgsMapLayerRegistry.instance().addMapLayer(wmsLayer)
def errorCatcher( msg, tag, level ):
if tag == 'WMS' and level != 0: #Warnings or Errors (0: Info, 1:Warning, 2:Error)
print "WMS error detected!"
myWMSLayer = QgsMapLayerRegistry.instance().mapLayersByName("wms-dtk50_wgs")[0]
myWMSLayer.triggerRepaint()
# connect with messageReceived SIGNAL from QgsMessageLog to an errorCatcher custom function
# instantly reacts if error/warning occurs
QgsMessageLog.instance().messageReceived.connect( errorCatcher )
#after 100 times triggering a "wmsLayer.triggerRepaint()",
# I get following warning in log messages panel "WMS":
# "2017-01-17T07:17:52 1 Not logging more than 100 request errors."
#this does not raise any issues and prints all 500 test messages in the log panel:
for i in range(500):
QgsMessageLog.instance().logMessage("Message #{}".format(i),"Test",2)
AKTUALIZACJA: Wysłałem prośbę o funkcję (patrz: https://hub.qgis.org/issues/16168 )