Short answer

A QGIS Atlas turns one print layout into a series of pages, generating a separate map for every feature in a coverage layer. You design the template once — frame, legend, title, scale bar, north arrow — and QGIS iterates over the coverage features, panning and zooming the controlled map item to each one before exporting. The result is a consistent multi-sheet product (a 1:25,000 geological sheet index, a pipeline alignment book, a flood-zone tile set) produced in a single export pass rather than by hand-cropping dozens of maps.

The two decisions that make or break an atlas are which layer drives the iteration and how the map extent is fitted to each feature. Get those right and page numbering, dynamic titles, and overview maps fall into place.

How the Atlas engine works

The Atlas lives inside the Print Layout window (Project > New Print Layout), in the Atlas panel and the Atlas menu. Three pieces interact:

  • Coverage layer. A vector layer where one feature = one page. For mapping at fixed sheet scales this is usually a grid (see Create grid in Processing) or an existing map-sheet index; for thematic books it may be communes, licence blocks, or basins.
  • Controlled map. A single map item in the layout flagged "Controlled by atlas". On each iteration, QGIS sets that map's extent from the current coverage feature.
  • Atlas expressions. Variables such as @atlas_feature, @atlas_featurenumber, @atlas_totalfeatures, @atlas_pagename, and @atlas_geometry let labels, filters, and styles react to the current page.

When you press Preview Atlas (the toolbar button or Atlas menu), the layout becomes live: stepping through features re-renders everything bound to atlas variables.

Setting up a regular sheet grid

For systematic mapping you want even, overlapping tiles rather than ragged feature extents. Generate the grid first:

  1. Processing Toolbox > Create grid. Choose Rectangle (polygon), set the grid CRS to a projected system matching your data (for France, EPSG:2154 RGF93 / Lambert-93; for a UTM area, the local zone such as EPSG:32631). Set horizontal/vertical spacing to the ground size of one sheet — e.g. 5000 m × 5000 m for a 1:25,000 A3 sheet at roughly 20 cm map width.
  2. Set the grid extent to your project area (slightly larger so edge tiles are full).
  3. Add a sheet-name field. Open the field calculator and build a label, for example 'S' || lpad(to_string(@row_number), 3, '0'), or compose row/column codes from the grid geometry centroid.

A grid in a metric projected CRS gives constant page coverage; a grid built in EPSG:4326 will distort because degrees are not metres.

Fitting the map extent to each page

In the Atlas panel, Controlled by atlas must be enabled on the map item (Item Properties of the map). Then choose how the extent is computed:

  • Margin around feature — fits the feature plus a percentage buffer. Good for irregular coverage features (basins, parcels) where you want each to fill the frame. A 10–15% margin keeps geometry off the neatline.
  • Predefined scale (best fit) — snaps to the nearest scale in your Project Properties > Scales list, which keeps the whole series at standard denominators (1:10,000, 1:25,000, 1:50,000).
  • Fixed scale — every page identical, ideal for a regular grid where each tile is the same size.

To drive scale from data, enable the data-defined override on the map's Scale property (the little override icon) with an expression like attribute(@atlas_feature, 'map_scale'). This lets a single book mix overview pages at 1:100,000 with detail insets at 1:5,000, controlled entirely from the coverage attribute table.

Dynamic titles, page numbers, and labels

Labels become expressions once the atlas is live. Useful patterns:

  • Sheet title: [% "sheet_name" %] or [% @atlas_pagename %].
  • Page numbering: [% 'Sheet ' || @atlas_featurenumber || ' of ' || @atlas_totalfeatures %].
  • Subtitle pulling an attribute: [% attribute(@atlas_feature, 'basin') %].
  • Adjacent-sheet references: store neighbour codes as attributes on the grid, then print them in the margins so field crews can navigate between sheets.

Set the layout's output name expression (Atlas panel) to the same naming logic — e.g. 'geol_' || "sheet_name" — so exported files are self-documenting rather than output_1.pdf.

Overview / key map

Add a second map item, open its Item Properties, expand Overviews, add an overview and set its Map frame to the controlled map. This draws the current page's extent as a rectangle over a small-scale locator. Do not flag the overview map as controlled by atlas — it should stay fixed on the whole project area so readers see where the current sheet sits.

Filtering and sorting pages

The Atlas panel exposes a Filter with expression and a Sort by field. Filtering with "include" = 1 lets you keep an attribute that excludes empty offshore or no-data tiles from the export. Sorting by a sheet code (or by @atlas_geometry's northing via y(centroid($geometry))) makes the page order follow a logical reading sequence rather than feature ID order.

Worked example: a 12-sheet geological map book

  1. Reproject the geology, faults, and DEM hillshade to EPSG:2154.
  2. Create a 4 km × 4 km grid over the licence area; delete tiles with no mapped geology using Select by location against the geology layer, then Filter with in the atlas.
  3. Add fields sheet_name, map_scale (default 25000), and north_sheet/south_sheet neighbour codes.
  4. In a new A3 landscape layout, add the controlled map, legend, scale bar, north arrow, and a title label [% @atlas_pagename %] — 1:[% format_number(item_variables('Map 1')['map_scale'],0) %].
  5. Set the controlled map to Predefined scale (best fit).
  6. Add the overview map fixed on the full grid.
  7. Atlas > Export Atlas as PDF, single combined file, output expression 'geol_book_' || "sheet_name".

The export produces a continuous 12-page PDF where every sheet shares identical cartography and the only thing that changes is the window onto the data.

Common pitfalls and why they happen

  • Blank or half-empty pages. The coverage grid extends past the data. Filter the atlas or clip the grid — the engine has no idea a tile is empty.
  • Labels not updating between pages. The label was typed as plain text, not entered with [% ... %] expression brackets, or the map item is not flagged Controlled by atlas.
  • Inconsistent scales across the book. Margin around feature was used with irregularly sized coverage features. Switch to a predefined-scale list when uniformity matters.
  • Slow or crashing exports. Heavy raster basemaps re-render at full resolution for every page. Pre-build a single overview hillshade, set a sensible export DPI (200–300), and avoid live WMS layers during atlas export.
  • Garbled neatline at sheet edges. The map margin is too small; geometry collides with the frame. Increase the Margin around feature percentage or your sheet overlap.

QA and validation

Before sending a series out, step through the Preview Atlas page by page and check: every page has a title and correct page number; the overview rectangle lands in the right place; legend categories are stable (lock the legend to No auto-update so it does not change per page unless intended); scale bar reads a clean denominator; and exported filenames match the output-name expression. Spot-check two or three sheets against a known control — a benchmark, a road junction, a licence corner coordinate — to confirm the projected grid lines up with reality.

Bathyl perspective

Atlas production is where cartographic discipline pays back: the time goes into one well-built template and a clean coverage layer, then the whole series inherits that quality. For recurring deliverables — annual monitoring sheets, exploration sheet books, hazard tile sets — we treat the coverage grid and the layout template as versioned project assets so the next edition is a re-export, not a rebuild.

Related reading

Sources