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

Alessandro Pasotti apasotti at gmail.com
Tue Jan 16 00:10:17 PST 2018


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

> Here is a test script that illustrate the problem a bit further: if we run
> createProvider() twice, the first time
> the getCapbabilities will fail with a timeout. The second time, it will
> succeed.
>
> If you run this script, clear the Qgis network cache between two
> invocations.
>
> ===================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?" )
>
> # GetCapabilities Fail with Request Timeout !!!
> provider = QgsProviderRegistry.instance().createProvider( "wms", wmsuri )
>
> # Run again => works !!!
> provider = QgsProviderRegistry.instance().createProvider( "wms", wmsuri )
>
> qgis_application.exitQgis()
> del qgis_application
> ====================8<=============================
>
> We have also tested simple QgsNetwork invocation from c++: tests shows
> that event loops have the running status, but the
> request is not processed at the  first invocation.
>
> David
>
>
> Le 15 janv. 2018 à 15:05, David Marteau <dmarteau at 3liz.com> a écrit :
>
>
>
>
> Hi David,
>
> You  need an event loop to use a Q(qg)NetworkAccessManager, it's
> asynchronous.
>
>
> Hi Alessandro,
>
> Yes, we know that (see the second code in previous mail  ):  the
>  QgsNetworkAccessManager works perfeclty in python, this is not the point.
>
> The point is: trying to instanciate  a  wmsprovider will issue a timeout
> when trying to request the capabilities: the code responsible for that
> creates its own QEventLoop and manage to do a blocking call (which is
> expected here).
> Please have a look at https://github.com/qgis/QGIS/blob/master/src/
> providers/wms/qgswmscapabilities.cpp#L1964.  What we do not understand is
> why, despite the call of loop.exec() in the c++ code, the request is not
> processed (my example with the  Q(gs)etworkAccessManager
> shows that it should processed)
>
> Actually you cannot instanciate properly a QgsProject with a WMS layer.
>
> To convince yourself, try to instanciate a QgsProject in python (in a
> standalone python script) from a .qgs project having a single wms layer: it
> will fail to instanciate the layer.
>
>
Hi David,

I verified this issue, I'm sorry but I don't have an explanation right away
and it looks like a bug, please file a ticket.


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


More information about the QGIS-Developer mailing list