Convert QGIS Map to TIFF File
Using QgsMapRendererParallelJob
Iterate over shape files in INPUT_FOLDER
Apply style file
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 )
output size and DPI may have to be adjusted depending on the vector layer's extent
does not create a world file
Iterate over shape files in INPUT_FOLDER
Apply style file
Create (temporary) layout
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 )
output size and DPI may have to be adjusted depending on the vector layer's extent
allows to create a world file