Created
April 24, 2019 15:50
-
-
Save d3netxer/ef14041c5d444717880127637adf103f to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#from qgis.core import QgsProject,QgsPrintLayout | |
#https://data.library.virginia.edu/how-to-create-and-export-print-layouts-in-python-for-qgis-3/ | |
import yaml | |
#envision that this script will use an input yaml file, something like below: | |
# | |
# - map1: | |
# data_dir: | |
# source_text: | | |
# source text line 1 | |
# source text line 2 | |
# extent: -12.50, 7.70, -11.30, 9.30 | |
# basemap: basemap | |
# legend: ??? | |
# legend_placement: [246, 200] | |
# layers: | |
# - layer1: layer1.qml | |
# - layer2: layer2.qml | |
# submap: yes | |
# submap_extent: [-12.50, 7.70, -11.30, 9.30] | |
# submap_basemap: basemap | |
# submap_layers: | |
# - layer1: layer1.qml | |
# - layer2: layer2.qml | |
# | |
project = QgsProject.instance() | |
#get a reference to the layout manager | |
manager = project.layoutManager() | |
#make a new print layout object | |
layout = QgsPrintLayout(project) | |
layoutName = "PrintLayout1" | |
vectorLyr=QgsVectorLayer("insert file path","RoadLayer", "ogr") | |
project.addMapLayer(vectorLyr) | |
layouts_list = manager.printLayouts() | |
for layout in layouts_list: | |
if layout.name() == layoutName: | |
manager.removeLayout(layout) | |
#initializes default settings for blank print layout canvas | |
layout.initializeDefaults() | |
layout.setName(layoutName) | |
#add layout to manager | |
manager.addLayout(layout) | |
map = QgsLayoutItemMap(layout) | |
# Map | |
# Defaults of `A4` (210 x 297 mm), `Landscape`, & `LayoutMillimeters` are | |
# due to `layout.initializeDefaults()` | |
map.setRect(250, 250, 250, 250) | |
#Set Map Extent | |
#defines map extent using map coordinates | |
#QgsRectangle(xMin: float, yMin: float = 0, xMax: float = 0, yMax: float = 0) | |
rectangle = QgsRectangle(-12.50, 7.70, -11.30, 9.30) | |
map.setExtent(rectangle) | |
#map.setExtent(iface.mapCanvas().extent()) | |
#add the map to the layout | |
layout.addLayoutItem(map) | |
#Move & Resize map on print layout canvas | |
map.attemptMove(QgsLayoutPoint(5, 5, QgsUnitTypes.LayoutMillimeters)) | |
map.attemptResize(QgsLayoutSize(287, 200, QgsUnitTypes.LayoutMillimeters)) | |
minimap = QgsLayoutItemMap(layout) | |
minimap.setRect(250, 250, 250, 250) | |
rectangle = QgsRectangle(-13.50, 6.70, -9.90, 10.30) | |
minimap.setExtent(rectangle) | |
layout.addLayoutItem(minimap) | |
minimap.attemptMove(QgsLayoutPoint(212, 5, QgsUnitTypes.LayoutMillimeters)) | |
minimap.attemptResize(QgsLayoutSize(80, 60, QgsUnitTypes.LayoutMillimeters)) | |
#Checks layer tree objects and stores them in a list. This includes csv tables | |
checked_layers = [layer.name() for layer in QgsProject().instance().layerTreeRoot().children() if layer.isVisible()] | |
print(f"Adding {checked_layers} to legend." ) | |
#get map layer objects of checked layers by matching their names and store those in a list | |
layersToAdd = [layer for layer in QgsProject().instance().mapLayers().values() if layer.name() in checked_layers] | |
legend = QgsLayoutItemLegend(layout) | |
legend.setTitle("Legend") | |
root = QgsLayerTree() | |
for layer in layersToAdd: | |
#add layer objects to the layer tree | |
root.addLayer(layer) | |
legend.model().setRootGroup(root) | |
layout.addLayoutItem(legend) | |
legend.attemptMove(QgsLayoutPoint(246, 200, QgsUnitTypes.LayoutMillimeters)) | |
"""This adds labels to the map""" | |
title = QgsLayoutItemLabel(layout) | |
title.setText("Title Here") | |
title.setFont(QFont("Arial", 28)) | |
title.adjustSizeToText() | |
layout.addLayoutItem(title) | |
title.attemptMove(QgsLayoutPoint(10, 4, QgsUnitTypes.LayoutMillimeters)) | |
subtitle = QgsLayoutItemLabel(layout) | |
subtitle.setText("Subtitle Here") | |
subtitle.setFont(QFont("Arial", 17)) | |
subtitle.adjustSizeToText() | |
layout.addLayoutItem(subtitle) | |
subtitle.attemptMove(QgsLayoutPoint(11, 20, QgsUnitTypes.LayoutMillimeters)) #allows moving text box |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment