1

In a stand-alone/external PyQGIS app that I'm developing I've noticed that wms/xyz tiles that are returned as jpegs don't render on the map canvas but those that return pngs do.

So for example the Google Maps, layer=m which returns pngs does render fine.

provider='type=xyz&url=http://mt1.google.com/vt/lyrs%3Dm%26x%3D%7Bx%7D%26y%3D%7By%7D%26z%3D%7Bz%7D&zmax=19&zmin=0'

But the Google Satellite, layer=s which returns jpegs doesn't render, nor does the Bing layer which also returns jpegs render.

provider='type=xyz&url=http://mt1.google.com/vt/lyrs%3Ds%26x%3D%7Bx%7D%26y%3D%7By%7D%26z%3D%7Bz%7D&zmax=19&zmin=0'

I've tried adding an image format parameter, format=image/jpeg but it doesn't make any difference.

provider='format=image/jpeg&type=xyz&url=http://mt1.google.com/vt/lyrs%3Ds%26x%3D%7Bx%7D%26y%3D%7By%7D%26z%3D%7Bz%7D&zmax=19&zmin=0'

I used Fiddler on Windows to confirm that there were no network issues with the Google Satellite requests and I can see the jpeg tiles being returned successfully. It's actually how I first noticed that the working layers were returning pngs and the non-working layers were all returning jpegs.

Is there some parameter I haven't set for the raster layer to ensure that jpeg tiles are rendered?

The same wms/xyz tile URI, and without the format parameter works fine in QGIS itself, just not in my stand-alone PyQGIS app.

I'm using QGIS 3.4.

Here is a minimal PyQGIS app demonstrating the issue:

from qgis.core import QgsApplication, QgsProject, QgsRasterLayer
from qgis.gui import QgsMapCanvas, QgsLayerTreeMapCanvasBridge

from PyQt5.QtWidgets import QMainWindow
import os

GOOGLE_MAPS_SOURCE = "type=xyz&url=https://mt1.google.com/vt?lyrs%3Dm%26x%3D%7Bx%7D%26y%3D%7By%7D%26z%3D%7Bz%7D&zmax=19&zmin=0"
GOOGLE_SATELLITE_SOURCE = "type=xyz&url=https://mt1.google.com/vt?lyrs%3Ds%26x%3D%7Bx%7D%26y%3D%7By%7D%26z%3D%7Bz%7D&zmax=19&zmin=0"

class WMSTestApp(QMainWindow):

    def __init__(self):
        super().__init__()

        self.canvas = QgsMapCanvas(self)
        self.bridge = QgsLayerTreeMapCanvasBridge(QgsProject.instance().layerTreeRoot(), self.canvas)

        layer = QgsRasterLayer(GOOGLE_SATELLITE_SOURCE, "Test WMS Layer", "wms")
        print("Raster layer is valid?:", layer.isValid())

        QgsProject.instance().addMapLayer(layer)
        self.canvas.setLayers([layer])

        self.setCentralWidget(self.canvas)


QgsApplication.setPrefixPath(os.environ.get("QGIS_PREFIX_PATH", "C:\Program Files\QGIS 3.4\apps\qgis"), True)
qgs = QgsApplication([], True)
qgs.initQgis()

app = WMSTestApp()
app.show()
qgs.exec_()
qgs.exitQgis()

Fiddler showing the successful transmission of the jpeg tile.

enter image description here

3
  • mmm..your code work perfectly,using jpeg option for example!I can't reproduce the issue
    – Fran Raga
    Commented Apr 18, 2019 at 18:45
  • Are you running the code on Windows? Which version of QGIS are you using? I've found that the code works fine on a Linux machine but it doesn't work on 3 different Windows PCs with QGIS 3.4.
    – SeanMcLeod
    Commented Apr 19, 2019 at 23:15
  • Yes!Windows 10 and qgis 3.4
    – Fran Raga
    Commented Apr 20, 2019 at 7:25

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Browse other questions tagged or ask your own question.