Skip to content

Instantly share code, notes, and snippets.

@moosetraveller
Last active March 3, 2022 01:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save moosetraveller/640302ab5d0704fd221633251894b45d to your computer and use it in GitHub Desktop.
Save moosetraveller/640302ab5d0704fd221633251894b45d to your computer and use it in GitHub Desktop.
Convert QGIS Map to TIFF File

Convert QGIS Map to TIFF File

Using QgsMapRendererParallelJob

  1. Iterate over shape files in INPUT_FOLDER
  2. Apply style file
  3. Generate TIFF file using QgsMapRendererParallelJob
import os
from pathlib import Path

from qgis.core import (
    QgsMapSettings,
    QgsCoordinateReferenceSystem,
    QgsMapRendererParallelJob,
    QgsVectorLayer,
)

from qgis.PyQt.QtGui import QColor
from qgis.PyQt.QtCore import QSize


INPUT_FOLDER = r"D:\projects\playground\python\data"
OUTPUT_FOLDER = r"D:\projects\playground\python\results"

STYLE_FILE = r"D:\projects\playground\python\contours.qml"

EPSG_CODE = 2961
CRS = QgsCoordinateReferenceSystem(EPSG_CODE)

BACKGROUND_COLOR = QColor(255, 255, 255)
OUTPUT_SIZE = QSize(2000, 1500)
OUTPUT_DPI = 96


def finished(render, output_file_path):
    image = render.renderedImage()
    image.save(output_file_path)


def process_shapefile(file):
    
    output_file_name = f"{file.stem}.tiff"
    output_file_path = os.path.join(OUTPUT_FOLDER, output_file_name)

    layer = QgsVectorLayer(str(file), output_file_name, "ogr")
    layer.loadNamedStyle(STYLE_FILE)

    settings = QgsMapSettings()
    settings.setLayers([layer])
    settings.setDestinationCrs(CRS)
    settings.setBackgroundColor(BACKGROUND_COLOR)
    settings.setOutputSize(OUTPUT_SIZE)
    settings.setOutputDpi(OUTPUT_DPI)
    # settings.setFlag(QgsMapSettings.Antialiasing, True)
    settings.setExtent(layer.extent())

    render = QgsMapRendererParallelJob(settings)
    
    render.finished.connect(lambda: finished(render, output_file_path))
    render.start()


for file in Path(INPUT_FOLDER).glob("*.shp"):
    process_shapefile(file)

Notes

  • output size and DPI may have to be adjusted depending on the vector layer's extent
  • does not create a world file

Using QgsLayoutExporter

  1. Iterate over shape files in INPUT_FOLDER
  2. Apply style file
  3. Create (temporary) layout
  4. Generate TIFF file with world file using QgsLayoutExporter
import os
from pathlib import Path

from qgis.core import (
    QgsCoordinateReferenceSystem,
    QgsVectorLayer,
    QgsProject,
    QgsPrintLayout,
    QgsLayoutItemMap,
    QgsLayoutSize,
    QgsUnitTypes,
    QgsLayoutExporter,
)

from qgis.PyQt.QtGui import QColor
from qgis.PyQt.QtCore import QSize


INPUT_FOLDER = r"D:\projects\playground\python\data"
OUTPUT_FOLDER = r"D:\projects\playground\python\results"

STYLE_FILE = r"D:\projects\playground\python\contours.qml"

# EPSG_CODE = 2961
# CRS = QgsCoordinateReferenceSystem(EPSG_CODE)

OUTPUT_SIZE = QSize(2000, 1500)
OUTPUT_DPI = 150


def process_shapefile(file):
    
    output_file_name = f"{file.stem}.tiff"
    output_file_path = os.path.join(OUTPUT_FOLDER, output_file_name)
    
    layer = QgsVectorLayer(str(file), output_file_name, "ogr")
    layer.loadNamedStyle(STYLE_FILE)

    project = QgsProject.instance()
    layout = QgsPrintLayout(project)
    layout.initializeDefaults()

    # A4
    # page = layout.pageCollection().page(0)
    # map = QgsLayoutItemMap(layout)
    # map.attemptResize(page.pageSize())
    
    # size 20 cm x 20 cm
    size = QgsLayoutSize(200, 200, QgsUnitTypes.LayoutMillimeters)
    layout.pageCollection().page(0).setPageSize(size)
    map = QgsLayoutItemMap(layout)
    map.attemptResize(size)

    map.setLayers([layer])
    map.zoomToExtent(layer.extent())
    layout.addLayoutItem(map)

    settings = QgsLayoutExporter.ImageExportSettings()
    settings.dpi = OUTPUT_DPI
    settings.imageSize = OUTPUT_SIZE
    settings.generateWorldFile = True

    exporter = QgsLayoutExporter(layout)
    exporter.exportToImage(output_file_path, settings)
    

for file in Path(INPUT_FOLDER).glob("*.shp"):
    process_shapefile(file)

Notes

  • output size and DPI may have to be adjusted depending on the vector layer's extent
  • allows to create a world file
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment