From 21c575a5e33c59ff6149a956804690737b069261 Mon Sep 17 00:00:00 2001 From: Dan Howe Date: Tue, 17 May 2022 12:32:35 +0200 Subject: [PATCH] Add code for map generation --- qgis/export.bat | 5 +++ qgis/export.py | 103 ++++++++++++++++++++++++++++++++++++++++++++++++ qgis/roches.qgz | Bin 0 -> 14515 bytes 3 files changed, 108 insertions(+) create mode 100644 qgis/export.bat create mode 100644 qgis/export.py create mode 100644 qgis/roches.qgz diff --git a/qgis/export.bat b/qgis/export.bat new file mode 100644 index 0000000..2892ec3 --- /dev/null +++ b/qgis/export.bat @@ -0,0 +1,5 @@ +set PYTHON="C:\Program Files\QGIS 3.20.3\bin\python-qgis.bat" + +%PYTHON% export.py + +pause \ No newline at end of file diff --git a/qgis/export.py b/qgis/export.py new file mode 100644 index 0000000..ce2bc10 --- /dev/null +++ b/qgis/export.py @@ -0,0 +1,103 @@ +"""export.py + +Export layouts from QGIS project to pdf or jpg. + +Each exported map will contain a different combination of EP/type, e.g. +0.05/'ZSA' + +D Howe +d.howe@wrl.unsw.edu.au +2022-05-17 +""" +import re +import os +from qgis.core import ( + QgsApplication, + QgsProject, + QgsLayoutExporter, + QgsLayoutItemLabel, +) + +QGZ_PATH = 'roches.qgz' +OUTPUT_DIR = 'maps' +FORMAT = 'jpg' + +# Initialise QGIS +qgs = QgsApplication([], False) + +# Load project +project = QgsProject.instance() +project.read(QGZ_PATH) + + +def unique_attributes(layer): + """Get unique values for year, EP, and profile""" + layer.setSubsetString('') # Remove filter + + # Get all available values for encounter probability and profile type + eps = [] + types = [] + years = [] + for f in layer.getFeatures(): + eps.append(f.attribute('ep')) + types.append(f.attribute('type')) + years.append(f.attribute('year')) + + # Keep unique values + eps = list(set(eps)) + types = list(set(types)) + years = list(set(years)) + + return eps, types, years + + +# Get layers with hazard lines (assuming there is a year in the layer name) +map_layers = project.mapLayers().items() +layers = [v for k, v in map_layers if re.search(r'\d{4}', v.name())] + +# Get all EP values and profile types from first hazard line layer +eps, types, years = unique_attributes(layers[0]) + +# BUG: repeat first file because of QGIS's incorrect legend placement +years = [years[0]] + years + +# Get layouts +layouts = project.layoutManager().layouts() + +# Create outout directory +os.makedirs(OUTPUT_DIR, exist_ok=True) + +for layout in layouts: + name = layout.name() + + # Set up plot settings + if FORMAT == 'pdf': + settings = QgsLayoutExporter.PdfExportSettings() + # settings.dpi = -1 # Native resolution + exporter = QgsLayoutExporter(layout).exportToPdf + elif FORMAT == 'jpg': + settings = QgsLayoutExporter.ImageExportSettings() + exporter = QgsLayoutExporter(layout).exportToImage + else: + raise ValueError("'FORMAT' must be 'jpg' or 'pdf'") + + for t in types: + for e in eps: + for layer in layers: + year = re.search(r'\d{4}', layer.name()).group() + substring = f"ep='{e}' and type='{t}' and year={year}" + layer.setSubsetString(substring) + + # Update label + label = f'Type: {t}\nEP: {e}' + for item in layout.items(): + if isinstance(item, QgsLayoutItemLabel): + item.setText(label) + + map_path = os.path.join(OUTPUT_DIR, f'{name}-{t}-EP={e}.{FORMAT}') + print(f'Exporting {os.path.basename(map_path)}...') + + res = exporter(map_path, settings) + if res != 0: + msg = 'Export failed. Does output folder exist?' + raise ValueError(msg) diff --git a/qgis/roches.qgz b/qgis/roches.qgz new file mode 100644 index 0000000000000000000000000000000000000000..f6ada91e9fc5fcd2fe77fc53093717b76915877b GIT binary patch literal 14515 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 literal 0 HcmV?d00001