Skip to content

Instantly share code, notes, and snippets.

@d3netxer
Created April 24, 2019 15:50
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 d3netxer/ef14041c5d444717880127637adf103f to your computer and use it in GitHub Desktop.
Save d3netxer/ef14041c5d444717880127637adf103f to your computer and use it in GitHub Desktop.
#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