[QGIS-Developer] Cannot load WMS capabilities from WMS provider in QGIS3 from python

Alessandro Pasotti apasotti at gmail.com
Mon Jan 15 05:48:16 PST 2018


On Mon, Jan 15, 2018 at 12:48 PM, David Marteau <dmarteau at 3liz.com> wrote:

> Hi,
>
> We hit a very nasty problem when trying to load projects with wms layer
> defined from python: loading capabilities fail with timeout error, thus
> preventing creating any project or layer from python.
>
> The problem has been verified in Debian, Ubuntu and fresh OSX build from
> master branch.
>
> We have somehow been able to reduce the problem to the loading of the
> wmsprovider. The following python code provide a minimal example for
> reproducing the problem:
>
> ===================8<==============================
> import os
> import logging
>
> from qgis.core import QgsApplication, QgsMessageLog
> from qgis.core import QgsProject, QgsProviderRegistry
>
> logger = logging.getLogger()
> logger.setLevel(logging.DEBUG)
>
> # No Display
> os.environ['QT_QPA_PLATFORM'] = 'offscreen'
>
> qgis_application = QgsApplication([], False )
> qgis_application.setPrefixPath('/usr/local', True)
> qgis_application.initQgis()
>
> # Log any messages
> def writelogmessage(message, tag, level):
>     arg = '{}: {}'.format( tag, message )
>     if level == QgsMessageLog.WARNING:
>         logger.warning(arg)
>     elif level == QgsMessageLog.CRITICAL:
>         logger.error(arg)
>     else:
>         logger.info(arg)
>
> messageLog = QgsApplication.messageLog()
> messageLog.messageReceived.connect( writelogmessage )
>
>
> wmsuri = ("contextualWMSLegend=0&crs=EPSG:4326&dpiMode=7&
> featureCount=10&format=image/jpeg"
>           "&layers=s2cloudless&styles&tileMatrixSet=s2cloudless-
> wmsc-14"
>           "&url=http://tiles.maps.eox.at/wms?" )
>
> # Request Timeout
> provider = QgsProviderRegistry.instance().createProvider( "wms", wmsuri )
>
> qgis_application.exitQgis()
> del qgis_application
> ====================8<=============================
>
> This fail with the following qgis errors
>
> WMS: Download of capabilities failed: Operation canceled
> Network: Network request https://tiles.maps.eox.at/wms?SERVICE=WMS&
> REQUEST=GetCapabilities timed out
>
> Note that the following piece of code work perfectly and proceed the
> request without problems:
>
> ==============================================================
> from PyQt5.QtCore import QUrl, QEventLoop
> from PyQt5.QtNetwork import QNetworkRequest
>
> url = QUrl("https://tiles.maps.eox.at/wms?SERVICE=WMS&REQUEST=
> GetCapabilities")
>
> request = QNetworkRequest()
> request.setUrl(url)
> manager = QgsNetworkAccessManager.instance()
> replyObject = manager.get(request)
>
> loop = QEventLoop()
> def onfinish(  ):
>     print("Qt Return Code:",replyObject.attribute(QNetworkRequest.
> HttpStatusCodeAttribute))
>     answer = replyObject.readAll();
>     print(answer[:200],"\n")
>     loop.quit()
>
> replyObject.finished.connect( onfinish )
> loop.exec()
> ==============================================================
>
> So this is not fundamentally a problem with the network manager.
>
> At this point we are stuck because the provider do not do something
> fundamentally different from the last piece of code,
>
> In qgis code the request execution stall at: https://github.com/qgis/
> QGIS/blob/master/src/providers/wms/qgswmscapabilities.cpp#L1964
>
> The problem does not occur if we run the project from the Desktop
> application: we think that there is a problem with the QEventLoop execution
> but we have no clue atm to check this assumption.
>
> So if anybody have any idea on the subject…...
>


Hi David,

You  need an event loop to use a Q(qg)NetworkAccessManager, it's
asynchronous.



-- 
Alessandro Pasotti
w3:   www.itopen.it
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/qgis-developer/attachments/20180115/43846092/attachment-0001.html>


More information about the QGIS-Developer mailing list