[Python] QGIS Image Rendering is blurry

Discussão em 'Python' iniciado por Stack, Abril 22, 2025.

  1. Stack

    Stack Membro Participativo

    In QGIS 3.22 I want to save an extract of an OpenStreetMap layer I included with https://tile.openstreetmap.org/{z}/{x}/{y}.png. There is only one layer.

    However, the extract of the layer is sharp in OSM and blurry in the exported image.

    I changed various parameters:

    • layer porpoerties: tile resolution
    • resolution of the exported image
    • dpi
    • zoom

    but the qualitiy of the png is always worse than the quality of the same OSM extract in QGIS.

    What am I doing wrong?

    Here is the code:

    def to3857Coords(lat,lon):
    from pyproj import Proj, transform
    P3857 = Proj(init='epsg:3857')
    P4326 = Proj(init='epsg:4326')
    x,y = transform(P4326, P3857, lon, lat)
    return x,y


    def saveImg(xsize, ysize, dotspermeter):
    img = QImage(QSize(xsize, ysize), QImage.Format_ARGB32_Premultiplied)
    img.setDotsPerMeterX(dotspermeter)
    img.setDotsPerMeterY(dotspermeter)

    # create map settings
    ms = QgsMapSettings()

    # create painter
    p = QPainter()
    p.begin(img)
    p.setRenderHint(QPainter.HighQualityAntialiasing)

    # set layers to render
    layers = list(reversed([lyr for lyr in QgsProject.instance().mapLayers().values()]))
    ms.setLayers(layers)
    for lyr in QgsProject.instance().mapLayers().values():
    print(lyr)

    # set extent
    rect = iface.mapCanvas().extent()
    print(rect)
    #rect.scale(1.1)
    ms.setExtent(rect)

    # set ouptut size
    ms.setOutputSize(img.size())

    # setup qgis map renderer
    render = QgsMapRendererCustomPainterJob(ms, p)
    render.start()
    render.waitForFinished()
    p.end()

    # save image
    img.save('/tmp/test_render_'+str(xsize)+'_'+str(ysize)+'_'+str(dotspermeter)+'.png')
    print('Done')


    #wroclaw

    #lat , lon , zoom (1128.5 corresponds to 18) , xsize , ysize , dotspermeter
    conf=[
    [51.11, 17.032222, 1128.5, 1540, 770, 1],
    [51.11, 17.032222, 1128.5, 1540, 770, 10], # dotspermeter increased, no difference(?); I tried many values
    [51.11, 17.032222, 1128.5, 15400, 7700, 1],
    [51.11, 17.032222, 2257, 3080, 1540, 1],
    [51.11, 17.032222, 4514, 6160, 3080, 1],
    [51.11, 17.032222, 1128.5*8, 1540*8, 770*8, 1],
    [51.11, 17.032222, 1128.5, 1550, 775, 1],
    [51.11, 17.032222, 1128.5, 1546, 773, 1],
    ]
    lat , lon , zoom , xsize , ysize , dotspermeter = conf[7]


    canvas = iface.mapCanvas()
    x, y = to3857Coords(lat, lon)
    canvas.setCenter(QgsPointXY(x, y))
    canvas.zoomScale(zoom)
    saveImg(xsize, ysize, dotspermeter

    Continue reading...

Compartilhe esta Página