{
  "mappings": [
    {
      "id": "interface",
      "group": "Getting started",
      "title": "Recognise the QGIS interface",
      "source": {
        "page": 10,
        "anchor": "Opening QGIS",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.085565,
          0.063271,
          0.233493,
          0.079945
        ],
        "printed_page": 10
      },
      "target": {
        "page": 31,
        "anchor": "The QGIS graphical user interface",
        "related_pages": [],
        "figures": [
          {
            "page": 31,
            "label": "Fig. 3.1:",
            "bbox": [
              0.35121,
              0.579362,
              0.406171,
              0.591195
            ],
            "printed_page": 17,
            "caption": "Fig. 3.1: QGIS GUI with Alaska sample data"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.271311,
          0.351456,
          0.283144
        ],
        "printed_page": 17
      },
      "relationship": "equivalent",
      "note": "The same interface concepts; operating-system appearance differs.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "interface",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "toolbars-p10",
      "operation_id": "toolbars",
      "title": "Show or hide toolbars",
      "target": {
        "page": 46,
        "anchor": "3.2 Panels and Toolbars",
        "figures": [],
        "related_pages": [],
        "document": "new",
        "bbox": [
          0.120951,
          0.137862,
          0.399186,
          0.154903
        ],
        "printed_page": 32
      },
      "relationship": "equivalent",
      "note": "Right-click a toolbar or use View / Toolbars to show or hide tools. Operating-system appearance differs.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Getting started",
      "source": {
        "page": 10,
        "anchor": "right click anywhere in the toolbar",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.247406,
          0.207976,
          0.555664,
          0.222227
        ],
        "printed_page": 10
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "load-vector",
      "group": "Lesson 1",
      "title": "Load a shapefile",
      "source": {
        "page": 11,
        "anchor": "Add vector layer",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.150836,
          0.584977,
          0.292974,
          0.599228
        ],
        "printed_page": 11
      },
      "target": {
        "page": 441,
        "anchor": "Loading a layer from a file",
        "related_pages": [
          442,
          443
        ],
        "figures": [
          {
            "page": 442,
            "label": "Fig. 11.4:",
            "bbox": [
              0.382289,
              0.355485,
              0.445601,
              0.367318
            ],
            "printed_page": 428,
            "caption": "Fig. 11.4: Add Vector Layer Dialog"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.714921,
          0.326034,
          0.726755
        ],
        "printed_page": 427
      },
      "relationship": "equivalent",
      "note": "Use Data Source Manager / Add Vector Layer. The course dataset is not supplied by the official guide.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "load-vector",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "label-buffer",
      "group": "Lesson 1",
      "title": "Add a buffer around labels",
      "source": {
        "page": 12,
        "anchor": "buffer around the text",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.413291,
          0.172808,
          0.585992,
          0.185919
        ],
        "printed_page": 12
      },
      "target": {
        "page": 417,
        "anchor": "Buffer tab",
        "related_pages": [],
        "figures": [
          {
            "page": 417,
            "label": "Fig. 10.28:",
            "bbox": [
              0.376189,
              0.558872,
              0.44787,
              0.570706
            ],
            "printed_page": 403,
            "caption": "Fig. 10.28: Label settings - Buffer tab"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.155653,
          0.198322,
          0.167487
        ],
        "printed_page": 403
      },
      "relationship": "equivalent",
      "note": "A label text buffer is not a geographical buffer around features.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "label-buffer",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "label-case-p12",
      "operation_id": "label-case",
      "title": "Change label capitalization",
      "target": {
        "page": 415,
        "anchor": "Formatting tab",
        "figures": [
          {
            "page": 415,
            "label": "Fig. 10.27:",
            "bbox": [
              0.360247,
              0.794549,
              0.431944,
              0.806383
            ],
            "printed_page": 401,
            "caption": "Fig. 10.27: Label settings - Formatting tab"
          }
        ],
        "related_pages": [
          416
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.087889,
          0.237317,
          0.099723
        ],
        "printed_page": 401
      },
      "relationship": "changed",
      "note": "The current Formatting tab has Type case. Label text capitalization is separate from choosing the field or drawing a text buffer.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 1",
      "source": {
        "page": 12,
        "anchor": "capitalization",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.319865,
          0.142168,
          0.426775,
          0.155279
        ],
        "printed_page": 12
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "labels",
      "group": "Lesson 1",
      "title": "Label districts using a field",
      "source": {
        "page": 12,
        "anchor": "add labels",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.229143,
          0.096137,
          0.308576,
          0.109248
        ],
        "printed_page": 12
      },
      "target": {
        "page": 537,
        "anchor": "Single labels",
        "related_pages": [],
        "figures": [
          {
            "page": 537,
            "label": "Fig. 12.25:",
            "bbox": [
              0.339528,
              0.761899,
              0.411225,
              0.773732
            ],
            "printed_page": 523,
            "caption": "Fig. 12.25: Layer labeling settings - Single labels"
          }
        ],
        "document": "new",
        "bbox": [
          0.192079,
          0.115106,
          0.276128,
          0.12694
        ],
        "printed_page": 523
      },
      "relationship": "equivalent",
      "note": "Choose Single labels and the district-name field. The official example uses different data.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "labels",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "load-vector-p13",
      "group": "Lesson 2",
      "title": "Load a shapefile",
      "source": {
        "page": 13,
        "anchor": "Add vector layer",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.522566,
          0.567195,
          0.729805,
          0.580306
        ],
        "printed_page": 13
      },
      "target": {
        "page": 441,
        "anchor": "Loading a layer from a file",
        "related_pages": [
          442,
          443
        ],
        "figures": [
          {
            "page": 442,
            "label": "Fig. 11.4:",
            "bbox": [
              0.382289,
              0.355485,
              0.445601,
              0.367318
            ],
            "printed_page": 428,
            "caption": "Fig. 11.4: Add Vector Layer Dialog"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.714921,
          0.326034,
          0.726755
        ],
        "printed_page": 427
      },
      "relationship": "equivalent",
      "note": "Use Data Source Manager / Add Vector Layer. The course dataset is not supplied by the official guide.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "load-vector",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "attribute-table-p14",
      "operation_id": "attribute-table",
      "title": "Open an attribute table",
      "target": {
        "page": 594,
        "anchor": "12.2.2 Introducing the attribute table interface",
        "figures": [
          {
            "page": 595,
            "label": "Fig. 12.70:",
            "bbox": [
              0.355619,
              0.54089,
              0.427316,
              0.552724
            ],
            "printed_page": 581,
            "caption": "Fig. 12.70: Attribute Table for regions layer"
          }
        ],
        "related_pages": [
          595,
          596
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.817238,
          0.557944,
          0.831439
        ],
        "printed_page": 580
      },
      "relationship": "equivalent",
      "note": "Activate the intended layer and use Open Attribute Table / F6. This is viewing attributes, not an attribute join.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 2",
      "source": {
        "page": 14,
        "anchor": "Open Attributes Table",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.146004,
          0.293087,
          0.909714,
          0.321482
        ],
        "printed_page": 14
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "edit-values-p14",
      "group": "Lesson 2",
      "title": "Enter anemia values in the new field",
      "source": {
        "page": 14,
        "anchor": "Enter the anemia data",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.146004,
          0.629155,
          0.335535,
          0.643406
        ],
        "printed_page": 14
      },
      "target": {
        "page": 604,
        "anchor": "12.2.4 Editing attribute values",
        "related_pages": [],
        "figures": [],
        "document": "new",
        "bbox": [
          0.120951,
          0.085996,
          0.404507,
          0.100196
        ],
        "printed_page": 590
      },
      "relationship": "equivalent",
      "note": "Edit the new anemia field cell by cell and save edits. The supplied local health values are not validated by the QGIS guide.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "edit-values",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "fields-p14",
      "group": "Lesson 2",
      "title": "Add the anemia attribute field",
      "source": {
        "page": 14,
        "anchor": "new column",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.258063,
          0.385042,
          0.367437,
          0.398153
        ],
        "printed_page": 14
      },
      "target": {
        "page": 556,
        "anchor": "12.1.8 Fields Properties",
        "related_pages": [],
        "figures": [
          {
            "page": 556,
            "label": "Fig. 12.41:",
            "bbox": [
              0.404447,
              0.717621,
              0.476144,
              0.729455
            ],
            "printed_page": 542,
            "caption": "Fig. 12.41: Add Field Dialog"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.343608,
          0.348213,
          0.357808
        ],
        "printed_page": 542
      },
      "relationship": "equivalent",
      "note": "Enable editing and add the field with a type appropriate for the course anemia data; do not reuse the PHI-code field name.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "fields",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "load-vector-p14",
      "group": "Lesson 2",
      "title": "Load a shapefile",
      "source": {
        "page": 14,
        "anchor": "Add vector layer",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.564442,
          0.78114,
          0.704433,
          0.794251
        ],
        "printed_page": 14
      },
      "target": {
        "page": 441,
        "anchor": "Loading a layer from a file",
        "related_pages": [
          442,
          443
        ],
        "figures": [
          {
            "page": 442,
            "label": "Fig. 11.4:",
            "bbox": [
              0.382289,
              0.355485,
              0.445601,
              0.367318
            ],
            "printed_page": 428,
            "caption": "Fig. 11.4: Add Vector Layer Dialog"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.714921,
          0.326034,
          0.726755
        ],
        "printed_page": 427
      },
      "relationship": "equivalent",
      "note": "Use Data Source Manager / Add Vector Layer. The course dataset is not supplied by the official guide.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "load-vector",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "toggle-edit-p14",
      "operation_id": "toggle-edit",
      "title": "Enable editing and save attribute edits",
      "target": {
        "page": 604,
        "anchor": "12.2.4 Editing attribute values",
        "figures": [],
        "related_pages": [
          595,
          605
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.085996,
          0.404507,
          0.100196
        ],
        "printed_page": 590
      },
      "relationship": "equivalent",
      "note": "Toggle editing, change attributes and save the layer edits. Saving a project does not save all pending feature edits.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 2",
      "source": {
        "page": 14,
        "anchor": "Edit",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.275196,
          0.645829,
          0.325609,
          0.66008
        ],
        "printed_page": 14
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "join",
      "group": "Lesson 2",
      "title": "Join the anemia table to districts",
      "source": {
        "page": 15,
        "anchor": "JOIN FIELD",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.767664,
          0.092377,
          0.872259,
          0.105488
        ],
        "printed_page": 15
      },
      "target": {
        "page": 648,
        "anchor": "12.4.1 Joining features",
        "related_pages": [
          649,
          650
        ],
        "figures": [
          {
            "page": 649,
            "label": "Fig. 12.104:",
            "bbox": [
              0.299504,
              0.728339,
              0.379553,
              0.740172
            ],
            "printed_page": 635,
            "caption": "Fig. 12.104: Join an attribute table to an existing vector layer"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.321254,
          0.34028,
          0.335455
        ],
        "printed_page": 634
      },
      "relationship": "equivalent",
      "note": "Attribute-key join, not spatial join. Match field types and values; duplicate join keys return the first fetched match.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "join",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "table",
      "group": "Lesson 2",
      "title": "Load an attribute-only CSV table",
      "source": {
        "page": 15,
        "anchor": "Anemia.csv",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.813536,
          0.274845,
          0.909722,
          0.287956
        ],
        "printed_page": 15
      },
      "target": {
        "page": 447,
        "anchor": "Geometry definition",
        "related_pages": [
          445,
          446
        ],
        "figures": [
          {
            "page": 446,
            "label": "Fig. 11.9:",
            "bbox": [
              0.391703,
              0.446802,
              0.455015,
              0.458635
            ],
            "printed_page": 432,
            "caption": "Fig. 11.9: Delimited Text Dialog"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.453371,
          0.2774,
          0.465205
        ],
        "printed_page": 433
      },
      "relationship": "changed",
      "note": "The old course loads CSV through Add Vector Layer. Delimited Text with No geometry is a documented current method for an attribute-only table. Do not create points from the anemia table.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "table",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "attribute-table-p16",
      "operation_id": "attribute-table",
      "title": "Open an attribute table",
      "target": {
        "page": 594,
        "anchor": "12.2.2 Introducing the attribute table interface",
        "figures": [
          {
            "page": 595,
            "label": "Fig. 12.70:",
            "bbox": [
              0.355619,
              0.54089,
              0.427316,
              0.552724
            ],
            "printed_page": 581,
            "caption": "Fig. 12.70: Attribute Table for regions layer"
          }
        ],
        "related_pages": [
          595,
          596
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.817238,
          0.557944,
          0.831439
        ],
        "printed_page": 580
      },
      "relationship": "equivalent",
      "note": "Activate the intended layer and use Open Attribute Table / F6. This is viewing attributes, not an attribute join.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 2",
      "source": {
        "page": 16,
        "anchor": "Open the attributable table",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.146004,
          0.29847,
          0.384397,
          0.312721
        ],
        "printed_page": 16
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "choropleth",
      "group": "Lesson 2",
      "title": "Classify a choropleth map",
      "source": {
        "page": 16,
        "anchor": "Graduated",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.239212,
          0.866614,
          0.35251,
          0.880866
        ],
        "printed_page": 16
      },
      "target": {
        "page": 518,
        "anchor": "Graduated Renderer",
        "related_pages": [
          519,
          520
        ],
        "figures": [
          {
            "page": 520,
            "label": "Fig. 12.5:",
            "bbox": [
              0.361962,
              0.465745,
              0.425291,
              0.477578
            ],
            "printed_page": 506,
            "caption": "Fig. 12.5: Graduated Symbolizing options"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.353477,
          0.282236,
          0.365311
        ],
        "printed_page": 504
      },
      "relationship": "equivalent",
      "note": "Choose the relevant health field and classification method; preserve the course thresholds rather than the official sample data.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "choropleth",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "join-p16",
      "group": "Lesson 2",
      "title": "Join the anemia table to districts",
      "source": {
        "page": 16,
        "anchor": "join the two tables",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.194504,
          0.26498,
          0.35307,
          0.279231
        ],
        "printed_page": 16
      },
      "target": {
        "page": 648,
        "anchor": "12.4.1 Joining features",
        "related_pages": [
          649,
          650
        ],
        "figures": [
          {
            "page": 649,
            "label": "Fig. 12.104:",
            "bbox": [
              0.299504,
              0.728339,
              0.379553,
              0.740172
            ],
            "printed_page": 635,
            "caption": "Fig. 12.104: Join an attribute table to an existing vector layer"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.321254,
          0.34028,
          0.335455
        ],
        "printed_page": 634
      },
      "relationship": "equivalent",
      "note": "Attribute-key join, not spatial join. Match field types and values; duplicate join keys return the first fetched match.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "join",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "load-vector-p16",
      "group": "Lesson 2",
      "title": "Load a shapefile",
      "source": {
        "page": 16,
        "anchor": "Add vector layer",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.222301,
          0.499019,
          0.376277,
          0.51327
        ],
        "printed_page": 16
      },
      "target": {
        "page": 441,
        "anchor": "Loading a layer from a file",
        "related_pages": [
          442,
          443
        ],
        "figures": [
          {
            "page": 442,
            "label": "Fig. 11.4:",
            "bbox": [
              0.382289,
              0.355485,
              0.445601,
              0.367318
            ],
            "printed_page": 428,
            "caption": "Fig. 11.4: Add Vector Layer Dialog"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.714921,
          0.326034,
          0.726755
        ],
        "printed_page": 427
      },
      "relationship": "equivalent",
      "note": "Use Data Source Manager / Add Vector Layer. The course dataset is not supplied by the official guide.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "load-vector",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "choropleth-p17",
      "group": "Lesson 2",
      "title": "Classify a choropleth map",
      "source": {
        "page": 17,
        "anchor": "You can change the colours",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.315546,
          0.081117,
          0.552751,
          0.095368
        ],
        "printed_page": 17
      },
      "target": {
        "page": 518,
        "anchor": "Graduated Renderer",
        "related_pages": [
          519,
          520
        ],
        "figures": [
          {
            "page": 520,
            "label": "Fig. 12.5:",
            "bbox": [
              0.361962,
              0.465745,
              0.425291,
              0.477578
            ],
            "printed_page": 506,
            "caption": "Fig. 12.5: Graduated Symbolizing options"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.353477,
          0.282236,
          0.365311
        ],
        "printed_page": 504
      },
      "relationship": "equivalent",
      "note": "Choose the relevant health field and classification method; preserve the course thresholds rather than the official sample data.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "choropleth",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "attribute-table-p18",
      "operation_id": "attribute-table",
      "title": "Open an attribute table",
      "target": {
        "page": 594,
        "anchor": "12.2.2 Introducing the attribute table interface",
        "figures": [
          {
            "page": 595,
            "label": "Fig. 12.70:",
            "bbox": [
              0.355619,
              0.54089,
              0.427316,
              0.552724
            ],
            "printed_page": 581,
            "caption": "Fig. 12.70: Attribute Table for regions layer"
          }
        ],
        "related_pages": [
          595,
          596
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.817238,
          0.557944,
          0.831439
        ],
        "printed_page": 580
      },
      "relationship": "equivalent",
      "note": "Activate the intended layer and use Open Attribute Table / F6. This is viewing attributes, not an attribute join.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 3",
      "source": {
        "page": 18,
        "anchor": "open the attributable table",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.623616,
          0.445007,
          0.859694,
          0.459258
        ],
        "printed_page": 18
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "copy-p18",
      "group": "Lesson 3",
      "title": "Copy selected features to a temporary layer",
      "source": {
        "page": 18,
        "anchor": "copy features",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.442078,
          0.528685,
          0.5728,
          0.542936
        ],
        "printed_page": 18
      },
      "target": {
        "page": 197,
        "anchor": "Save your selection into a new file",
        "related_pages": [],
        "figures": [],
        "document": "new",
        "bbox": [
          0.133504,
          0.25382,
          0.369464,
          0.265654
        ],
        "printed_page": 183
      },
      "relationship": "equivalent",
      "note": "Edit / Copy Features and Paste Features as a New Temporary Scratch Layer replaces the old memory-layer wording.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "copy",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "identify-p18",
      "operation_id": "identify",
      "title": "Inspect features with Identify",
      "target": {
        "page": 198,
        "anchor": "8.4.2 Identifying Features",
        "figures": [
          {
            "page": 199,
            "label": "Fig. 8.11:",
            "bbox": [
              0.39192,
              0.748838,
              0.455249,
              0.760671
            ],
            "printed_page": 185,
            "caption": "Fig. 8.11: Identify Results dialog"
          }
        ],
        "related_pages": [
          199,
          200,
          201
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.710315,
          0.364602,
          0.724515
        ],
        "printed_page": 184
      },
      "relationship": "partial",
      "note": "Identify displays feature information. It does not replace selecting the administrative features for copy/export; use the separate selection references to complete the exercise.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 3",
      "source": {
        "page": 18,
        "anchor": "Identify Features",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.374774,
          0.37817,
          0.538192,
          0.392421
        ],
        "printed_page": 18
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "load-vector-p18",
      "group": "Lesson 3",
      "title": "Load a shapefile",
      "source": {
        "page": 18,
        "anchor": "Add vector layer",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.260298,
          0.311332,
          0.434803,
          0.325583
        ],
        "printed_page": 18
      },
      "target": {
        "page": 441,
        "anchor": "Loading a layer from a file",
        "related_pages": [
          442,
          443
        ],
        "figures": [
          {
            "page": 442,
            "label": "Fig. 11.4:",
            "bbox": [
              0.382289,
              0.355485,
              0.445601,
              0.367318
            ],
            "printed_page": 428,
            "caption": "Fig. 11.4: Add Vector Layer Dialog"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.714921,
          0.326034,
          0.726755
        ],
        "printed_page": 427
      },
      "relationship": "equivalent",
      "note": "Use Data Source Manager / Add Vector Layer. The course dataset is not supplied by the official guide.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "load-vector",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "select",
      "group": "Lesson 3",
      "title": "Select the areas needed for a district",
      "source": {
        "page": 18,
        "anchor": "Go over the map",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.146004,
          0.428334,
          0.285014,
          0.442585
        ],
        "printed_page": 18
      },
      "target": {
        "page": 195,
        "anchor": "8.4.1 Selecting features",
        "related_pages": [
          196,
          600,
          601
        ],
        "figures": [],
        "document": "new",
        "bbox": [
          0.120951,
          0.476037,
          0.347772,
          0.490237
        ],
        "printed_page": 181
      },
      "relationship": "changed",
      "note": "The course mentions Identify Features and Ctrl-clicking table rows. Identify is not the same as selection. Use a selection tool or table selection; expression selection is an optional alternative.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "select",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "table-select-p18",
      "operation_id": "table-select",
      "title": "Select features using attribute-table rows",
      "target": {
        "page": 600,
        "anchor": "12.2.3 Interacting with features in an attribute table",
        "figures": [],
        "related_pages": [
          601
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.711078,
          0.606003,
          0.725279
        ],
        "printed_page": 586
      },
      "relationship": "equivalent",
      "note": "Select row headers; Ctrl selects several rows. The administrative codes remain local course data.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 3",
      "source": {
        "page": 18,
        "anchor": "Control",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.425468,
          0.461824,
          0.505073,
          0.476075
        ],
        "printed_page": 18
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "canvas-export-p19",
      "operation_id": "canvas-export",
      "title": "Export the map canvas as an image",
      "target": {
        "page": 160,
        "anchor": "7.1.10 Exporting the map view",
        "figures": [
          {
            "page": 160,
            "label": "Fig. 7.19:",
            "bbox": [
              0.364623,
              0.75379,
              0.427952,
              0.765623
            ],
            "printed_page": 146,
            "caption": "Fig. 7.19: The Save Map as Image dialog"
          }
        ],
        "related_pages": [
          161
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.085996,
          0.409347,
          0.100196
        ],
        "printed_page": 146
      },
      "relationship": "changed",
      "note": "Use Project / Import-Export / Export Map to Image. This exports the canvas, not a vector dataset or a print layout.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 3",
      "source": {
        "page": 19,
        "anchor": "Save as Image",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.481276,
          0.447288,
          0.616227,
          0.461539
        ],
        "printed_page": 19
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "labels-p19",
      "group": "Lesson 3",
      "title": "Label features using DIVISEC",
      "source": {
        "page": 19,
        "anchor": "label your map",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.780256,
          0.146554,
          0.909368,
          0.160805
        ],
        "printed_page": 19
      },
      "target": {
        "page": 537,
        "anchor": "Single labels",
        "related_pages": [],
        "figures": [
          {
            "page": 537,
            "label": "Fig. 12.25:",
            "bbox": [
              0.339528,
              0.761899,
              0.411225,
              0.773732
            ],
            "printed_page": 523,
            "caption": "Fig. 12.25: Layer labeling settings - Single labels"
          }
        ],
        "document": "new",
        "bbox": [
          0.192079,
          0.115106,
          0.276128,
          0.12694
        ],
        "printed_page": 523
      },
      "relationship": "equivalent",
      "note": "Use Single labels with DIVISEC. Keep the course layer and choose the appropriate font. The official guide uses different sample data.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "labels",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "layer-panel-p19",
      "operation_id": "layer-panel",
      "title": "Manage layer visibility and drawing order",
      "target": {
        "page": 181,
        "anchor": "Overview of the context menu of the Layers panel",
        "figures": [],
        "related_pages": [
          180,
          182,
          189
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.616185,
          0.513293,
          0.628019
        ],
        "printed_page": 167
      },
      "relationship": "equivalent",
      "note": "Checked layers are visible; drag a layer higher to draw it above lower layers. This does not change the underlying data.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 3",
      "source": {
        "page": 19,
        "anchor": "Deactivate the DSD layer",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.146004,
          0.063018,
          0.364566,
          0.077269
        ],
        "printed_page": 19
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "save-selected",
      "group": "Lesson 3",
      "title": "Save selected features as a new layer",
      "source": {
        "page": 19,
        "anchor": "Save as",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.481276,
          0.447288,
          0.55154,
          0.461539
        ],
        "printed_page": 19
      },
      "target": {
        "page": 479,
        "anchor": "11.2.2 Creating new layers",
        "related_pages": [
          480,
          481,
          482
        ],
        "figures": [
          {
            "page": 482,
            "label": "Fig. 11.32:",
            "bbox": [
              0.3689,
              0.674763,
              0.440581,
              0.686596
            ],
            "printed_page": 468,
            "caption": "Fig. 11.32: Saving as a new vector layer"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.085996,
          0.373378,
          0.100196
        ],
        "printed_page": 465
      },
      "relationship": "equivalent",
      "note": "Export the Galle temporary layer, or use Save Selected Features As when exporting directly from DSD. Map-image export is a separate operation. Fig. 11.32 illustrates the vector export dialog with a different default format; choose the format required here.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "save-selected",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "zoom-layer-p19",
      "operation_id": "zoom-layer",
      "title": "Zoom to a layer extent",
      "target": {
        "page": 182,
        "anchor": "Zoom to Layer(s)/Group",
        "figures": [],
        "related_pages": [],
        "document": "new",
        "bbox": [
          0.160281,
          0.164038,
          0.318654,
          0.175872
        ],
        "printed_page": 168
      },
      "relationship": "equivalent",
      "note": "Use the layer context-menu Zoom to Layer(s). The official menu table documents the command; no identical course map is expected.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 3",
      "source": {
        "page": 19,
        "anchor": "Zoom to layer",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.566096,
          0.12988,
          0.699295,
          0.144131
        ],
        "printed_page": 19
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "attribute-table-p21",
      "operation_id": "attribute-table",
      "title": "Open an attribute table",
      "target": {
        "page": 594,
        "anchor": "12.2.2 Introducing the attribute table interface",
        "figures": [
          {
            "page": 595,
            "label": "Fig. 12.70:",
            "bbox": [
              0.355619,
              0.54089,
              0.427316,
              0.552724
            ],
            "printed_page": 581,
            "caption": "Fig. 12.70: Attribute Table for regions layer"
          }
        ],
        "related_pages": [
          595,
          596
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.817238,
          0.557944,
          0.831439
        ],
        "printed_page": 580
      },
      "relationship": "equivalent",
      "note": "Activate the intended layer and use Open Attribute Table / F6. This is viewing attributes, not an attribute join.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 3",
      "source": {
        "page": 21,
        "anchor": "Open the attributable table",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.146004,
          0.507,
          0.377773,
          0.521251
        ],
        "printed_page": 21
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "load-vector-p21",
      "group": "Lesson 3",
      "title": "Load a shapefile",
      "source": {
        "page": 21,
        "anchor": "Add vector layer",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.255466,
          0.423346,
          0.415563,
          0.437597
        ],
        "printed_page": 21
      },
      "target": {
        "page": 441,
        "anchor": "Loading a layer from a file",
        "related_pages": [
          442,
          443
        ],
        "figures": [
          {
            "page": 442,
            "label": "Fig. 11.4:",
            "bbox": [
              0.382289,
              0.355485,
              0.445601,
              0.367318
            ],
            "printed_page": 428,
            "caption": "Fig. 11.4: Add Vector Layer Dialog"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.714921,
          0.326034,
          0.726755
        ],
        "printed_page": 427
      },
      "relationship": "equivalent",
      "note": "Use Data Source Manager / Add Vector Layer. The course dataset is not supplied by the official guide.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "load-vector",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "table-select-p21",
      "operation_id": "table-select",
      "title": "Select features using attribute-table rows",
      "target": {
        "page": 600,
        "anchor": "12.2.3 Interacting with features in an attribute table",
        "figures": [],
        "related_pages": [
          601
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.711078,
          0.606003,
          0.725279
        ],
        "printed_page": 586
      },
      "relationship": "equivalent",
      "note": "Select row headers; Ctrl selects several rows. The administrative codes remain local course data.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 3",
      "source": {
        "page": 21,
        "anchor": "Ctrl key",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.328451,
          0.833409,
          0.398755,
          0.84766
        ],
        "printed_page": 21
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "copy",
      "group": "Lesson 3",
      "title": "Copy selected features to a temporary layer",
      "source": {
        "page": 22,
        "anchor": "copy features",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.442078,
          0.35608,
          0.5728,
          0.370332
        ],
        "printed_page": 22
      },
      "target": {
        "page": 197,
        "anchor": "Save your selection into a new file",
        "related_pages": [],
        "figures": [],
        "document": "new",
        "bbox": [
          0.133504,
          0.25382,
          0.369464,
          0.265654
        ],
        "printed_page": 183
      },
      "relationship": "equivalent",
      "note": "Edit / Copy Features and Paste Features as a New Temporary Scratch Layer replaces the old memory-layer wording.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "copy",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "load-vector-p22",
      "group": "Lesson 3",
      "title": "Load a shapefile",
      "source": {
        "page": 22,
        "anchor": "Add vector layer",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.255466,
          0.884851,
          0.415563,
          0.899102
        ],
        "printed_page": 22
      },
      "target": {
        "page": 441,
        "anchor": "Loading a layer from a file",
        "related_pages": [
          442,
          443
        ],
        "figures": [
          {
            "page": 442,
            "label": "Fig. 11.4:",
            "bbox": [
              0.382289,
              0.355485,
              0.445601,
              0.367318
            ],
            "printed_page": 428,
            "caption": "Fig. 11.4: Add Vector Layer Dialog"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.714921,
          0.326034,
          0.726755
        ],
        "printed_page": 427
      },
      "relationship": "equivalent",
      "note": "Use Data Source Manager / Add Vector Layer. The course dataset is not supplied by the official guide.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "load-vector",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "attribute-table-p23",
      "operation_id": "attribute-table",
      "title": "Open an attribute table",
      "target": {
        "page": 594,
        "anchor": "12.2.2 Introducing the attribute table interface",
        "figures": [
          {
            "page": 595,
            "label": "Fig. 12.70:",
            "bbox": [
              0.355619,
              0.54089,
              0.427316,
              0.552724
            ],
            "printed_page": 581,
            "caption": "Fig. 12.70: Attribute Table for regions layer"
          }
        ],
        "related_pages": [
          595,
          596
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.817238,
          0.557944,
          0.831439
        ],
        "printed_page": 580
      },
      "relationship": "equivalent",
      "note": "Activate the intended layer and use Open Attribute Table / F6. This is viewing attributes, not an attribute join.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 3",
      "source": {
        "page": 23,
        "anchor": "open the attributable table",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.359895,
          0.556617,
          0.597262,
          0.570868
        ],
        "printed_page": 23
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "duplicate-p23",
      "operation_id": "duplicate",
      "title": "Duplicate a layer entry",
      "target": {
        "page": 182,
        "anchor": "Duplicate Layer",
        "figures": [],
        "related_pages": [],
        "document": "new",
        "bbox": [
          0.160281,
          0.532779,
          0.264312,
          0.544612
        ],
        "printed_page": 168
      },
      "relationship": "partial",
      "note": "Duplicate Layer creates a second project layer entry. It is not an independent backup of the source data; export a separate dataset before making destructive edits.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 3",
      "source": {
        "page": 23,
        "anchor": "duplicate copy",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.364304,
          0.90409,
          0.490719,
          0.918341
        ],
        "printed_page": 23
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "fields",
      "group": "Lesson 3",
      "title": "Add PHI and PHM code fields",
      "source": {
        "page": 23,
        "anchor": "PHI code",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.206396,
          0.523127,
          0.283041,
          0.537378
        ],
        "printed_page": 23
      },
      "target": {
        "page": 556,
        "anchor": "12.1.8 Fields Properties",
        "related_pages": [],
        "figures": [
          {
            "page": 556,
            "label": "Fig. 12.41:",
            "bbox": [
              0.404447,
              0.717621,
              0.476144,
              0.729455
            ],
            "printed_page": 542,
            "caption": "Fig. 12.41: Add Field Dialog"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.343608,
          0.348213,
          0.357808
        ],
        "printed_page": 542
      },
      "relationship": "equivalent",
      "note": "Create fields in edit mode. Retain the course field types and codes; the source screenshot uses different wording.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "fields",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "labels-p23",
      "group": "Lesson 3",
      "title": "Label features using the GN name or code field",
      "source": {
        "page": 23,
        "anchor": "labeled the GN divisions",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.473908,
          0.439592,
          0.680971,
          0.453843
        ],
        "printed_page": 23
      },
      "target": {
        "page": 537,
        "anchor": "Single labels",
        "related_pages": [],
        "figures": [
          {
            "page": 537,
            "label": "Fig. 12.25:",
            "bbox": [
              0.339528,
              0.761899,
              0.411225,
              0.773732
            ],
            "printed_page": 523,
            "caption": "Fig. 12.25: Layer labeling settings - Single labels"
          }
        ],
        "document": "new",
        "bbox": [
          0.192079,
          0.115106,
          0.276128,
          0.12694
        ],
        "printed_page": 523
      },
      "relationship": "equivalent",
      "note": "Use Single labels with the GN name or code field. Keep the course layer and choose the appropriate font. The official guide uses different sample data.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "labels",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "toggle-edit-p23",
      "operation_id": "toggle-edit",
      "title": "Enable editing and save attribute edits",
      "target": {
        "page": 604,
        "anchor": "12.2.4 Editing attribute values",
        "figures": [],
        "related_pages": [
          595,
          605
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.085996,
          0.404507,
          0.100196
        ],
        "printed_page": 590
      },
      "relationship": "equivalent",
      "note": "Toggle editing, change attributes and save the layer edits. Saving a project does not save all pending feature edits.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 3",
      "source": {
        "page": 23,
        "anchor": "edit",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.856996,
          0.556617,
          0.909301,
          0.570868
        ],
        "printed_page": 23
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "edit-values",
      "group": "Lesson 3",
      "title": "Enter administrative codes in the table",
      "source": {
        "page": 24,
        "anchor": "fill the columns",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.216831,
          0.35608,
          0.350413,
          0.370332
        ],
        "printed_page": 24
      },
      "target": {
        "page": 604,
        "anchor": "12.2.4 Editing attribute values",
        "related_pages": [],
        "figures": [],
        "document": "new",
        "bbox": [
          0.120951,
          0.085996,
          0.404507,
          0.100196
        ],
        "printed_page": 590
      },
      "relationship": "equivalent",
      "note": "Direct cell editing is the relevant operation. The official guide does not validate the Sri Lankan administrative codes.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "edit-values",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "dissolve",
      "group": "Lesson 3",
      "title": "Dissolve GN areas by PHI code",
      "source": {
        "page": 26,
        "anchor": "Dissolve",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.276585,
          0.921476,
          0.346648,
          0.935728
        ],
        "printed_page": 26
      },
      "target": {
        "page": 1408,
        "anchor": "Dissolve",
        "related_pages": [
          1409,
          1410
        ],
        "figures": [
          {
            "page": 1408,
            "label": "Fig. 24.121:",
            "bbox": [
              0.299923,
              0.639422,
              0.379971,
              0.651256
            ],
            "printed_page": 1394,
            "caption": "Fig. 24.121: Dissolving a layer into a single multipart feature"
          },
          {
            "page": 1409,
            "label": "Fig. 24.122:",
            "bbox": [
              0.585847,
              0.449301,
              0.666548,
              0.461134
            ],
            "printed_page": 1395,
            "caption": "Fig. 24.122: Dissolve the polygon layer on a common attribute (2 multipart features)"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.273736,
          0.188582,
          0.28557
        ],
        "printed_page": 1394
      },
      "relationship": "equivalent",
      "note": "Dissolve by the PHI code field. Dissolving all features without that field would change the exercise result.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "dissolve",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "label-buffer-p27",
      "group": "Lesson 3",
      "title": "Add a buffer around labels",
      "source": {
        "page": 27,
        "anchor": "buffer around your text",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.36823,
          0.09639,
          0.573747,
          0.110641
        ],
        "printed_page": 27
      },
      "target": {
        "page": 417,
        "anchor": "Buffer tab",
        "related_pages": [],
        "figures": [
          {
            "page": 417,
            "label": "Fig. 10.28:",
            "bbox": [
              0.376189,
              0.558872,
              0.44787,
              0.570706
            ],
            "printed_page": 403,
            "caption": "Fig. 10.28: Label settings - Buffer tab"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.155653,
          0.198322,
          0.167487
        ],
        "printed_page": 403
      },
      "relationship": "equivalent",
      "note": "A label text buffer is not a geographical buffer around features.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "label-buffer",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "labels-p27",
      "group": "Lesson 3",
      "title": "Label features using PHI area",
      "source": {
        "page": 27,
        "anchor": "label with PHI area field",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.597946,
          0.079692,
          0.810818,
          0.093943
        ],
        "printed_page": 27
      },
      "target": {
        "page": 537,
        "anchor": "Single labels",
        "related_pages": [],
        "figures": [
          {
            "page": 537,
            "label": "Fig. 12.25:",
            "bbox": [
              0.339528,
              0.761899,
              0.411225,
              0.773732
            ],
            "printed_page": 523,
            "caption": "Fig. 12.25: Layer labeling settings - Single labels"
          }
        ],
        "document": "new",
        "bbox": [
          0.192079,
          0.115106,
          0.276128,
          0.12694
        ],
        "printed_page": 523
      },
      "relationship": "equivalent",
      "note": "Use Single labels with PHI area. Keep the course layer and choose the appropriate font. The official guide uses different sample data.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "labels",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "csv-points",
      "group": "Lesson 4",
      "title": "Create points from X/Y coordinates",
      "source": {
        "page": 28,
        "anchor": "Creating point datasets",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.17076,
          0.063018,
          0.369593,
          0.077269
        ],
        "printed_page": 28
      },
      "target": {
        "page": 445,
        "anchor": "Importing a delimited text file",
        "related_pages": [
          446,
          447
        ],
        "figures": [
          {
            "page": 446,
            "label": "Fig. 11.9:",
            "bbox": [
              0.391703,
              0.446802,
              0.455015,
              0.458635
            ],
            "printed_page": 432,
            "caption": "Fig. 11.9: Delimited Text Dialog"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.737885,
          0.35164,
          0.749719
        ],
        "printed_page": 431
      },
      "relationship": "equivalent",
      "note": "Configure delimiter, Point coordinates, X/Y fields and the input geometry CRS. Keep the course dataset.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "csv-points",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "load-vector-p28",
      "group": "Lesson 4",
      "title": "Load a shapefile",
      "source": {
        "page": 28,
        "anchor": "add District shape file",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.715885,
          0.502867,
          0.90953,
          0.517118
        ],
        "printed_page": 28
      },
      "target": {
        "page": 441,
        "anchor": "Loading a layer from a file",
        "related_pages": [
          442,
          443
        ],
        "figures": [
          {
            "page": 442,
            "label": "Fig. 11.4:",
            "bbox": [
              0.382289,
              0.355485,
              0.445601,
              0.367318
            ],
            "printed_page": 428,
            "caption": "Fig. 11.4: Add Vector Layer Dialog"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.714921,
          0.326034,
          0.726755
        ],
        "printed_page": 427
      },
      "relationship": "equivalent",
      "note": "Use Data Source Manager / Add Vector Layer. The course dataset is not supplied by the official guide.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "load-vector",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "crs-selector-p29",
      "operation_id": "crs-selector",
      "title": "Choose the input coordinate reference system",
      "target": {
        "page": 131,
        "anchor": "6.4 Coordinate Reference System Selector",
        "figures": [
          {
            "page": 131,
            "label": "Fig. 6.3:",
            "bbox": [
              0.425492,
              0.463832,
              0.480453,
              0.475666
            ],
            "printed_page": 117,
            "caption": "Fig. 6.3: CRS Selector"
          }
        ],
        "related_pages": [
          127,
          128
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.0868,
          0.609409,
          0.10384
        ],
        "printed_page": 117
      },
      "relationship": "equivalent",
      "note": "Choose the CRS describing the existing coordinates. WGS84 longitude/latitude is appropriate only for that input; assigning a CRS is not reprojection.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 4",
      "source": {
        "page": 29,
        "anchor": "Coordinate reference system selector",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.146004,
          0.507032,
          0.436873,
          0.520143
        ],
        "printed_page": 29
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "csv-points-p29",
      "group": "Lesson 4",
      "title": "Create points from X/Y coordinates",
      "source": {
        "page": 29,
        "anchor": "coord text file",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.31016,
          0.461001,
          0.424609,
          0.474112
        ],
        "printed_page": 29
      },
      "target": {
        "page": 445,
        "anchor": "Importing a delimited text file",
        "related_pages": [
          446,
          447
        ],
        "figures": [
          {
            "page": 446,
            "label": "Fig. 11.9:",
            "bbox": [
              0.391703,
              0.446802,
              0.455015,
              0.458635
            ],
            "printed_page": 432,
            "caption": "Fig. 11.9: Delimited Text Dialog"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.737885,
          0.35164,
          0.749719
        ],
        "printed_page": 431
      },
      "relationship": "equivalent",
      "note": "Configure delimiter, Point coordinates, X/Y fields and the input geometry CRS. Keep the course dataset.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "csv-points",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "attribute-table-p30",
      "operation_id": "attribute-table",
      "title": "Open an attribute table",
      "target": {
        "page": 594,
        "anchor": "12.2.2 Introducing the attribute table interface",
        "figures": [
          {
            "page": 595,
            "label": "Fig. 12.70:",
            "bbox": [
              0.355619,
              0.54089,
              0.427316,
              0.552724
            ],
            "printed_page": 581,
            "caption": "Fig. 12.70: Attribute Table for regions layer"
          }
        ],
        "related_pages": [
          595,
          596
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.817238,
          0.557944,
          0.831439
        ],
        "printed_page": 580
      },
      "relationship": "equivalent",
      "note": "Activate the intended layer and use Open Attribute Table / F6. This is viewing attributes, not an attribute join.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 4",
      "source": {
        "page": 30,
        "anchor": "Open Attributes Table",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.20096,
          0.593955,
          0.423639,
          0.608206
        ],
        "printed_page": 30
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "csv-points-p30",
      "group": "Lesson 4",
      "title": "Create points from X/Y coordinates",
      "source": {
        "page": 30,
        "anchor": "Following same steps",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.085565,
          0.44344,
          0.272478,
          0.457691
        ],
        "printed_page": 30
      },
      "target": {
        "page": 445,
        "anchor": "Importing a delimited text file",
        "related_pages": [
          446,
          447
        ],
        "figures": [
          {
            "page": 446,
            "label": "Fig. 11.9:",
            "bbox": [
              0.391703,
              0.446802,
              0.455015,
              0.458635
            ],
            "printed_page": 432,
            "caption": "Fig. 11.9: Delimited Text Dialog"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.737885,
          0.35164,
          0.749719
        ],
        "printed_page": 431
      },
      "relationship": "equivalent",
      "note": "Configure delimiter, Point coordinates, X/Y fields and the input geometry CRS. Keep the course dataset.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "csv-points",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "gps-save-p30",
      "group": "Lesson 4",
      "title": "Save school points as a shapefile",
      "source": {
        "page": 30,
        "anchor": "ESRI shape file",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.085565,
          0.493604,
          0.909264,
          0.524552
        ],
        "printed_page": 30
      },
      "target": {
        "page": 479,
        "anchor": "11.2.2 Creating new layers",
        "related_pages": [
          480,
          481,
          482
        ],
        "figures": [
          {
            "page": 482,
            "label": "Fig. 11.32:",
            "bbox": [
              0.3689,
              0.674763,
              0.440581,
              0.686596
            ],
            "printed_page": 468,
            "caption": "Fig. 11.32: Saving as a new vector layer"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.085996,
          0.373378,
          0.100196
        ],
        "printed_page": 465
      },
      "relationship": "equivalent",
      "note": "Export the School_Health point layer to ESRI Shapefile with the correct CRS. Saving the project is a separate action.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "gps-save",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "load-vector-p30",
      "group": "Lesson 4",
      "title": "Load a shapefile",
      "source": {
        "page": 30,
        "anchor": "Add vector layer",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.260298,
          0.805192,
          0.434803,
          0.819443
        ],
        "printed_page": 30
      },
      "target": {
        "page": 441,
        "anchor": "Loading a layer from a file",
        "related_pages": [
          442,
          443
        ],
        "figures": [
          {
            "page": 442,
            "label": "Fig. 11.4:",
            "bbox": [
              0.382289,
              0.355485,
              0.445601,
              0.367318
            ],
            "printed_page": 428,
            "caption": "Fig. 11.4: Add Vector Layer Dialog"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.714921,
          0.326034,
          0.726755
        ],
        "printed_page": 427
      },
      "relationship": "equivalent",
      "note": "Use Data Source Manager / Add Vector Layer. The course dataset is not supplied by the official guide.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "load-vector",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "project-save-p30",
      "operation_id": "project-save",
      "title": "Save the QGIS project",
      "target": {
        "page": 27,
        "anchor": "2.1 Introducing QGIS projects",
        "figures": [],
        "related_pages": [
          28,
          29
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.274245,
          0.463436,
          0.291285
        ],
        "printed_page": 13
      },
      "relationship": "equivalent",
      "note": "Project Save / Save As stores the session. Exporting a layer and saving pending edits are separate operations.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 4",
      "source": {
        "page": 30,
        "anchor": "save your work",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.33632,
          0.560465,
          0.472901,
          0.574716
        ],
        "printed_page": 30
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "remove-layer-p30",
      "operation_id": "remove-layer",
      "title": "Remove a layer from the project",
      "target": {
        "page": 180,
        "anchor": "Remove Layer/Group",
        "figures": [],
        "related_pages": [
          182
        ],
        "document": "new",
        "bbox": [
          0.192079,
          0.349993,
          0.292197,
          0.358277
        ],
        "printed_page": 166
      },
      "relationship": "equivalent",
      "note": "Remove the layer entry from the project, rather than deleting the dataset on disk.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 4",
      "source": {
        "page": 30,
        "anchor": "Remove",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.722948,
          0.44344,
          0.78834,
          0.457691
        ],
        "printed_page": 30
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "single-symbol-p30",
      "operation_id": "single-symbol",
      "title": "Open layer symbology properties",
      "target": {
        "page": 514,
        "anchor": "12.1.3 Symbology Properties",
        "related_pages": [
          518,
          519,
          520
        ],
        "figures": [],
        "document": "new",
        "bbox": [
          0.120951,
          0.158104,
          0.396755,
          0.172304
        ],
        "printed_page": 500
      },
      "relationship": "changed",
      "note": "The old Style tab is now Symbology. The following page chooses Graduated, not Single symbol; use the separate graduated-symbol link there.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 4",
      "source": {
        "page": 30,
        "anchor": "Style tab",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.255721,
          0.888841,
          0.333223,
          0.903092
        ],
        "printed_page": 30
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "point-graduated",
      "group": "Lesson 4",
      "title": "Show prevalence using graduated point symbols",
      "source": {
        "page": 31,
        "anchor": "quantities",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.822831,
          0.079692,
          0.9091,
          0.093943
        ],
        "printed_page": 31
      },
      "target": {
        "page": 518,
        "anchor": "Graduated Renderer",
        "related_pages": [
          519,
          520
        ],
        "figures": [
          {
            "page": 520,
            "label": "Fig. 12.5:",
            "bbox": [
              0.361962,
              0.465745,
              0.425291,
              0.477578
            ],
            "printed_page": 506,
            "caption": "Fig. 12.5: Graduated Symbolizing options"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.353477,
          0.282236,
          0.365311
        ],
        "printed_page": 504
      },
      "relationship": "equivalent",
      "note": "The renderer can graduate color or size. Fig. 12.5 is a line-layer example, not a screenshot of the school-point exercise.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "point-graduated",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "project-save-p31",
      "operation_id": "project-save",
      "title": "Save the QGIS project",
      "target": {
        "page": 27,
        "anchor": "2.1 Introducing QGIS projects",
        "figures": [],
        "related_pages": [
          28,
          29
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.274245,
          0.463436,
          0.291285
        ],
        "printed_page": 13
      },
      "relationship": "equivalent",
      "note": "Project Save / Save As stores the session. Exporting a layer and saving pending edits are separate operations.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 4",
      "source": {
        "page": 31,
        "anchor": "save your work",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.321427,
          0.927921,
          0.443285,
          0.941032
        ],
        "printed_page": 31
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "fields-p32",
      "group": "Lesson 4",
      "title": "Add a province-name field",
      "source": {
        "page": 32,
        "anchor": "adding province names",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.404605,
          0.219409,
          0.587642,
          0.23252
        ],
        "printed_page": 32
      },
      "target": {
        "page": 556,
        "anchor": "12.1.8 Fields Properties",
        "related_pages": [],
        "figures": [
          {
            "page": 556,
            "label": "Fig. 12.41:",
            "bbox": [
              0.404447,
              0.717621,
              0.476144,
              0.729455
            ],
            "printed_page": 542,
            "caption": "Fig. 12.41: Add Field Dialog"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.343608,
          0.348213,
          0.357808
        ],
        "printed_page": 542
      },
      "relationship": "equivalent",
      "note": "Create a text field for province names; the official guide does not supply the course name-to-code assignments.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "fields",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "labels-p32",
      "group": "Lesson 4",
      "title": "Label features using the province-name field",
      "source": {
        "page": 32,
        "anchor": "label the Provinces",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.218055,
          0.203875,
          0.367122,
          0.216986
        ],
        "printed_page": 32
      },
      "target": {
        "page": 537,
        "anchor": "Single labels",
        "related_pages": [],
        "figures": [
          {
            "page": 537,
            "label": "Fig. 12.25:",
            "bbox": [
              0.339528,
              0.761899,
              0.411225,
              0.773732
            ],
            "printed_page": 523,
            "caption": "Fig. 12.25: Layer labeling settings - Single labels"
          }
        ],
        "document": "new",
        "bbox": [
          0.192079,
          0.115106,
          0.276128,
          0.12694
        ],
        "printed_page": 523
      },
      "relationship": "equivalent",
      "note": "Use Single labels with the province-name field. Keep the course layer and choose the appropriate font. The official guide uses different sample data.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "labels",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "load-vector-p32",
      "group": "Lesson 4",
      "title": "Load a shapefile",
      "source": {
        "page": 32,
        "anchor": "Add vector layer",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.245252,
          0.156846,
          0.387003,
          0.169957
        ],
        "printed_page": 32
      },
      "target": {
        "page": 441,
        "anchor": "Loading a layer from a file",
        "related_pages": [
          442,
          443
        ],
        "figures": [
          {
            "page": 442,
            "label": "Fig. 11.4:",
            "bbox": [
              0.382289,
              0.355485,
              0.445601,
              0.367318
            ],
            "printed_page": 428,
            "caption": "Fig. 11.4: Add Vector Layer Dialog"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.714921,
          0.326034,
          0.726755
        ],
        "printed_page": 427
      },
      "relationship": "equivalent",
      "note": "Use Data Source Manager / Add Vector Layer. The course dataset is not supplied by the official guide.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "load-vector",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "spatial-summary",
      "group": "Lesson 4",
      "title": "Aggregate school values by province",
      "source": {
        "page": 32,
        "anchor": "Creating spatial joins",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.194114,
          0.063018,
          0.389464,
          0.077269
        ],
        "printed_page": 32
      },
      "target": {
        "page": 1363,
        "anchor": "Join attributes by location (summary)",
        "related_pages": [
          1364,
          1365,
          1366
        ],
        "figures": [
          {
            "page": 1363,
            "label": "Fig. 24.98:",
            "bbox": [
              0.318633,
              0.713265,
              0.39033,
              0.725099
            ],
            "printed_page": 1349,
            "caption": "Fig. 24.98: Looking for spatial relations between layers"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.087889,
          0.416091,
          0.099723
        ],
        "printed_page": 1349
      },
      "relationship": "equivalent",
      "note": "Use the summary algorithm, choose province polygons as INPUT, school points as JOIN, and the required summaries. The unweighted mean of school prevalences is not necessarily population-weighted prevalence.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "spatial-summary",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "attribute-table-p33",
      "operation_id": "attribute-table",
      "title": "Open an attribute table",
      "target": {
        "page": 594,
        "anchor": "12.2.2 Introducing the attribute table interface",
        "figures": [
          {
            "page": 595,
            "label": "Fig. 12.70:",
            "bbox": [
              0.355619,
              0.54089,
              0.427316,
              0.552724
            ],
            "printed_page": 581,
            "caption": "Fig. 12.70: Attribute Table for regions layer"
          }
        ],
        "related_pages": [
          595,
          596
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.817238,
          0.557944,
          0.831439
        ],
        "printed_page": 580
      },
      "relationship": "equivalent",
      "note": "Activate the intended layer and use Open Attribute Table / F6. This is viewing attributes, not an attribute join.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 4",
      "source": {
        "page": 33,
        "anchor": "Open the attribute table",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.085565,
          0.445467,
          0.274121,
          0.458578
        ],
        "printed_page": 33
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "choropleth-p33",
      "group": "Lesson 4",
      "title": "Classify the aggregated province choropleth",
      "source": {
        "page": 33,
        "anchor": "CHOROPLETH MAP",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.351604,
          0.506401,
          0.502963,
          0.520652
        ],
        "printed_page": 33
      },
      "target": {
        "page": 518,
        "anchor": "Graduated Renderer",
        "related_pages": [
          519,
          520
        ],
        "figures": [
          {
            "page": 520,
            "label": "Fig. 12.5:",
            "bbox": [
              0.361962,
              0.465745,
              0.425291,
              0.477578
            ],
            "printed_page": 506,
            "caption": "Fig. 12.5: Graduated Symbolizing options"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.353477,
          0.282236,
          0.365311
        ],
        "printed_page": 504
      },
      "relationship": "equivalent",
      "note": "Use Graduated for the aggregated numeric field and explicitly set the course-recommended breaks if required. The guide does not validate the STH thresholds or mean-prevalence interpretation.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "choropleth",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "layer-panel-p33",
      "operation_id": "layer-panel",
      "title": "Manage layer visibility and drawing order",
      "target": {
        "page": 181,
        "anchor": "Overview of the context menu of the Layers panel",
        "figures": [],
        "related_pages": [
          180,
          182,
          189
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.616185,
          0.513293,
          0.628019
        ],
        "printed_page": 167
      },
      "relationship": "equivalent",
      "note": "Checked layers are visible; drag a layer higher to draw it above lower layers. This does not change the underlying data.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 4",
      "source": {
        "page": 33,
        "anchor": "plot school level prevalence on top",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.281734,
          0.771734,
          0.567421,
          0.784845
        ],
        "printed_page": 33
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "project-save-p33",
      "operation_id": "project-save",
      "title": "Save the QGIS project",
      "target": {
        "page": 27,
        "anchor": "2.1 Introducing QGIS projects",
        "figures": [],
        "related_pages": [
          28,
          29
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.274245,
          0.463436,
          0.291285
        ],
        "printed_page": 13
      },
      "relationship": "equivalent",
      "note": "Project Save / Save As stores the session. Exporting a layer and saving pending edits are separate operations.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 4",
      "source": {
        "page": 33,
        "anchor": "save your document",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.2571,
          0.833014,
          0.420466,
          0.846125
        ],
        "printed_page": 33
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "spatial-summary-p33",
      "group": "Lesson 4",
      "title": "Aggregate school values by province",
      "source": {
        "page": 33,
        "anchor": "Spatial Join",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.22532,
          0.094141,
          0.321427,
          0.107252
        ],
        "printed_page": 33
      },
      "target": {
        "page": 1363,
        "anchor": "Join attributes by location (summary)",
        "related_pages": [
          1364,
          1365,
          1366
        ],
        "figures": [
          {
            "page": 1363,
            "label": "Fig. 24.98:",
            "bbox": [
              0.318633,
              0.713265,
              0.39033,
              0.725099
            ],
            "printed_page": 1349,
            "caption": "Fig. 24.98: Looking for spatial relations between layers"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.087889,
          0.416091,
          0.099723
        ],
        "printed_page": 1349
      },
      "relationship": "equivalent",
      "note": "Use the summary algorithm, choose province polygons as INPUT, school points as JOIN, and the required summaries. The unweighted mean of school prevalences is not necessarily population-weighted prevalence.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "spatial-summary",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "crs-theory-p34",
      "group": "Lesson 5",
      "title": "Understand coordinate reference systems",
      "source": {
        "page": 34,
        "anchor": "Lesson 5: Coordinate System",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.085565,
          0.063271,
          0.393717,
          0.079945
        ],
        "printed_page": 34
      },
      "target": {
        "page": 127,
        "anchor": "6.1 Overview of Projection Support",
        "related_pages": [
          128,
          129,
          130,
          131
        ],
        "figures": [],
        "document": "new",
        "bbox": [
          0.120951,
          0.363885,
          0.523324,
          0.380925
        ],
        "printed_page": 113
      },
      "relationship": "partial",
      "note": "Projection-support concepts provide context for this page. Natural Earth website/download instructions and historical defaults are not updated or validated by this link.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "crs-theory",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "archive-vector-p35",
      "operation_id": "archive-vector",
      "title": "Load a vector layer from a ZIP archive",
      "target": {
        "page": 435,
        "anchor": "You can read supported files from archived folders",
        "figures": [],
        "related_pages": [
          437,
          441,
          442,
          443,
          500
        ],
        "document": "new",
        "bbox": [
          0.162792,
          0.530858,
          0.500424,
          0.542691
        ],
        "printed_page": 421
      },
      "relationship": "equivalent",
      "note": "QGIS supports reading layers in archives; use the Browser or vector loader to choose the supported layer. Natural Earth download-site steps are external. Archive contents and the course ZIP were not supplied for execution.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 5",
      "source": {
        "page": 35,
        "anchor": "This time we add zip file without extracting",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.375719,
          0.718104,
          0.674446,
          0.729362
        ],
        "printed_page": 35
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "load-vector-p35",
      "group": "Lesson 5",
      "title": "Load a shapefile",
      "source": {
        "page": 35,
        "anchor": "Add Vector Layer Button",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.702,
          0.704423,
          0.887147,
          0.715681
        ],
        "printed_page": 35
      },
      "target": {
        "page": 441,
        "anchor": "Loading a layer from a file",
        "related_pages": [
          442,
          443
        ],
        "figures": [
          {
            "page": 442,
            "label": "Fig. 11.4:",
            "bbox": [
              0.382289,
              0.355485,
              0.445601,
              0.367318
            ],
            "printed_page": 428,
            "caption": "Fig. 11.4: Add Vector Layer Dialog"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.714921,
          0.326034,
          0.726755
        ],
        "printed_page": 427
      },
      "relationship": "equivalent",
      "note": "Use Data Source Manager / Add Vector Layer. The course dataset is not supplied by the official guide.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "load-vector",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "layer-crs",
      "group": "Lesson 5",
      "title": "Inspect the layer CRS",
      "source": {
        "page": 36,
        "anchor": "Determine the layer projection",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.085565,
          0.419751,
          0.395671,
          0.435142
        ],
        "printed_page": 36
      },
      "target": {
        "page": 510,
        "anchor": "12.1.1 Information Properties",
        "related_pages": [
          511,
          127,
          128
        ],
        "figures": [],
        "document": "new",
        "bbox": [
          0.120951,
          0.166624,
          0.399024,
          0.180824
        ],
        "printed_page": 496
      },
      "relationship": "changed",
      "note": "The current Information tab reports CRS name and units; Source can assign a CRS. The old Metadata tab wording has changed. Do not confuse assignment with transforming coordinates.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "layer-crs",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "load-vector-p36",
      "group": "Lesson 5",
      "title": "Load a shapefile",
      "source": {
        "page": 36,
        "anchor": "Add Sri Lanka District",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.085565,
          0.804052,
          0.285726,
          0.818303
        ],
        "printed_page": 36
      },
      "target": {
        "page": 441,
        "anchor": "Loading a layer from a file",
        "related_pages": [
          442,
          443
        ],
        "figures": [
          {
            "page": 442,
            "label": "Fig. 11.4:",
            "bbox": [
              0.382289,
              0.355485,
              0.445601,
              0.367318
            ],
            "printed_page": 428,
            "caption": "Fig. 11.4: Add Vector Layer Dialog"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.714921,
          0.326034,
          0.726755
        ],
        "printed_page": 427
      },
      "relationship": "equivalent",
      "note": "Use Data Source Manager / Add Vector Layer. The course dataset is not supplied by the official guide.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "load-vector",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "zoom-layer-p36",
      "operation_id": "zoom-layer",
      "title": "Zoom to a layer extent",
      "target": {
        "page": 182,
        "anchor": "Zoom to Layer(s)/Group",
        "figures": [],
        "related_pages": [],
        "document": "new",
        "bbox": [
          0.160281,
          0.164038,
          0.318654,
          0.175872
        ],
        "printed_page": 168
      },
      "relationship": "equivalent",
      "note": "Use the layer context-menu Zoom to Layer(s). The official menu table documents the command; no identical course map is expected.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 5",
      "source": {
        "page": 36,
        "anchor": "zoom to that layer extent",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.46167,
          0.804052,
          0.692554,
          0.818303
        ],
        "printed_page": 36
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "crs-info-p37",
      "operation_id": "layer-crs",
      "title": "Inspect the layer CRS and units",
      "target": {
        "page": 510,
        "anchor": "12.1.1 Information Properties",
        "figures": [],
        "related_pages": [
          511,
          127,
          128
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.166624,
          0.399024,
          0.180824
        ],
        "printed_page": 496
      },
      "relationship": "changed",
      "note": "The current Information tab reports CRS name and units; Source can assign a CRS. The old Metadata tab wording has changed. Do not confuse assignment with transforming coordinates.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 5",
      "source": {
        "page": 37,
        "anchor": "Check the Layer Spatial Reference System",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.085565,
          0.735219,
          0.450151,
          0.74947
        ],
        "printed_page": 37
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "layer-panel-p37",
      "operation_id": "layer-panel",
      "title": "Manage layer visibility and drawing order",
      "target": {
        "page": 181,
        "anchor": "Overview of the context menu of the Layers panel",
        "figures": [],
        "related_pages": [
          180,
          182,
          189
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.616185,
          0.513293,
          0.628019
        ],
        "printed_page": 167
      },
      "relationship": "equivalent",
      "note": "Checked layers are visible; drag a layer higher to draw it above lower layers. This does not change the underlying data.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 5",
      "source": {
        "page": 37,
        "anchor": "Rearrange the layers",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.146004,
          0.281369,
          0.324361,
          0.29562
        ],
        "printed_page": 37
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "load-vector-p37",
      "group": "Lesson 5",
      "title": "Load a shapefile",
      "source": {
        "page": 37,
        "anchor": "add District.shp",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.194504,
          0.142136,
          0.338507,
          0.156387
        ],
        "printed_page": 37
      },
      "target": {
        "page": 441,
        "anchor": "Loading a layer from a file",
        "related_pages": [
          442,
          443
        ],
        "figures": [
          {
            "page": 442,
            "label": "Fig. 11.4:",
            "bbox": [
              0.382289,
              0.355485,
              0.445601,
              0.367318
            ],
            "printed_page": 428,
            "caption": "Fig. 11.4: Add Vector Layer Dialog"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.714921,
          0.326034,
          0.726755
        ],
        "printed_page": 427
      },
      "relationship": "equivalent",
      "note": "Use Data Source Manager / Add Vector Layer. The course dataset is not supplied by the official guide.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "load-vector",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "project-crs",
      "group": "Lesson 5",
      "title": "Set the project CRS",
      "source": {
        "page": 37,
        "anchor": "WGS84",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.491608,
          0.063731,
          0.589595,
          0.077982
        ],
        "printed_page": 37
      },
      "target": {
        "page": 129,
        "anchor": "6.3 Project Coordinate Reference Systems",
        "related_pages": [
          130
        ],
        "figures": [
          {
            "page": 129,
            "label": "Fig. 6.2:",
            "bbox": [
              0.386499,
              0.883822,
              0.441443,
              0.895656
            ],
            "printed_page": 115,
            "caption": "Fig. 6.2: Project Properties Dialog"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.161896,
          0.608421,
          0.178937
        ],
        "printed_page": 115
      },
      "relationship": "changed",
      "note": "QGIS 3.44 automatically reprojects layers to a chosen project CRS. The legacy enable checkbox is not the current workflow.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "project-crs",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "zoom-layer-p37",
      "operation_id": "zoom-layer",
      "title": "Zoom to a layer extent",
      "target": {
        "page": 182,
        "anchor": "Zoom to Layer(s)/Group",
        "figures": [],
        "related_pages": [],
        "document": "new",
        "bbox": [
          0.160281,
          0.164038,
          0.318654,
          0.175872
        ],
        "printed_page": 168
      },
      "relationship": "equivalent",
      "note": "Use the layer context-menu Zoom to Layer(s). The official menu table documents the command; no identical course map is expected.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 5",
      "source": {
        "page": 37,
        "anchor": "Zoom to District",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.146004,
          0.20142,
          0.320455,
          0.215671
        ],
        "printed_page": 37
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "assign-crs-p38",
      "group": "Lesson 5",
      "title": "Assign the correct layer CRS",
      "source": {
        "page": 38,
        "anchor": "assign CRS to Kandawala",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.409969,
          0.760871,
          0.621062,
          0.775122
        ],
        "printed_page": 38
      },
      "target": {
        "page": 511,
        "anchor": "Coordinate Reference System",
        "related_pages": [
          127,
          128,
          131
        ],
        "figures": [
          {
            "page": 511,
            "label": "Fig. 12.1:",
            "bbox": [
              0.320893,
              0.516342,
              0.384205,
              0.528175
            ],
            "printed_page": 497,
            "caption": "Fig. 12.1: Source tab in vector Layer Properties dialog"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.643618,
          0.358352,
          0.655452
        ],
        "printed_page": 497
      },
      "relationship": "equivalent",
      "note": "Use Source / Assigned CRS only to identify existing coordinates; assignment does not transform them. Verify the full CRS and units rather than accepting the course metre statement.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "assign-crs",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "disable-otf",
      "group": "Lesson 5",
      "title": "Old exercise: disable on-the-fly reprojection",
      "source": {
        "page": 38,
        "anchor": "Deactivate",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.085565,
          0.063414,
          0.191871,
          0.080088
        ],
        "printed_page": 38
      },
      "target": {
        "page": 130,
        "anchor": "No CRS",
        "related_pages": [
          129
        ],
        "figures": [
          {
            "page": 129,
            "label": "Fig. 6.2:",
            "bbox": [
              0.386499,
              0.883822,
              0.441443,
              0.895656
            ],
            "printed_page": 115,
            "caption": "Fig. 6.2: Project Properties Dialog"
          }
        ],
        "document": "new",
        "bbox": [
          0.18963,
          0.113483,
          0.240759,
          0.125316
        ],
        "printed_page": 116
      },
      "relationship": "partial",
      "note": "No CRS disables projection handling and displays raw coordinates, but also locks units to unknown and the ellipsoid to planimetric. It is not a drop-in replacement for the old checkbox; review the teaching exercise.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "disable-otf",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "layout-p38",
      "group": "Lesson 5",
      "title": "Create a print layout",
      "source": {
        "page": 38,
        "anchor": "Use Print composer",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.085565,
          0.543506,
          0.254077,
          0.557757
        ],
        "printed_page": 38
      },
      "target": {
        "page": 761,
        "anchor": "18.1.1 Sample Session for beginners",
        "related_pages": [
          762,
          763
        ],
        "figures": [
          {
            "page": 762,
            "label": "Fig. 18.1:",
            "bbox": [
              0.378163,
              0.668466,
              0.441492,
              0.6803
            ],
            "printed_page": 748,
            "caption": "Fig. 18.1: The Print Layout Manager"
          },
          {
            "page": 763,
            "label": "Fig. 18.2:",
            "bbox": [
              0.424254,
              0.729955,
              0.487583,
              0.741789
            ],
            "printed_page": 749,
            "caption": "Fig. 18.2: Print Layout"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.498937,
          0.47279,
          0.513137
        ],
        "printed_page": 747
      },
      "relationship": "changed",
      "note": "New Print Layout replaces the old New Print Composer workflow. The basemap setup and Print as Raster settings are separate operations.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "layout",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "legend-p38",
      "group": "Lesson 5",
      "title": "Add and customise a legend",
      "source": {
        "page": 38,
        "anchor": "map legend",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.085565,
          0.560323,
          0.185283,
          0.574574
        ],
        "printed_page": 38
      },
      "target": {
        "page": 796,
        "anchor": "18.2.5 The Legend Item",
        "related_pages": [
          797,
          798,
          799,
          800
        ],
        "figures": [
          {
            "page": 796,
            "label": "Fig. 18.27:",
            "bbox": [
              0.634397,
              0.371853,
              0.711667,
              0.383686
            ],
            "printed_page": 782,
            "caption": "Fig. 18.27: Legend Item Properties Panel"
          },
          {
            "page": 798,
            "label": "Fig. 18.30:",
            "bbox": [
              0.789373,
              0.227733,
              0.866643,
              0.239566
            ],
            "printed_page": 784,
            "caption": "Fig. 18.30: Legend Items group"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.276556,
          0.346245,
          0.290757
        ],
        "printed_page": 782
      },
      "relationship": "equivalent",
      "note": "Add Legend; verify Auto update and layer names rather than assuming the old All button still exists.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "legend",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "load-vector-p38",
      "group": "Lesson 5",
      "title": "Load a shapefile",
      "source": {
        "page": 38,
        "anchor": "Add District.shp",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.085565,
          0.760871,
          0.223045,
          0.775122
        ],
        "printed_page": 38
      },
      "target": {
        "page": 441,
        "anchor": "Loading a layer from a file",
        "related_pages": [
          442,
          443
        ],
        "figures": [
          {
            "page": 442,
            "label": "Fig. 11.4:",
            "bbox": [
              0.382289,
              0.355485,
              0.445601,
              0.367318
            ],
            "printed_page": 428,
            "caption": "Fig. 11.4: Add Vector Layer Dialog"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.714921,
          0.326034,
          0.726755
        ],
        "printed_page": 427
      },
      "relationship": "equivalent",
      "note": "Use Data Source Manager / Add Vector Layer. The course dataset is not supplied by the official guide.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "load-vector",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "north-p38",
      "group": "Lesson 5",
      "title": "Add a north arrow",
      "source": {
        "page": 38,
        "anchor": "North arrow",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.189632,
          0.560323,
          0.297403,
          0.574574
        ],
        "printed_page": 38
      },
      "target": {
        "page": 819,
        "anchor": "The North Arrow Item",
        "related_pages": [
          820
        ],
        "figures": [
          {
            "page": 819,
            "label": "Fig. 18.55:",
            "bbox": [
              0.263053,
              0.859297,
              0.33475,
              0.871131
            ],
            "printed_page": 805,
            "caption": "Fig. 18.55: North arrows available for selection in provided SVG library"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.262503,
          0.291625,
          0.274337
        ],
        "printed_page": 805
      },
      "relationship": "changed",
      "note": "The dedicated Add North Arrow item is a modern counterpart to selecting a north-arrow image.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "north",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "project-new-p38",
      "operation_id": "project-new",
      "title": "Start a new QGIS project",
      "target": {
        "page": 27,
        "anchor": "2.1 Introducing QGIS projects",
        "figures": [],
        "related_pages": [],
        "document": "new",
        "bbox": [
          0.120951,
          0.274245,
          0.463436,
          0.291285
        ],
        "printed_page": 13
      },
      "relationship": "equivalent",
      "note": "Project / New starts a fresh project and offers to save existing project changes.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 5",
      "source": {
        "page": 38,
        "anchor": "Open new project",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.085565,
          0.727381,
          0.237648,
          0.741632
        ],
        "printed_page": 38
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "project-save-p38",
      "operation_id": "project-save",
      "title": "Save the QGIS project",
      "target": {
        "page": 27,
        "anchor": "2.1 Introducing QGIS projects",
        "figures": [],
        "related_pages": [
          28,
          29
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.274245,
          0.463436,
          0.291285
        ],
        "printed_page": 13
      },
      "relationship": "equivalent",
      "note": "Project Save / Save As stores the session. Exporting a layer and saving pending edits are separate operations.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 5",
      "source": {
        "page": 38,
        "anchor": "save your project",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.230884,
          0.610344,
          0.379384,
          0.624595
        ],
        "printed_page": 38
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "scale-p38",
      "group": "Lesson 5",
      "title": "Add a scale bar with correct units",
      "source": {
        "page": 38,
        "anchor": "scale bar",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.525951,
          0.543506,
          0.602074,
          0.557757
        ],
        "printed_page": 38
      },
      "target": {
        "page": 804,
        "anchor": "18.2.6 The Scale Bar Item",
        "related_pages": [
          805,
          806
        ],
        "figures": [
          {
            "page": 804,
            "label": "Fig. 18.35:",
            "bbox": [
              0.513446,
              0.19548,
              0.590716,
              0.207314
            ],
            "printed_page": 790,
            "caption": "Fig. 18.35: Scale Bar Item Properties Panel"
          },
          {
            "page": 804,
            "label": "Fig. 18.36:",
            "bbox": [
              0.802948,
              0.555676,
              0.87904,
              0.567509
            ],
            "printed_page": 790,
            "caption": "Fig. 18.36: Scale Bar Main properties group"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.085996,
          0.366067,
          0.100196
        ],
        "printed_page": 790
      },
      "relationship": "equivalent",
      "note": "Choose the linked map and units. Renaming the unit label alone does not convert distances.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "scale",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "canvas-background-p39",
      "operation_id": "canvas-background",
      "title": "Set the map canvas background colour",
      "target": {
        "page": 100,
        "anchor": "5.3.1 General Properties",
        "figures": [],
        "related_pages": [],
        "document": "new",
        "bbox": [
          0.120951,
          0.16505,
          0.353897,
          0.17925
        ],
        "printed_page": 86
      },
      "relationship": "equivalent",
      "note": "Project Properties / General sets the canvas background colour. This is separate from polygon fills or the layout page background.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 5",
      "source": {
        "page": 39,
        "anchor": "background color",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.363882,
          0.12988,
          0.51512,
          0.144131
        ],
        "printed_page": 39
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "labels-p39",
      "group": "Lesson 5",
      "title": "Label features using the intended name field",
      "source": {
        "page": 39,
        "anchor": "labeling",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.254439,
          0.12988,
          0.322851,
          0.144131
        ],
        "printed_page": 39
      },
      "target": {
        "page": 537,
        "anchor": "Single labels",
        "related_pages": [],
        "figures": [
          {
            "page": 537,
            "label": "Fig. 12.25:",
            "bbox": [
              0.339528,
              0.761899,
              0.411225,
              0.773732
            ],
            "printed_page": 523,
            "caption": "Fig. 12.25: Layer labeling settings - Single labels"
          }
        ],
        "document": "new",
        "bbox": [
          0.192079,
          0.115106,
          0.276128,
          0.12694
        ],
        "printed_page": 523
      },
      "relationship": "equivalent",
      "note": "Use Single labels with the intended name field. Keep the course layer and choose the appropriate font. The official guide uses different sample data.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "labels",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "layer-panel-p39",
      "operation_id": "layer-panel",
      "title": "Manage layer visibility and drawing order",
      "target": {
        "page": 181,
        "anchor": "Overview of the context menu of the Layers panel",
        "figures": [],
        "related_pages": [
          180,
          182,
          189
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.616185,
          0.513293,
          0.628019
        ],
        "printed_page": 167
      },
      "relationship": "equivalent",
      "note": "Checked layers are visible; drag a layer higher to draw it above lower layers. This does not change the underlying data.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 5",
      "source": {
        "page": 39,
        "anchor": "arranged layers",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.751862,
          0.113206,
          0.887276,
          0.127457
        ],
        "printed_page": 39
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "load-vector-p39",
      "group": "Lesson 5",
      "title": "Load a shapefile",
      "source": {
        "page": 39,
        "anchor": "Add other map layers",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.085565,
          0.113206,
          0.271129,
          0.127457
        ],
        "printed_page": 39
      },
      "target": {
        "page": 441,
        "anchor": "Loading a layer from a file",
        "related_pages": [
          442,
          443
        ],
        "figures": [
          {
            "page": 442,
            "label": "Fig. 11.4:",
            "bbox": [
              0.382289,
              0.355485,
              0.445601,
              0.367318
            ],
            "printed_page": 428,
            "caption": "Fig. 11.4: Add Vector Layer Dialog"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.714921,
          0.326034,
          0.726755
        ],
        "printed_page": 427
      },
      "relationship": "equivalent",
      "note": "Use Data Source Manager / Add Vector Layer. The course dataset is not supplied by the official guide.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "load-vector",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "load-vector-p39-2",
      "group": "Lesson 5",
      "title": "Load a shapefile",
      "source": {
        "page": 39,
        "anchor": "Add Sri Lanka District",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.085565,
          0.196717,
          0.273706,
          0.210969
        ],
        "printed_page": 39
      },
      "target": {
        "page": 441,
        "anchor": "Loading a layer from a file",
        "related_pages": [
          442,
          443
        ],
        "figures": [
          {
            "page": 442,
            "label": "Fig. 11.4:",
            "bbox": [
              0.382289,
              0.355485,
              0.445601,
              0.367318
            ],
            "printed_page": 428,
            "caption": "Fig. 11.4: Add Vector Layer Dialog"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.714921,
          0.326034,
          0.726755
        ],
        "printed_page": 427
      },
      "relationship": "equivalent",
      "note": "Use Data Source Manager / Add Vector Layer. The course dataset is not supplied by the official guide.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "load-vector",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "load-vector-p39-3",
      "group": "Lesson 6",
      "title": "Load a shapefile",
      "source": {
        "page": 39,
        "anchor": "Add Kalutara MOH",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.153654,
          0.646827,
          0.314476,
          0.661078
        ],
        "printed_page": 39
      },
      "target": {
        "page": 441,
        "anchor": "Loading a layer from a file",
        "related_pages": [
          442,
          443
        ],
        "figures": [
          {
            "page": 442,
            "label": "Fig. 11.4:",
            "bbox": [
              0.382289,
              0.355485,
              0.445601,
              0.367318
            ],
            "printed_page": 428,
            "caption": "Fig. 11.4: Add Vector Layer Dialog"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.714921,
          0.326034,
          0.726755
        ],
        "printed_page": 427
      },
      "relationship": "equivalent",
      "note": "Use Data Source Manager / Add Vector Layer. The course dataset is not supplied by the official guide.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "load-vector",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "zoom-layer-p39",
      "operation_id": "zoom-layer",
      "title": "Zoom to a layer extent",
      "target": {
        "page": 182,
        "anchor": "Zoom to Layer(s)/Group",
        "figures": [],
        "related_pages": [],
        "document": "new",
        "bbox": [
          0.160281,
          0.164038,
          0.318654,
          0.175872
        ],
        "printed_page": 168
      },
      "relationship": "equivalent",
      "note": "Use the layer context-menu Zoom to Layer(s). The official menu table documents the command; no identical course map is expected.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 5",
      "source": {
        "page": 39,
        "anchor": "zoom to layer",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.593903,
          0.263555,
          0.714278,
          0.277806
        ],
        "printed_page": 39
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "buffer",
      "group": "Lesson 6",
      "title": "Create 100-metre dengue buffers",
      "source": {
        "page": 40,
        "anchor": "Buffers",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.195349,
          0.263555,
          0.25758,
          0.277806
        ],
        "printed_page": 40
      },
      "target": {
        "page": 1385,
        "anchor": "Buffer",
        "related_pages": [
          1386,
          1387,
          1388
        ],
        "figures": [
          {
            "page": 1385,
            "label": "Fig. 24.103:",
            "bbox": [
              0.144428,
              0.61597,
              0.224476,
              0.627804
            ],
            "printed_page": 1371,
            "caption": "Fig. 24.103: Buffer (in yellow) of points, line, polygon with positive buffer, and polygon with negative buffer"
          },
          {
            "page": 1387,
            "label": "Fig. 24.107:",
            "bbox": [
              0.585847,
              0.475718,
              0.664841,
              0.487551
            ],
            "printed_page": 1373,
            "caption": "Fig. 24.107: Standard (three single part features - left), dissolved (1 multipart feature with 2 parts - right)"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.360773,
          0.168314,
          0.372606
        ],
        "printed_page": 1371
      },
      "relationship": "equivalent",
      "note": "Use Buffer with a suitable metric layer CRS and a distance of 100. Do not assume 100 means metres for a degree-based layer.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "buffer",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "load-vector-p40",
      "group": "Lesson 6",
      "title": "Load a shapefile",
      "source": {
        "page": 40,
        "anchor": "Add Dengue layer",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.146004,
          0.09639,
          0.298812,
          0.110641
        ],
        "printed_page": 40
      },
      "target": {
        "page": 441,
        "anchor": "Loading a layer from a file",
        "related_pages": [
          442,
          443
        ],
        "figures": [
          {
            "page": 442,
            "label": "Fig. 11.4:",
            "bbox": [
              0.382289,
              0.355485,
              0.445601,
              0.367318
            ],
            "printed_page": 428,
            "caption": "Fig. 11.4: Add Vector Layer Dialog"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.714921,
          0.326034,
          0.726755
        ],
        "printed_page": 427
      },
      "relationship": "equivalent",
      "note": "Use Data Source Manager / Add Vector Layer. The course dataset is not supplied by the official guide.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "load-vector",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "buffer-p41",
      "group": "Lesson 6",
      "title": "Create 100-metre dengue buffers",
      "source": {
        "page": 41,
        "anchor": "Buffer radius",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.640769,
          0.063018,
          0.75607,
          0.077269
        ],
        "printed_page": 41
      },
      "target": {
        "page": 1385,
        "anchor": "Buffer",
        "related_pages": [
          1386,
          1387,
          1388
        ],
        "figures": [
          {
            "page": 1385,
            "label": "Fig. 24.103:",
            "bbox": [
              0.144428,
              0.61597,
              0.224476,
              0.627804
            ],
            "printed_page": 1371,
            "caption": "Fig. 24.103: Buffer (in yellow) of points, line, polygon with positive buffer, and polygon with negative buffer"
          },
          {
            "page": 1387,
            "label": "Fig. 24.107:",
            "bbox": [
              0.585847,
              0.475718,
              0.664841,
              0.487551
            ],
            "printed_page": 1373,
            "caption": "Fig. 24.107: Standard (three single part features - left), dissolved (1 multipart feature with 2 parts - right)"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.360773,
          0.168314,
          0.372606
        ],
        "printed_page": 1371
      },
      "relationship": "equivalent",
      "note": "Use Buffer with a suitable metric layer CRS and a distance of 100. Do not assume 100 means metres for a degree-based layer.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "buffer",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "dissolve-boundaries",
      "group": "Lesson 6",
      "title": "Remove internal boundaries with Dissolve",
      "source": {
        "page": 41,
        "anchor": "Select dissolve",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.146004,
          0.280229,
          0.271351,
          0.29448
        ],
        "printed_page": 41
      },
      "target": {
        "page": 1408,
        "anchor": "Dissolve",
        "related_pages": [
          1409,
          1410
        ],
        "figures": [
          {
            "page": 1409,
            "label": "Fig. 24.122:",
            "bbox": [
              0.585847,
              0.449301,
              0.666548,
              0.461134
            ],
            "printed_page": 1395,
            "caption": "Fig. 24.122: Dissolve the polygon layer on a common attribute (2 multipart features)"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.273736,
          0.188582,
          0.28557
        ],
        "printed_page": 1394
      },
      "relationship": "equivalent",
      "note": "The course dissolves the Kalutara polygons by DISTRICT_N. This is separate from the Buffer algorithm\u2019s Dissolve result option.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "dissolve-boundaries",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "layer-panel-p41",
      "operation_id": "layer-panel",
      "title": "Manage layer visibility and drawing order",
      "target": {
        "page": 181,
        "anchor": "Overview of the context menu of the Layers panel",
        "figures": [],
        "related_pages": [
          180,
          182,
          189
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.616185,
          0.513293,
          0.628019
        ],
        "printed_page": 167
      },
      "relationship": "equivalent",
      "note": "Checked layers are visible; drag a layer higher to draw it above lower layers. This does not change the underlying data.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 6",
      "source": {
        "page": 41,
        "anchor": "Rearrange the layers",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.146004,
          0.146554,
          0.32277,
          0.160805
        ],
        "printed_page": 41
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "kml",
      "group": "Lesson 6",
      "title": "Export buffers as KML",
      "source": {
        "page": 42,
        "anchor": "Format KML",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.146004,
          0.498592,
          0.2555,
          0.512843
        ],
        "printed_page": 42
      },
      "target": {
        "page": 480,
        "anchor": "Vector specific parameters",
        "related_pages": [
          479,
          481,
          482
        ],
        "figures": [
          {
            "page": 482,
            "label": "Fig. 11.32:",
            "bbox": [
              0.3689,
              0.674763,
              0.440581,
              0.686596
            ],
            "printed_page": 468,
            "caption": "Fig. 11.32: Saving as a new vector layer"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.545603,
          0.33303,
          0.557437
        ],
        "printed_page": 466
      },
      "relationship": "partial",
      "note": "QGIS vector export supports KML; choose the required CRS. Opening and interpreting the file in Google Earth is outside this guide. Fig. 11.32 illustrates the vector export dialog with a different default format; choose the format required here.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "kml",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "layer-panel-p42",
      "operation_id": "layer-panel",
      "title": "Manage layer visibility and drawing order",
      "target": {
        "page": 181,
        "anchor": "Overview of the context menu of the Layers panel",
        "figures": [],
        "related_pages": [
          180,
          182,
          189
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.616185,
          0.513293,
          0.628019
        ],
        "printed_page": 167
      },
      "relationship": "equivalent",
      "note": "Checked layers are visible; drag a layer higher to draw it above lower layers. This does not change the underlying data.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 6",
      "source": {
        "page": 42,
        "anchor": "Rearrange the layers",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.146004,
          0.063018,
          0.323173,
          0.077269
        ],
        "printed_page": 42
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "kml-screenshot-p43",
      "group": "Lesson 6",
      "title": "Export dengue buffers to KML",
      "source": {
        "page": 43,
        "anchor": "KML export dialog (continuation from page 42)",
        "kind": "screenshot",
        "document": "old",
        "bbox": [
          0.303,
          0.061,
          0.688,
          0.36
        ],
        "printed_page": 43
      },
      "target": {
        "page": 480,
        "anchor": "Vector specific parameters",
        "related_pages": [
          479,
          481,
          482
        ],
        "figures": [
          {
            "page": 482,
            "label": "Fig. 11.32:",
            "bbox": [
              0.3689,
              0.674763,
              0.440581,
              0.686596
            ],
            "printed_page": 468,
            "caption": "Fig. 11.32: Saving as a new vector layer"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.545603,
          0.33303,
          0.557437
        ],
        "printed_page": 466
      },
      "relationship": "partial",
      "note": "This is the QGIS vector-to-KML export dialog continuing from the preceding page. Google Earth actions elsewhere on this page are outside the QGIS reference. Choose KML and the appropriate output CRS.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "kml",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "gpx",
      "group": "Lesson 7",
      "title": "Load dental-clinic GPX waypoints",
      "source": {
        "page": 44,
        "anchor": "Waypoints",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.398289,
          0.879008,
          0.506241,
          0.893259
        ],
        "printed_page": 44
      },
      "target": {
        "page": 881,
        "anchor": "Loading a GPX file",
        "related_pages": [
          882
        ],
        "figures": [
          {
            "page": 882,
            "label": "Fig. 20.1:",
            "bbox": [
              0.381101,
              0.29277,
              0.444414,
              0.304603
            ],
            "printed_page": 868,
            "caption": "Fig. 20.1: Loading GPS Data dialog"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.637012,
          0.266722,
          0.648845
        ],
        "printed_page": 867
      },
      "relationship": "equivalent",
      "note": "Select Waypoints when loading GPX. Tracks and routes are different feature types; the guide supplies no clinic dataset.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "gpx",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "attribute-table-p45",
      "operation_id": "attribute-table",
      "title": "Open an attribute table",
      "target": {
        "page": 594,
        "anchor": "12.2.2 Introducing the attribute table interface",
        "figures": [
          {
            "page": 595,
            "label": "Fig. 12.70:",
            "bbox": [
              0.355619,
              0.54089,
              0.427316,
              0.552724
            ],
            "printed_page": 581,
            "caption": "Fig. 12.70: Attribute Table for regions layer"
          }
        ],
        "related_pages": [
          595,
          596
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.817238,
          0.557944,
          0.831439
        ],
        "printed_page": 580
      },
      "relationship": "equivalent",
      "note": "Activate the intended layer and use Open Attribute Table / F6. This is viewing attributes, not an attribute join.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 7",
      "source": {
        "page": 45,
        "anchor": "Open the attributable table",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.146004,
          0.373182,
          0.379344,
          0.387433
        ],
        "printed_page": 45
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "attribute-table-p46",
      "operation_id": "attribute-table",
      "title": "Open an attribute table",
      "target": {
        "page": 594,
        "anchor": "12.2.2 Introducing the attribute table interface",
        "figures": [
          {
            "page": 595,
            "label": "Fig. 12.70:",
            "bbox": [
              0.355619,
              0.54089,
              0.427316,
              0.552724
            ],
            "printed_page": 581,
            "caption": "Fig. 12.70: Attribute Table for regions layer"
          }
        ],
        "related_pages": [
          595,
          596
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.817238,
          0.557944,
          0.831439
        ],
        "printed_page": 580
      },
      "relationship": "equivalent",
      "note": "Activate the intended layer and use Open Attribute Table / F6. This is viewing attributes, not an attribute join.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 7",
      "source": {
        "page": 46,
        "anchor": "attributable table",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.222468,
          0.687585,
          0.372176,
          0.701836
        ],
        "printed_page": 46
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "clinic-join",
      "group": "Lesson 7",
      "title": "Join clinic names using a matching key",
      "source": {
        "page": 46,
        "anchor": "join the",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.284075,
          0.236193,
          0.348238,
          0.250444
        ],
        "printed_page": 46
      },
      "target": {
        "page": 648,
        "anchor": "12.4.1 Joining features",
        "related_pages": [
          649,
          650
        ],
        "figures": [
          {
            "page": 649,
            "label": "Fig. 12.104:",
            "bbox": [
              0.299504,
              0.728339,
              0.379553,
              0.740172
            ],
            "printed_page": 635,
            "caption": "Fig. 12.104: Join an attribute table to an existing vector layer"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.321254,
          0.34028,
          0.335455
        ],
        "printed_page": 634
      },
      "relationship": "equivalent",
      "note": "Verify the waypoint key and CSV key. This is an attribute join, not a nearest-clinic or spatial join.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "clinic-join",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "labels-p46",
      "group": "Lesson 7",
      "title": "Label features using the joined clinic-name field",
      "source": {
        "page": 46,
        "anchor": "label",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.848728,
          0.704259,
          0.909704,
          0.71851
        ],
        "printed_page": 46
      },
      "target": {
        "page": 537,
        "anchor": "Single labels",
        "related_pages": [],
        "figures": [
          {
            "page": 537,
            "label": "Fig. 12.25:",
            "bbox": [
              0.339528,
              0.761899,
              0.411225,
              0.773732
            ],
            "printed_page": 523,
            "caption": "Fig. 12.25: Layer labeling settings - Single labels"
          }
        ],
        "document": "new",
        "bbox": [
          0.192079,
          0.115106,
          0.276128,
          0.12694
        ],
        "printed_page": 523
      },
      "relationship": "equivalent",
      "note": "Use Single labels with the joined clinic-name field. Keep the course layer and choose the appropriate font. The official guide uses different sample data.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "labels",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "table-p46",
      "group": "Lesson 7",
      "title": "Load the clinic-name CSV as an attribute-only table",
      "source": {
        "page": 46,
        "anchor": "newClinics.csv",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.146004,
          0.079692,
          0.28635,
          0.093943
        ],
        "printed_page": 46
      },
      "target": {
        "page": 447,
        "anchor": "Geometry definition",
        "related_pages": [
          445,
          446
        ],
        "figures": [
          {
            "page": 446,
            "label": "Fig. 11.9:",
            "bbox": [
              0.391703,
              0.446802,
              0.455015,
              0.458635
            ],
            "printed_page": 432,
            "caption": "Fig. 11.9: Delimited Text Dialog"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.453371,
          0.2774,
          0.465205
        ],
        "printed_page": 433
      },
      "relationship": "changed",
      "note": "Use Delimited Text / No geometry for newClinics.csv, whose clinic names are keyed by GPS_No. The GPX waypoint geometry is in a separate layer. This is a documented current method replacing the course Add Vector Layer path.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "table",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "attribute-table-p47",
      "operation_id": "attribute-table",
      "title": "Open an attribute table",
      "target": {
        "page": 594,
        "anchor": "12.2.2 Introducing the attribute table interface",
        "figures": [
          {
            "page": 595,
            "label": "Fig. 12.70:",
            "bbox": [
              0.355619,
              0.54089,
              0.427316,
              0.552724
            ],
            "printed_page": 581,
            "caption": "Fig. 12.70: Attribute Table for regions layer"
          }
        ],
        "related_pages": [
          595,
          596
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.817238,
          0.557944,
          0.831439
        ],
        "printed_page": 580
      },
      "relationship": "equivalent",
      "note": "Activate the intended layer and use Open Attribute Table / F6. This is viewing attributes, not an attribute join.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 7",
      "source": {
        "page": 47,
        "anchor": "Open the attributable table",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.146004,
          0.743342,
          0.390819,
          0.757593
        ],
        "printed_page": 47
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "choropleth-p47",
      "group": "Lesson 7",
      "title": "Classify population or density with graduated colours",
      "source": {
        "page": 47,
        "anchor": "Graduated",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.690256,
          0.77669,
          0.795611,
          0.790941
        ],
        "printed_page": 47
      },
      "target": {
        "page": 518,
        "anchor": "Graduated Renderer",
        "related_pages": [
          519,
          520
        ],
        "figures": [
          {
            "page": 520,
            "label": "Fig. 12.5:",
            "bbox": [
              0.361962,
              0.465745,
              0.425291,
              0.477578
            ],
            "printed_page": 506,
            "caption": "Fig. 12.5: Graduated Symbolizing options"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.353477,
          0.282236,
          0.365311
        ],
        "printed_page": 504
      },
      "relationship": "equivalent",
      "note": "Use Graduated with the intended population or density numeric field. Confirm the field and class breaks from this exercise; the guide uses different sample data.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "choropleth",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "density-p47",
      "group": "Lesson 7",
      "title": "Calculate a population-density field",
      "source": {
        "page": 47,
        "anchor": "Population density per",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.146004,
          0.893687,
          0.341836,
          0.907938
        ],
        "printed_page": 47
      },
      "target": {
        "page": 604,
        "anchor": "Using the Field Calculator",
        "related_pages": [
          605,
          606
        ],
        "figures": [
          {
            "page": 605,
            "label": "Fig. 12.75:",
            "bbox": [
              0.408556,
              0.430136,
              0.480253,
              0.441969
            ],
            "printed_page": 591,
            "caption": "Fig. 12.75: Field Calculator"
          }
        ],
        "document": "new",
        "bbox": [
          0.162792,
          0.226284,
          0.325381,
          0.238117
        ],
        "printed_page": 590
      },
      "relationship": "equivalent",
      "note": "The formula discussion continues to the field-calculator dialog on course page 48. Verify population numerator and square-metre area before applying the factor of 1,000,000; the guide documents the tool, not the data or result.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "density",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "load-vector-p47",
      "group": "Lesson 7",
      "title": "Load a shapefile",
      "source": {
        "page": 47,
        "anchor": "add a map of NIHS",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.191081,
          0.399831,
          0.352547,
          0.414082
        ],
        "printed_page": 47
      },
      "target": {
        "page": 441,
        "anchor": "Loading a layer from a file",
        "related_pages": [
          442,
          443
        ],
        "figures": [
          {
            "page": 442,
            "label": "Fig. 11.4:",
            "bbox": [
              0.382289,
              0.355485,
              0.445601,
              0.367318
            ],
            "printed_page": 428,
            "caption": "Fig. 11.4: Add Vector Layer Dialog"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.714921,
          0.326034,
          0.726755
        ],
        "printed_page": 427
      },
      "relationship": "equivalent",
      "note": "Use Data Source Manager / Add Vector Layer. The course dataset is not supplied by the official guide.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "load-vector",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "zoom-layer-p47",
      "operation_id": "zoom-layer",
      "title": "Zoom to a layer extent",
      "target": {
        "page": 182,
        "anchor": "Zoom to Layer(s)/Group",
        "figures": [],
        "related_pages": [],
        "document": "new",
        "bbox": [
          0.160281,
          0.164038,
          0.318654,
          0.175872
        ],
        "printed_page": 168
      },
      "relationship": "equivalent",
      "note": "Use the layer context-menu Zoom to Layer(s). The official menu table documents the command; no identical course map is expected.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 7",
      "source": {
        "page": 47,
        "anchor": "zoom to layer",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.668452,
          0.399831,
          0.802215,
          0.414082
        ],
        "printed_page": 47
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "attribute-table-p48",
      "operation_id": "attribute-table",
      "title": "Open an attribute table",
      "target": {
        "page": 594,
        "anchor": "12.2.2 Introducing the attribute table interface",
        "figures": [
          {
            "page": 595,
            "label": "Fig. 12.70:",
            "bbox": [
              0.355619,
              0.54089,
              0.427316,
              0.552724
            ],
            "printed_page": 581,
            "caption": "Fig. 12.70: Attribute Table for regions layer"
          }
        ],
        "related_pages": [
          595,
          596
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.817238,
          0.557944,
          0.831439
        ],
        "printed_page": 580
      },
      "relationship": "equivalent",
      "note": "Activate the intended layer and use Open Attribute Table / F6. This is viewing attributes, not an attribute join.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 7",
      "source": {
        "page": 48,
        "anchor": "Open the attributable table",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.529817,
          0.063018,
          0.76115,
          0.077269
        ],
        "printed_page": 48
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "choropleth-p48",
      "group": "Lesson 7",
      "title": "Classify population or density with graduated colours",
      "source": {
        "page": 48,
        "anchor": "graduated colors",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.418462,
          0.734507,
          0.5636,
          0.748758
        ],
        "printed_page": 48
      },
      "target": {
        "page": 518,
        "anchor": "Graduated Renderer",
        "related_pages": [
          519,
          520
        ],
        "figures": [
          {
            "page": 520,
            "label": "Fig. 12.5:",
            "bbox": [
              0.361962,
              0.465745,
              0.425291,
              0.477578
            ],
            "printed_page": 506,
            "caption": "Fig. 12.5: Graduated Symbolizing options"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.353477,
          0.282236,
          0.365311
        ],
        "printed_page": 504
      },
      "relationship": "equivalent",
      "note": "Use Graduated with the intended population or density numeric field. Confirm the field and class breaks from this exercise; the guide uses different sample data.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "choropleth",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "density",
      "group": "Lesson 7",
      "title": "Calculate a population-density field",
      "source": {
        "page": 48,
        "anchor": "Field Calculator",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.396168,
          0.09639,
          0.557295,
          0.110641
        ],
        "printed_page": 48
      },
      "target": {
        "page": 604,
        "anchor": "Using the Field Calculator",
        "related_pages": [
          605,
          606
        ],
        "figures": [
          {
            "page": 605,
            "label": "Fig. 12.75:",
            "bbox": [
              0.408556,
              0.430136,
              0.480253,
              0.441969
            ],
            "printed_page": 591,
            "caption": "Fig. 12.75: Field Calculator"
          }
        ],
        "document": "new",
        "bbox": [
          0.162792,
          0.226284,
          0.325381,
          0.238117
        ],
        "printed_page": 590
      },
      "relationship": "equivalent",
      "note": "The calculator operation matches. Check the population numerator and area units; the official guide does not certify the course density formula.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "density",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "gpx-p48",
      "group": "Lesson 7",
      "title": "Load dental-clinic GPX waypoints",
      "source": {
        "page": 48,
        "anchor": "dental clinic.gpx",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.476347,
          0.881431,
          0.615868,
          0.895682
        ],
        "printed_page": 48
      },
      "target": {
        "page": 881,
        "anchor": "Loading a GPX file",
        "related_pages": [
          882
        ],
        "figures": [
          {
            "page": 882,
            "label": "Fig. 20.1:",
            "bbox": [
              0.381101,
              0.29277,
              0.444414,
              0.304603
            ],
            "printed_page": 868,
            "caption": "Fig. 20.1: Loading GPS Data dialog"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.637012,
          0.266722,
          0.648845
        ],
        "printed_page": 867
      },
      "relationship": "equivalent",
      "note": "Select Waypoints when loading GPX. Tracks and routes are different feature types; the guide supplies no clinic dataset.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "gpx",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "toggle-edit-p48",
      "operation_id": "toggle-edit",
      "title": "Enable editing and save attribute edits",
      "target": {
        "page": 604,
        "anchor": "12.2.4 Editing attribute values",
        "figures": [],
        "related_pages": [
          595,
          605
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.085996,
          0.404507,
          0.100196
        ],
        "printed_page": 590
      },
      "relationship": "equivalent",
      "note": "Toggle editing, change attributes and save the layer edits. Saving a project does not save all pending feature edits.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 7",
      "source": {
        "page": 48,
        "anchor": "Toggle",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.83936,
          0.079692,
          0.909771,
          0.093943
        ],
        "printed_page": 48
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "clinic-join-p49",
      "group": "Lesson 7",
      "title": "Join clinic names using a matching key",
      "source": {
        "page": 49,
        "anchor": "join the two tables",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.284075,
          0.09639,
          0.444151,
          0.110641
        ],
        "printed_page": 49
      },
      "target": {
        "page": 648,
        "anchor": "12.4.1 Joining features",
        "related_pages": [
          649,
          650
        ],
        "figures": [
          {
            "page": 649,
            "label": "Fig. 12.104:",
            "bbox": [
              0.299504,
              0.728339,
              0.379553,
              0.740172
            ],
            "printed_page": 635,
            "caption": "Fig. 12.104: Join an attribute table to an existing vector layer"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.321254,
          0.34028,
          0.335455
        ],
        "printed_page": 634
      },
      "relationship": "equivalent",
      "note": "Verify the waypoint key and CSV key. This is an attribute join, not a nearest-clinic or spatial join.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "clinic-join",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "export-clinics-p49",
      "group": "Lesson 7",
      "title": "Save clinic waypoints as a shapefile",
      "source": {
        "page": 49,
        "anchor": "Save as",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.563177,
          0.701836,
          0.655647,
          0.716087
        ],
        "printed_page": 49
      },
      "target": {
        "page": 479,
        "anchor": "11.2.2 Creating new layers",
        "related_pages": [
          480,
          481,
          482
        ],
        "figures": [
          {
            "page": 482,
            "label": "Fig. 11.32:",
            "bbox": [
              0.3689,
              0.674763,
              0.440581,
              0.686596
            ],
            "printed_page": 468,
            "caption": "Fig. 11.32: Saving as a new vector layer"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.085996,
          0.373378,
          0.100196
        ],
        "printed_page": 465
      },
      "relationship": "equivalent",
      "note": "Export to ESRI Shapefile and choose the desired fields and CRS. Fig. 11.32 illustrates the vector export dialog with a different default format; choose the format required here.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "export-clinics",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "rename-p49",
      "operation_id": "rename",
      "title": "Rename the layer in the project",
      "target": {
        "page": 182,
        "anchor": "Rename Layer/Group",
        "figures": [],
        "related_pages": [
          511
        ],
        "document": "new",
        "bbox": [
          0.130994,
          0.286636,
          0.271024,
          0.29847
        ],
        "printed_page": 168
      },
      "relationship": "equivalent",
      "note": "Rename the displayed layer. This does not rename or export its underlying file.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 7",
      "source": {
        "page": 49,
        "anchor": "Rename",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.548299,
          0.47693,
          0.639437,
          0.491181
        ],
        "printed_page": 49
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "table-p49",
      "group": "Lesson 7",
      "title": "Load the clinic-name CSV as an attribute-only table",
      "source": {
        "page": 49,
        "anchor": "newClinics.csv",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.146004,
          0.079692,
          0.295131,
          0.093943
        ],
        "printed_page": 49
      },
      "target": {
        "page": 447,
        "anchor": "Geometry definition",
        "related_pages": [
          445,
          446
        ],
        "figures": [
          {
            "page": 446,
            "label": "Fig. 11.9:",
            "bbox": [
              0.391703,
              0.446802,
              0.455015,
              0.458635
            ],
            "printed_page": 432,
            "caption": "Fig. 11.9: Delimited Text Dialog"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.453371,
          0.2774,
          0.465205
        ],
        "printed_page": 433
      },
      "relationship": "changed",
      "note": "Use Delimited Text / No geometry for newClinics.csv, whose clinic names are keyed by GPS_No. The GPX waypoint geometry is in a separate layer. This is a documented current method replacing the course Add Vector Layer path.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "table",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "basemap",
      "group": "Lesson 7",
      "title": "Alternative to the old OpenLayers basemap workflow",
      "source": {
        "page": 50,
        "anchor": "Overlaying a base map",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.202973,
          0.633826,
          0.428801,
          0.649218
        ],
        "printed_page": 50
      },
      "target": {
        "page": 464,
        "anchor": "Using XYZ Tile services",
        "related_pages": [
          465,
          466
        ],
        "figures": [
          {
            "page": 465,
            "label": "Fig. 11.19:",
            "bbox": [
              0.321721,
              0.606482,
              0.393418,
              0.618315
            ],
            "printed_page": 451,
            "caption": "Fig. 11.19: XYZ Tiles - OpenStreetMap configuration"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.702906,
          0.308846,
          0.71474
        ],
        "printed_page": 450
      },
      "relationship": "alternative",
      "note": "XYZ tiles are an alternative basemap workflow. The guide\u2019s OpenStreetMap example is not Google Street Map, and it does not establish availability of the old OpenLayers plugin.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "basemap",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "export-clinics",
      "group": "Lesson 7",
      "title": "Save clinic waypoints as a shapefile",
      "source": {
        "page": 50,
        "anchor": "ESRI Shape File",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.343266,
          0.52099,
          0.491222,
          0.535241
        ],
        "printed_page": 50
      },
      "target": {
        "page": 479,
        "anchor": "11.2.2 Creating new layers",
        "related_pages": [
          480,
          481,
          482
        ],
        "figures": [
          {
            "page": 482,
            "label": "Fig. 11.32:",
            "bbox": [
              0.3689,
              0.674763,
              0.440581,
              0.686596
            ],
            "printed_page": 468,
            "caption": "Fig. 11.32: Saving as a new vector layer"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.085996,
          0.373378,
          0.100196
        ],
        "printed_page": 465
      },
      "relationship": "equivalent",
      "note": "Export to ESRI Shapefile and choose the desired fields and CRS. Fig. 11.32 illustrates the vector export dialog with a different default format; choose the format required here.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "export-clinics",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "plugins-p50",
      "operation_id": "plugins",
      "title": "Manage, install or reinstall plugins",
      "target": {
        "page": 1625,
        "anchor": "25.1.2 The Plugins Dialog",
        "figures": [
          {
            "page": 1627,
            "label": "Fig. 25.2:",
            "bbox": [
              0.335771,
              0.406267,
              0.399084,
              0.4181
            ],
            "printed_page": 1613,
            "caption": "Fig. 25.2: Searching a plugin from the All tab"
          }
        ],
        "related_pages": [
          1626,
          1627,
          1628
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.619113,
          0.364943,
          0.633313
        ],
        "printed_page": 1611
      },
      "relationship": "partial",
      "note": "The Plugin Manager workflow is documented. This guide excludes external plugin documentation and does not establish that OpenLayers is available or compatible with QGIS 3.44; reinstalling is not a verified fix.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 7",
      "source": {
        "page": 50,
        "anchor": "Manage and Install Plugins",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.464147,
          0.701836,
          0.694165,
          0.716087
        ],
        "printed_page": 50
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "load-vector-p51",
      "group": "Lesson 7",
      "title": "Load a shapefile",
      "source": {
        "page": 51,
        "anchor": "Add vector layers",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.188867,
          0.478896,
          0.352973,
          0.493148
        ],
        "printed_page": 51
      },
      "target": {
        "page": 441,
        "anchor": "Loading a layer from a file",
        "related_pages": [
          442,
          443
        ],
        "figures": [
          {
            "page": 442,
            "label": "Fig. 11.4:",
            "bbox": [
              0.382289,
              0.355485,
              0.445601,
              0.367318
            ],
            "printed_page": 428,
            "caption": "Fig. 11.4: Add Vector Layer Dialog"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.714921,
          0.326034,
          0.726755
        ],
        "printed_page": 427
      },
      "relationship": "equivalent",
      "note": "Use Data Source Manager / Add Vector Layer. The course dataset is not supplied by the official guide.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "load-vector",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "plugins-p51",
      "operation_id": "plugins",
      "title": "Manage, install or reinstall plugins",
      "target": {
        "page": 1625,
        "anchor": "25.1.2 The Plugins Dialog",
        "figures": [
          {
            "page": 1627,
            "label": "Fig. 25.2:",
            "bbox": [
              0.335771,
              0.406267,
              0.399084,
              0.4181
            ],
            "printed_page": 1613,
            "caption": "Fig. 25.2: Searching a plugin from the All tab"
          }
        ],
        "related_pages": [
          1626,
          1627,
          1628
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.619113,
          0.364943,
          0.633313
        ],
        "printed_page": 1611
      },
      "relationship": "partial",
      "note": "The Plugin Manager workflow is documented. This guide excludes external plugin documentation and does not establish that OpenLayers is available or compatible with QGIS 3.44; reinstalling is not a verified fix.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 7",
      "source": {
        "page": 51,
        "anchor": "INSTALL PLUGIN",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.580032,
          0.41166,
          0.728592,
          0.425911
        ],
        "printed_page": 51
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "basemap-p52",
      "group": "Lesson 7",
      "title": "Alternative to the old OpenLayers basemap workflow",
      "source": {
        "page": 52,
        "anchor": "Google maps",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.574891,
          0.063018,
          0.707536,
          0.077269
        ],
        "printed_page": 52
      },
      "target": {
        "page": 464,
        "anchor": "Using XYZ Tile services",
        "related_pages": [
          465,
          466
        ],
        "figures": [
          {
            "page": 465,
            "label": "Fig. 11.19:",
            "bbox": [
              0.321721,
              0.606482,
              0.393418,
              0.618315
            ],
            "printed_page": 451,
            "caption": "Fig. 11.19: XYZ Tiles - OpenStreetMap configuration"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.702906,
          0.308846,
          0.71474
        ],
        "printed_page": 450
      },
      "relationship": "alternative",
      "note": "XYZ tiles are an alternative basemap workflow. The guide\u2019s OpenStreetMap example is not Google Street Map, and it does not establish availability of the old OpenLayers plugin.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "basemap",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "layer-panel-p52",
      "operation_id": "layer-panel",
      "title": "Manage layer visibility and drawing order",
      "target": {
        "page": 181,
        "anchor": "Overview of the context menu of the Layers panel",
        "figures": [],
        "related_pages": [
          180,
          182,
          189
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.616185,
          0.513293,
          0.628019
        ],
        "printed_page": 167
      },
      "relationship": "equivalent",
      "note": "Checked layers are visible; drag a layer higher to draw it above lower layers. This does not change the underlying data.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 7",
      "source": {
        "page": 52,
        "anchor": "re-arrange the layers",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.190276,
          0.362208,
          0.376096,
          0.37646
        ],
        "printed_page": 52
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "single-symbol-p52",
      "operation_id": "single-symbol",
      "title": "Use single-symbol layer styling",
      "target": {
        "page": 514,
        "anchor": "Single Symbol Renderer",
        "figures": [
          {
            "page": 515,
            "label": "Fig. 12.3:",
            "bbox": [
              0.370054,
              0.425004,
              0.433383,
              0.436838
            ],
            "printed_page": 501,
            "caption": "Fig. 12.3: Single symbol line properties"
          }
        ],
        "related_pages": [
          390,
          391,
          392
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.825316,
          0.313733,
          0.837149
        ],
        "printed_page": 500
      },
      "relationship": "equivalent",
      "note": "Symbology / Single symbol styles all features alike. Fig. 12.3 is a line example; the marker controls are documented separately for points.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 7",
      "source": {
        "page": 52,
        "anchor": "single symbol",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.723109,
          0.820868,
          0.870848,
          0.835119
        ],
        "printed_page": 52
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "marker",
      "group": "Lesson 7",
      "title": "Style a clinic marker",
      "source": {
        "page": 53,
        "anchor": "Single Marker",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.287699,
          0.400259,
          0.436847,
          0.41451
        ],
        "printed_page": 53
      },
      "target": {
        "page": 392,
        "anchor": "Simple marker (default)",
        "related_pages": [
          390,
          391
        ],
        "figures": [
          {
            "page": 392,
            "label": "Fig. 10.11:",
            "bbox": [
              0.343905,
              0.733684,
              0.415586,
              0.745517
            ],
            "printed_page": 378,
            "caption": "Fig. 10.11: Designing a Simple Marker Symbol"
          }
        ],
        "document": "new",
        "bbox": [
          0.162792,
          0.154541,
          0.328663,
          0.166375
        ],
        "printed_page": 378
      },
      "relationship": "equivalent",
      "note": "The Simple Marker properties document shape, fill, stroke and size. The clinic layer and its resulting map remain local course material.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "marker",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "single-symbol-p53",
      "operation_id": "single-symbol",
      "title": "Use single-symbol layer styling",
      "target": {
        "page": 514,
        "anchor": "Single Symbol Renderer",
        "figures": [
          {
            "page": 515,
            "label": "Fig. 12.3:",
            "bbox": [
              0.370054,
              0.425004,
              0.433383,
              0.436838
            ],
            "printed_page": 501,
            "caption": "Fig. 12.3: Single symbol line properties"
          }
        ],
        "related_pages": [
          390,
          391,
          392
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.825316,
          0.313733,
          0.837149
        ],
        "printed_page": 500
      },
      "relationship": "equivalent",
      "note": "Symbology / Single symbol styles all features alike. Fig. 12.3 is a line example; the marker controls are documented separately for points.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 7",
      "source": {
        "page": 53,
        "anchor": "Double click",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.146004,
          0.400259,
          0.251158,
          0.41451
        ],
        "printed_page": 53
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "marker-p54",
      "group": "Lesson 7",
      "title": "Style a clinic marker",
      "source": {
        "page": 54,
        "anchor": "make it red",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.293316,
          0.063018,
          0.39084,
          0.077269
        ],
        "printed_page": 54
      },
      "target": {
        "page": 392,
        "anchor": "Simple marker (default)",
        "related_pages": [
          390,
          391
        ],
        "figures": [
          {
            "page": 392,
            "label": "Fig. 10.11:",
            "bbox": [
              0.343905,
              0.733684,
              0.415586,
              0.745517
            ],
            "printed_page": 378,
            "caption": "Fig. 10.11: Designing a Simple Marker Symbol"
          }
        ],
        "document": "new",
        "bbox": [
          0.162792,
          0.154541,
          0.328663,
          0.166375
        ],
        "printed_page": 378
      },
      "relationship": "equivalent",
      "note": "The Simple Marker properties document shape, fill, stroke and size. The clinic layer and its resulting map remain local course material.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "marker",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "basemap-p55",
      "group": "Lesson 8",
      "title": "Alternative to the old OpenLayers basemap workflow",
      "source": {
        "page": 55,
        "anchor": "Google maps",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.578095,
          0.269113,
          0.704369,
          0.283364
        ],
        "printed_page": 55
      },
      "target": {
        "page": 464,
        "anchor": "Using XYZ Tile services",
        "related_pages": [
          465,
          466
        ],
        "figures": [
          {
            "page": 465,
            "label": "Fig. 11.19:",
            "bbox": [
              0.321721,
              0.606482,
              0.393418,
              0.618315
            ],
            "printed_page": 451,
            "caption": "Fig. 11.19: XYZ Tiles - OpenStreetMap configuration"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.702906,
          0.308846,
          0.71474
        ],
        "printed_page": 450
      },
      "relationship": "alternative",
      "note": "XYZ tiles are an alternative basemap workflow. The guide\u2019s OpenStreetMap example is not Google Street Map, and it does not establish availability of the old OpenLayers plugin.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "basemap",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "layer-panel-p55",
      "operation_id": "layer-panel",
      "title": "Manage layer visibility and drawing order",
      "target": {
        "page": 181,
        "anchor": "Overview of the context menu of the Layers panel",
        "figures": [],
        "related_pages": [
          180,
          182,
          189
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.616185,
          0.513293,
          0.628019
        ],
        "printed_page": 167
      },
      "relationship": "equivalent",
      "note": "Checked layers are visible; drag a layer higher to draw it above lower layers. This does not change the underlying data.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 8",
      "source": {
        "page": 55,
        "anchor": "re-arrange the layers",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.146004,
          0.35266,
          0.32679,
          0.366911
        ],
        "printed_page": 55
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "layout",
      "group": "Lesson 8",
      "title": "Create a print layout",
      "source": {
        "page": 55,
        "anchor": "New Print Composer",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.255701,
          0.419213,
          0.452973,
          0.433464
        ],
        "printed_page": 55
      },
      "target": {
        "page": 761,
        "anchor": "18.1.1 Sample Session for beginners",
        "related_pages": [
          762,
          763
        ],
        "figures": [
          {
            "page": 762,
            "label": "Fig. 18.1:",
            "bbox": [
              0.378163,
              0.668466,
              0.441492,
              0.6803
            ],
            "printed_page": 748,
            "caption": "Fig. 18.1: The Print Layout Manager"
          },
          {
            "page": 763,
            "label": "Fig. 18.2:",
            "bbox": [
              0.424254,
              0.729955,
              0.487583,
              0.741789
            ],
            "printed_page": 749,
            "caption": "Fig. 18.2: Print Layout"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.498937,
          0.47279,
          0.513137
        ],
        "printed_page": 747
      },
      "relationship": "changed",
      "note": "New Print Layout replaces the old New Print Composer workflow. The basemap setup and Print as Raster settings are separate operations.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "layout",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "layout-grid-p55",
      "operation_id": "layout-grid",
      "title": "Snap layout items to a grid",
      "target": {
        "page": 770,
        "anchor": "Guides and Grid",
        "figures": [
          {
            "page": 770,
            "label": "Fig. 18.3:",
            "bbox": [
              0.35044,
              0.632992,
              0.413769,
              0.644826
            ],
            "printed_page": 756,
            "caption": "Fig. 18.3: Layout Settings in the Print Layout"
          }
        ],
        "related_pages": [
          771,
          766
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.820916,
          0.249752,
          0.83275
        ],
        "printed_page": 756
      },
      "relationship": "equivalent",
      "note": "Configure the layout grid and use View / Snap to Grid. Grid spacing and snapping are separate from map scale.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 8",
      "source": {
        "page": 55,
        "anchor": "Snap to Grid",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.270002,
          0.933191,
          0.391081,
          0.947442
        ],
        "printed_page": 55
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "layout-page-p55",
      "operation_id": "layout-page",
      "title": "Set layout page size and orientation",
      "target": {
        "page": 773,
        "anchor": "Updating page properties",
        "figures": [
          {
            "page": 773,
            "label": "Fig. 18.6:",
            "bbox": [
              0.392548,
              0.599518,
              0.455877,
              0.611351
            ],
            "printed_page": 759,
            "caption": "Fig. 18.6: Page properties dialog"
          }
        ],
        "related_pages": [
          772
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.087889,
          0.324009,
          0.099723
        ],
        "printed_page": 759
      },
      "relationship": "changed",
      "note": "Use Page Properties for portrait/landscape and page size, replacing the old Composition tab location.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 8",
      "source": {
        "page": 55,
        "anchor": "orientation",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.339726,
          0.876015,
          0.436323,
          0.890266
        ],
        "printed_page": 55
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "layout-raster-p55",
      "operation_id": "layout-raster",
      "title": "Set Print as raster for layout export",
      "target": {
        "page": 771,
        "anchor": "Export settings",
        "figures": [
          {
            "page": 770,
            "label": "Fig. 18.3:",
            "bbox": [
              0.35044,
              0.632992,
              0.413769,
              0.644826
            ],
            "printed_page": 756,
            "caption": "Fig. 18.3: Layout Settings in the Print Layout"
          }
        ],
        "related_pages": [
          829
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.319397,
          0.241852,
          0.33123
        ],
        "printed_page": 757
      },
      "relationship": "equivalent",
      "note": "Print as raster remains an export setting in the Layout panel. It is separate from creating a layout and may affect the output representation.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 8",
      "source": {
        "page": 55,
        "anchor": "Print as Raster",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.270015,
          0.909505,
          0.422572,
          0.923757
        ],
        "printed_page": 55
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "load-vector-p55",
      "group": "Lesson 8",
      "title": "Load a shapefile",
      "source": {
        "page": 55,
        "anchor": "Add vector layers",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.191101,
          0.218949,
          0.354802,
          0.2332
        ],
        "printed_page": 55
      },
      "target": {
        "page": 441,
        "anchor": "Loading a layer from a file",
        "related_pages": [
          442,
          443
        ],
        "figures": [
          {
            "page": 442,
            "label": "Fig. 11.4:",
            "bbox": [
              0.382289,
              0.355485,
              0.445601,
              0.367318
            ],
            "printed_page": 428,
            "caption": "Fig. 11.4: Add Vector Layer Dialog"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.714921,
          0.326034,
          0.726755
        ],
        "printed_page": 427
      },
      "relationship": "equivalent",
      "note": "Use Data Source Manager / Add Vector Layer. The course dataset is not supplied by the official guide.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "load-vector",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "single-symbol-p55",
      "operation_id": "single-symbol",
      "title": "Use single-symbol layer styling",
      "target": {
        "page": 514,
        "anchor": "Single Symbol Renderer",
        "figures": [
          {
            "page": 515,
            "label": "Fig. 12.3:",
            "bbox": [
              0.370054,
              0.425004,
              0.433383,
              0.436838
            ],
            "printed_page": 501,
            "caption": "Fig. 12.3: Single symbol line properties"
          }
        ],
        "related_pages": [
          390,
          391,
          392
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.825316,
          0.313733,
          0.837149
        ],
        "printed_page": 500
      },
      "relationship": "equivalent",
      "note": "Symbology / Single symbol styles all features alike. Fig. 12.3 is a line example; the marker controls are documented separately for points.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 8",
      "source": {
        "page": 55,
        "anchor": "single symbol",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.710308,
          0.386008,
          0.847212,
          0.400259
        ],
        "printed_page": 55
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "layout-map",
      "group": "Lesson 8",
      "title": "Add the map to the layout",
      "source": {
        "page": 56,
        "anchor": "Adding the map",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.085565,
          0.146522,
          0.243335,
          0.161913
        ],
        "printed_page": 56
      },
      "target": {
        "page": 781,
        "anchor": "18.2.2 The Map Item",
        "related_pages": [
          782,
          783
        ],
        "figures": [
          {
            "page": 782,
            "label": "Fig. 18.14:",
            "bbox": [
              0.373108,
              0.503087,
              0.444805,
              0.514921
            ],
            "printed_page": 768,
            "caption": "Fig. 18.14: Map Item Properties Panel"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.44303,
          0.31614,
          0.457231
        ],
        "printed_page": 767
      },
      "relationship": "equivalent",
      "note": "Add Map and configure Item Properties. Preserve the visible course layers.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "layout-map",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "layout-raise-p56",
      "operation_id": "layout-raise",
      "title": "Bring the legend above other layout items",
      "target": {
        "page": 778,
        "anchor": "Alignment and distribution",
        "figures": [],
        "related_pages": [],
        "document": "new",
        "bbox": [
          0.120951,
          0.087889,
          0.330453,
          0.099723
        ],
        "printed_page": 764
      },
      "relationship": "equivalent",
      "note": "Raise selected items controls item drawing order in the layout, distinct from map-layer drawing order.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 8",
      "source": {
        "page": 56,
        "anchor": "Bring to Front",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.238809,
          0.807757,
          0.375663,
          0.822008
        ],
        "printed_page": 56
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "layout-resize-p56",
      "operation_id": "layout-resize",
      "title": "Move and resize layout items",
      "target": {
        "page": 777,
        "anchor": "Moving and resizing items",
        "figures": [],
        "related_pages": [
          779
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.2485,
          0.32831,
          0.260334
        ],
        "printed_page": 763
      },
      "relationship": "equivalent",
      "note": "Select/Move item and handles move or resize a layout frame. Use Move item content to pan the map inside the frame.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 8",
      "source": {
        "page": 56,
        "anchor": "resize the map",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.173579,
          0.248306,
          0.299983,
          0.262558
        ],
        "printed_page": 56
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "layout-title",
      "group": "Lesson 8",
      "title": "Add a map title",
      "source": {
        "page": 56,
        "anchor": "Adding a Map Title",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.085565,
          0.404217,
          0.273266,
          0.419608
        ],
        "printed_page": 56
      },
      "target": {
        "page": 792,
        "anchor": "18.2.4 The Label Item",
        "related_pages": [
          793
        ],
        "figures": [
          {
            "page": 792,
            "label": "Fig. 18.24:",
            "bbox": [
              0.634397,
              0.215166,
              0.711667,
              0.226999
            ],
            "printed_page": 778,
            "caption": "Fig. 18.24: Label Item Properties Panel"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.119869,
          0.327829,
          0.13407
        ],
        "printed_page": 778
      },
      "relationship": "equivalent",
      "note": "Use a layout Label item for the title. This is different from labels attached to map features.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "layout-title",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "legend",
      "group": "Lesson 8",
      "title": "Add and customise a legend",
      "source": {
        "page": 56,
        "anchor": "Adding the Legend",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.085565,
          0.704512,
          0.271722,
          0.719903
        ],
        "printed_page": 56
      },
      "target": {
        "page": 796,
        "anchor": "18.2.5 The Legend Item",
        "related_pages": [
          797,
          798,
          799,
          800
        ],
        "figures": [
          {
            "page": 796,
            "label": "Fig. 18.27:",
            "bbox": [
              0.634397,
              0.371853,
              0.711667,
              0.383686
            ],
            "printed_page": 782,
            "caption": "Fig. 18.27: Legend Item Properties Panel"
          },
          {
            "page": 798,
            "label": "Fig. 18.30:",
            "bbox": [
              0.789373,
              0.227733,
              0.866643,
              0.239566
            ],
            "printed_page": 784,
            "caption": "Fig. 18.30: Legend Items group"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.276556,
          0.346245,
          0.290757
        ],
        "printed_page": 782
      },
      "relationship": "equivalent",
      "note": "Add Legend; verify Auto update and layer names rather than assuming the old All button still exists.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "legend",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "project-save-p56",
      "operation_id": "project-save",
      "title": "Save the QGIS project",
      "target": {
        "page": 27,
        "anchor": "2.1 Introducing QGIS projects",
        "figures": [],
        "related_pages": [
          28,
          29
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.274245,
          0.463436,
          0.291285
        ],
        "printed_page": 13
      },
      "relationship": "equivalent",
      "note": "Project Save / Save As stores the session. Exporting a layer and saving pending edits are separate operations.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 8",
      "source": {
        "page": 56,
        "anchor": "Save the QGIS project",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.146004,
          0.626163,
          0.328361,
          0.640414
        ],
        "printed_page": 56
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "rename-p56",
      "operation_id": "rename",
      "title": "Rename the layer in the project",
      "target": {
        "page": 182,
        "anchor": "Rename Layer/Group",
        "figures": [],
        "related_pages": [
          511
        ],
        "document": "new",
        "bbox": [
          0.130994,
          0.286636,
          0.271024,
          0.29847
        ],
        "printed_page": 168
      },
      "relationship": "equivalent",
      "note": "Rename the displayed layer. This does not rename or export its underlying file.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 8",
      "source": {
        "page": 56,
        "anchor": "rename",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.748909,
          0.857921,
          0.834152,
          0.872172
        ],
        "printed_page": 56
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "layout-frame-p57",
      "operation_id": "layout-frame",
      "title": "Show or hide the layout item frame",
      "target": {
        "page": 779,
        "anchor": "Items Common Properties",
        "figures": [
          {
            "page": 779,
            "label": "Fig. 18.11:",
            "bbox": [
              0.353519,
              0.641212,
              0.425216,
              0.653046
            ],
            "printed_page": 765,
            "caption": "Fig. 18.11: Common Item Properties groups"
          }
        ],
        "related_pages": [],
        "document": "new",
        "bbox": [
          0.120951,
          0.087889,
          0.328294,
          0.099723
        ],
        "printed_page": 765
      },
      "relationship": "equivalent",
      "note": "Use the item Frame property to show or hide its border. This is separate from adding a north arrow.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 8",
      "source": {
        "page": 57,
        "anchor": "Show frame",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.231964,
          0.796927,
          0.349691,
          0.811178
        ],
        "printed_page": 57
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "layout-resize-p57",
      "operation_id": "layout-resize",
      "title": "Move and resize layout items",
      "target": {
        "page": 777,
        "anchor": "Moving and resizing items",
        "figures": [],
        "related_pages": [
          779
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.2485,
          0.32831,
          0.260334
        ],
        "printed_page": 763
      },
      "relationship": "equivalent",
      "note": "Select/Move item and handles move or resize a layout frame. Use Move item content to pan the map inside the frame.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 8",
      "source": {
        "page": 57,
        "anchor": "Resize your legend",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.146004,
          0.113206,
          0.308218,
          0.127457
        ],
        "printed_page": 57
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "legend-p57",
      "group": "Lesson 8",
      "title": "Add and customise a legend",
      "source": {
        "page": 57,
        "anchor": "Auto Update",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.178176,
          0.079692,
          0.300825,
          0.093943
        ],
        "printed_page": 57
      },
      "target": {
        "page": 796,
        "anchor": "18.2.5 The Legend Item",
        "related_pages": [
          797,
          798,
          799,
          800
        ],
        "figures": [
          {
            "page": 796,
            "label": "Fig. 18.27:",
            "bbox": [
              0.634397,
              0.371853,
              0.711667,
              0.383686
            ],
            "printed_page": 782,
            "caption": "Fig. 18.27: Legend Item Properties Panel"
          },
          {
            "page": 798,
            "label": "Fig. 18.30:",
            "bbox": [
              0.789373,
              0.227733,
              0.866643,
              0.239566
            ],
            "printed_page": 784,
            "caption": "Fig. 18.30: Legend Items group"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.276556,
          0.346245,
          0.290757
        ],
        "printed_page": 782
      },
      "relationship": "equivalent",
      "note": "Add Legend; verify Auto update and layer names rather than assuming the old All button still exists.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "legend",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "north",
      "group": "Lesson 8",
      "title": "Add a north arrow",
      "source": {
        "page": 57,
        "anchor": "Adding a North Arrow",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.085565,
          0.64993,
          0.305416,
          0.665321
        ],
        "printed_page": 57
      },
      "target": {
        "page": 819,
        "anchor": "The North Arrow Item",
        "related_pages": [
          820
        ],
        "figures": [
          {
            "page": 819,
            "label": "Fig. 18.55:",
            "bbox": [
              0.263053,
              0.859297,
              0.33475,
              0.871131
            ],
            "printed_page": 805,
            "caption": "Fig. 18.55: North arrows available for selection in provided SVG library"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.262503,
          0.291625,
          0.274337
        ],
        "printed_page": 805
      },
      "relationship": "changed",
      "note": "The dedicated Add North Arrow item is a modern counterpart to selecting a north-arrow image.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "north",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "project-save-p57",
      "operation_id": "project-save",
      "title": "Save the QGIS project",
      "target": {
        "page": 27,
        "anchor": "2.1 Introducing QGIS projects",
        "figures": [],
        "related_pages": [
          28,
          29
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.274245,
          0.463436,
          0.291285
        ],
        "printed_page": 13
      },
      "relationship": "equivalent",
      "note": "Project Save / Save As stores the session. Exporting a layer and saving pending edits are separate operations.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 8",
      "source": {
        "page": 57,
        "anchor": "Save the QGIS project",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.146004,
          0.12988,
          0.340893,
          0.144131
        ],
        "printed_page": 57
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "scale",
      "group": "Lesson 8",
      "title": "Add a scale bar with correct units",
      "source": {
        "page": 57,
        "anchor": "Adding a Scale-bar",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.085565,
          0.209939,
          0.271583,
          0.22533
        ],
        "printed_page": 57
      },
      "target": {
        "page": 804,
        "anchor": "18.2.6 The Scale Bar Item",
        "related_pages": [
          805,
          806
        ],
        "figures": [
          {
            "page": 804,
            "label": "Fig. 18.35:",
            "bbox": [
              0.513446,
              0.19548,
              0.590716,
              0.207314
            ],
            "printed_page": 790,
            "caption": "Fig. 18.35: Scale Bar Item Properties Panel"
          },
          {
            "page": 804,
            "label": "Fig. 18.36:",
            "bbox": [
              0.802948,
              0.555676,
              0.87904,
              0.567509
            ],
            "printed_page": 790,
            "caption": "Fig. 18.36: Scale Bar Main properties group"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.085996,
          0.366067,
          0.100196
        ],
        "printed_page": 790
      },
      "relationship": "equivalent",
      "note": "Choose the linked map and units. Renaming the unit label alone does not convert distances.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "scale",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "layout-map-p58",
      "group": "Lesson 8",
      "title": "Add the map to the layout",
      "source": {
        "page": 58,
        "anchor": "Adding Multiple Maps",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.085565,
          0.063271,
          0.304022,
          0.078663
        ],
        "printed_page": 58
      },
      "target": {
        "page": 781,
        "anchor": "18.2.2 The Map Item",
        "related_pages": [
          782,
          783
        ],
        "figures": [
          {
            "page": 782,
            "label": "Fig. 18.14:",
            "bbox": [
              0.373108,
              0.503087,
              0.444805,
              0.514921
            ],
            "printed_page": 768,
            "caption": "Fig. 18.14: Map Item Properties Panel"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.44303,
          0.31614,
          0.457231
        ],
        "printed_page": 767
      },
      "relationship": "equivalent",
      "note": "Add Map and configure Item Properties. Preserve the visible course layers.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "layout-map",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "layout-move-content-p58",
      "operation_id": "layout-move-content",
      "title": "Pan the map inside a layout item",
      "target": {
        "page": 785,
        "anchor": "Move item content",
        "figures": [
          {
            "page": 785,
            "label": "Fig. 18.17:",
            "bbox": [
              0.398507,
              0.213584,
              0.470187,
              0.225417
            ],
            "printed_page": 771,
            "caption": "Fig. 18.17: Map Extents group"
          }
        ],
        "related_pages": [
          781,
          782
        ],
        "document": "new",
        "bbox": [
          0.453719,
          0.359292,
          0.540447,
          0.367575
        ],
        "printed_page": 771
      },
      "relationship": "equivalent",
      "note": "Move item content pans the map within its frame. Select/Move item moves the frame itself; these are separate operations.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 8",
      "source": {
        "page": 58,
        "anchor": "Move Item Content",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.405359,
          0.504571,
          0.578128,
          0.518252
        ],
        "printed_page": 58
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "layout-scale-p58",
      "operation_id": "layout-scale",
      "title": "Set a layout map scale",
      "target": {
        "page": 783,
        "anchor": "Main properties",
        "figures": [
          {
            "page": 782,
            "label": "Fig. 18.14:",
            "bbox": [
              0.373108,
              0.503087,
              0.444805,
              0.514921
            ],
            "printed_page": 768,
            "caption": "Fig. 18.14: Map Item Properties Panel"
          }
        ],
        "related_pages": [
          784,
          785
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.773746,
          0.246271,
          0.785579
        ],
        "printed_page": 769
      },
      "relationship": "equivalent",
      "note": "Set the map item Scale. A smaller scale denominator zooms in; this changes map content, not the paper size.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 8",
      "source": {
        "page": 58,
        "anchor": "find the Scale",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.478475,
          0.818399,
          0.597515,
          0.832121
        ],
        "printed_page": 58
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "export-pdf",
      "group": "Lesson 8",
      "title": "Export the layout as PDF",
      "source": {
        "page": 59,
        "anchor": "PDF",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.568214,
          0.915035,
          0.600849,
          0.929286
        ],
        "printed_page": 59
      },
      "target": {
        "page": 832,
        "anchor": "18.3.4 Export as PDF",
        "related_pages": [
          833,
          834
        ],
        "figures": [
          {
            "page": 833,
            "label": "Fig. 18.72:",
            "bbox": [
              0.393126,
              0.721835,
              0.464806,
              0.733669
            ],
            "printed_page": 819,
            "caption": "Fig. 18.72: PDF Export Options"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.660819,
          0.321985,
          0.675019
        ],
        "printed_page": 818
      },
      "relationship": "equivalent",
      "note": "PDF export is covered here. This mapping does not claim to cover JPEG export; review rasterisation and export options separately.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "export-pdf",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "layout-image-p59",
      "operation_id": "layout-image",
      "title": "Export the layout as JPG or another image",
      "target": {
        "page": 830,
        "anchor": "18.3.2 Export as Image",
        "figures": [
          {
            "page": 831,
            "label": "Fig. 18.70:",
            "bbox": [
              0.38833,
              0.34915,
              0.460027,
              0.360984
            ],
            "printed_page": 817,
            "caption": "Fig. 18.70: Image Export Options"
          }
        ],
        "related_pages": [
          831
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.323408,
          0.3401,
          0.337608
        ],
        "printed_page": 816
      },
      "relationship": "equivalent",
      "note": "Export as Image supports JPG/JPEG and other listed formats. Export as PDF is a separate output command.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 8",
      "source": {
        "page": 59,
        "anchor": "export to JPG",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.452349,
          0.915035,
          0.563563,
          0.929286
        ],
        "printed_page": 59
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "layout-map-p59",
      "group": "Lesson 8",
      "title": "Add the map to the layout",
      "source": {
        "page": 59,
        "anchor": "Add New Map",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.758977,
          0.400355,
          0.893613,
          0.414036
        ],
        "printed_page": 59
      },
      "target": {
        "page": 781,
        "anchor": "18.2.2 The Map Item",
        "related_pages": [
          782,
          783
        ],
        "figures": [
          {
            "page": 782,
            "label": "Fig. 18.14:",
            "bbox": [
              0.373108,
              0.503087,
              0.444805,
              0.514921
            ],
            "printed_page": 768,
            "caption": "Fig. 18.14: Map Item Properties Panel"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.44303,
          0.31614,
          0.457231
        ],
        "printed_page": 767
      },
      "relationship": "equivalent",
      "note": "Add Map and configure Item Properties. Preserve the visible course layers.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "layout-map",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "layout-title-p59",
      "group": "Lesson 8",
      "title": "Add a map title",
      "source": {
        "page": 59,
        "anchor": "add title",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.338698,
          0.46819,
          0.406344,
          0.481871
        ],
        "printed_page": 59
      },
      "target": {
        "page": 792,
        "anchor": "18.2.4 The Label Item",
        "related_pages": [
          793
        ],
        "figures": [
          {
            "page": 792,
            "label": "Fig. 18.24:",
            "bbox": [
              0.634397,
              0.215166,
              0.711667,
              0.226999
            ],
            "printed_page": 778,
            "caption": "Fig. 18.24: Label Item Properties Panel"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.119869,
          0.327829,
          0.13407
        ],
        "printed_page": 778
      },
      "relationship": "equivalent",
      "note": "Use a layout Label item for the title. This is different from labels attached to map features.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "layout-title",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "lock-layers",
      "group": "Lesson 8",
      "title": "Lock layers in an inset map",
      "source": {
        "page": 59,
        "anchor": "lock layers",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.146004,
          0.081356,
          0.867639,
          0.112447
        ],
        "printed_page": 59
      },
      "target": {
        "page": 784,
        "anchor": "Layers",
        "related_pages": [],
        "figures": [
          {
            "page": 784,
            "label": "Fig. 18.16:",
            "bbox": [
              0.401092,
              0.370886,
              0.472772,
              0.382719
            ],
            "printed_page": 770,
            "caption": "Fig. 18.16: Map Layers group"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.159844,
          0.174356,
          0.171677
        ],
        "printed_page": 770
      },
      "relationship": "equivalent",
      "note": "Lock layers and, if required, Lock styles for layers. This controls the individual layout map item.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "lock-layers",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "north-p59",
      "group": "Lesson 8",
      "title": "Add a north arrow",
      "source": {
        "page": 59,
        "anchor": "North arrow",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.495193,
          0.46819,
          0.596276,
          0.481871
        ],
        "printed_page": 59
      },
      "target": {
        "page": 819,
        "anchor": "The North Arrow Item",
        "related_pages": [
          820
        ],
        "figures": [
          {
            "page": 819,
            "label": "Fig. 18.55:",
            "bbox": [
              0.263053,
              0.859297,
              0.33475,
              0.871131
            ],
            "printed_page": 805,
            "caption": "Fig. 18.55: North arrows available for selection in provided SVG library"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.262503,
          0.291625,
          0.274337
        ],
        "printed_page": 805
      },
      "relationship": "changed",
      "note": "The dedicated Add North Arrow item is a modern counterpart to selecting a north-arrow image.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "north",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "overview",
      "group": "Lesson 8",
      "title": "Show a map overview frame",
      "source": {
        "page": 59,
        "anchor": "Overview",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.536043,
          0.382968,
          0.612174,
          0.396649
        ],
        "printed_page": 59
      },
      "target": {
        "page": 790,
        "anchor": "To create an overview",
        "related_pages": [],
        "figures": [
          {
            "page": 790,
            "label": "Fig. 18.22:",
            "bbox": [
              0.388338,
              0.366254,
              0.460035,
              0.378088
            ],
            "printed_page": 776,
            "caption": "Fig. 18.22: Map Overviews group"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.402942,
          0.27104,
          0.414776
        ],
        "printed_page": 776
      },
      "relationship": "equivalent",
      "note": "Add an overview to the overview map and link its Map frame to the main map item.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "overview",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "scale-p59",
      "group": "Lesson 8",
      "title": "Add a scale bar with correct units",
      "source": {
        "page": 59,
        "anchor": "scale bar",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.411678,
          0.46819,
          0.489762,
          0.481871
        ],
        "printed_page": 59
      },
      "target": {
        "page": 804,
        "anchor": "18.2.6 The Scale Bar Item",
        "related_pages": [
          805,
          806
        ],
        "figures": [
          {
            "page": 804,
            "label": "Fig. 18.35:",
            "bbox": [
              0.513446,
              0.19548,
              0.590716,
              0.207314
            ],
            "printed_page": 790,
            "caption": "Fig. 18.35: Scale Bar Item Properties Panel"
          },
          {
            "page": 804,
            "label": "Fig. 18.36:",
            "bbox": [
              0.802948,
              0.555676,
              0.87904,
              0.567509
            ],
            "printed_page": 790,
            "caption": "Fig. 18.36: Scale Bar Main properties group"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.085996,
          0.366067,
          0.100196
        ],
        "printed_page": 790
      },
      "relationship": "equivalent",
      "note": "Choose the linked map and units. Renaming the unit label alone does not convert distances.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "scale",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "csv-points-p63",
      "group": "Lesson 9",
      "title": "Create points from X/Y coordinates",
      "source": {
        "page": 63,
        "anchor": "display your GPS points",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.146004,
          0.25757,
          0.914241,
          0.288495
        ],
        "printed_page": 63
      },
      "target": {
        "page": 445,
        "anchor": "Importing a delimited text file",
        "related_pages": [
          446,
          447
        ],
        "figures": [
          {
            "page": 446,
            "label": "Fig. 11.9:",
            "bbox": [
              0.391703,
              0.446802,
              0.455015,
              0.458635
            ],
            "printed_page": 432,
            "caption": "Fig. 11.9: Delimited Text Dialog"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.737885,
          0.35164,
          0.749719
        ],
        "printed_page": 431
      },
      "relationship": "equivalent",
      "note": "Configure delimiter, Point coordinates, X/Y fields and the input geometry CRS. Keep the course dataset.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "csv-points",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "gps-table",
      "group": "Lesson 9",
      "title": "Import recorded GPS coordinates",
      "source": {
        "page": 64,
        "anchor": "Opening your data file",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.085565,
          0.243433,
          0.276961,
          0.257684
        ],
        "printed_page": 64
      },
      "target": {
        "page": 445,
        "anchor": "Importing a delimited text file",
        "related_pages": [
          446,
          447
        ],
        "figures": [
          {
            "page": 446,
            "label": "Fig. 11.9:",
            "bbox": [
              0.391703,
              0.446802,
              0.455015,
              0.458635
            ],
            "printed_page": 432,
            "caption": "Fig. 11.9: Delimited Text Dialog"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.737885,
          0.35164,
          0.749719
        ],
        "printed_page": 431
      },
      "relationship": "equivalent",
      "note": "Set X=longitude, Y=latitude, optional Z=altitude, and the actual input CRS. Spreadsheet entry is external to QGIS.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "gps-table",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "crs-selector-p65",
      "operation_id": "crs-selector",
      "title": "Choose the input coordinate reference system",
      "target": {
        "page": 131,
        "anchor": "6.4 Coordinate Reference System Selector",
        "figures": [
          {
            "page": 131,
            "label": "Fig. 6.3:",
            "bbox": [
              0.425492,
              0.463832,
              0.480453,
              0.475666
            ],
            "printed_page": 117,
            "caption": "Fig. 6.3: CRS Selector"
          }
        ],
        "related_pages": [
          127,
          128
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.0868,
          0.609409,
          0.10384
        ],
        "printed_page": 117
      },
      "relationship": "equivalent",
      "note": "Choose the CRS describing the existing coordinates. WGS84 longitude/latitude is appropriate only for that input; assigning a CRS is not reprojection.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 9",
      "source": {
        "page": 65,
        "anchor": "Coordinate reference system",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.169552,
          0.281939,
          0.890958,
          0.313007
        ],
        "printed_page": 65
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "gps-save",
      "group": "Lesson 9",
      "title": "Save imported GPS points as a shapefile",
      "source": {
        "page": 65,
        "anchor": "Saving your data as a Shapefile",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.10916,
          0.660337,
          0.353265,
          0.674588
        ],
        "printed_page": 65
      },
      "target": {
        "page": 479,
        "anchor": "11.2.2 Creating new layers",
        "related_pages": [
          480,
          481,
          482
        ],
        "figures": [
          {
            "page": 482,
            "label": "Fig. 11.32:",
            "bbox": [
              0.3689,
              0.674763,
              0.440581,
              0.686596
            ],
            "printed_page": 468,
            "caption": "Fig. 11.32: Saving as a new vector layer"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.085996,
          0.373378,
          0.100196
        ],
        "printed_page": 465
      },
      "relationship": "equivalent",
      "note": "Use vector export. Saving a project does not replace exporting the underlying point dataset. Fig. 11.32 illustrates the vector export dialog with a different default format; choose the format required here.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "gps-save",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "gps-table-p65",
      "group": "Lesson 9",
      "title": "Import recorded GPS coordinates",
      "source": {
        "page": 65,
        "anchor": "Mapping out your GPS data",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.10916,
          0.114745,
          0.349285,
          0.128996
        ],
        "printed_page": 65
      },
      "target": {
        "page": 445,
        "anchor": "Importing a delimited text file",
        "related_pages": [
          446,
          447
        ],
        "figures": [
          {
            "page": 446,
            "label": "Fig. 11.9:",
            "bbox": [
              0.391703,
              0.446802,
              0.455015,
              0.458635
            ],
            "printed_page": 432,
            "caption": "Fig. 11.9: Delimited Text Dialog"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.737885,
          0.35164,
          0.749719
        ],
        "printed_page": 431
      },
      "relationship": "equivalent",
      "note": "Set X=longitude, Y=latitude, optional Z=altitude, and the actual input CRS. Spreadsheet entry is external to QGIS.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "gps-table",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "project-save-p65",
      "operation_id": "project-save",
      "title": "Save the QGIS project",
      "target": {
        "page": 27,
        "anchor": "2.1 Introducing QGIS projects",
        "figures": [],
        "related_pages": [
          28,
          29
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.274245,
          0.463436,
          0.291285
        ],
        "printed_page": 13
      },
      "relationship": "equivalent",
      "note": "Project Save / Save As stores the session. Exporting a layer and saving pending edits are separate operations.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 9",
      "source": {
        "page": 65,
        "anchor": "save your work",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.374757,
          0.840535,
          0.52308,
          0.854786
        ],
        "printed_page": 65
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "categorized-p66",
      "operation_id": "categorized",
      "title": "Give each GPS pass a different symbol",
      "target": {
        "page": 515,
        "anchor": "Categorized Renderer",
        "figures": [
          {
            "page": 516,
            "label": "Fig. 12.4:",
            "bbox": [
              0.356935,
              0.309249,
              0.420247,
              0.321083
            ],
            "printed_page": 502,
            "caption": "Fig. 12.4: Categorized Symbolizing options"
          }
        ],
        "related_pages": [
          516,
          517
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.640117,
          0.294755,
          0.65195
        ],
        "printed_page": 501
      },
      "relationship": "equivalent",
      "note": "Use Categorized with the Pass field for discrete pass groups. This is a documented way to meet the exercise, whose wording does not prescribe a renderer. It is not Graduated numeric classification.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 9",
      "source": {
        "page": 66,
        "anchor": "colours and/or symbols",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.169552,
          0.269256,
          0.384702,
          0.283507
        ],
        "printed_page": 66
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "kml-p66",
      "group": "Lesson 9",
      "title": "Export GPS points to KML",
      "source": {
        "page": 66,
        "anchor": "Keyhole Markup Language as a format",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.25713,
          0.688725,
          0.585662,
          0.702976
        ],
        "printed_page": 66
      },
      "target": {
        "page": 480,
        "anchor": "Vector specific parameters",
        "related_pages": [
          479,
          481,
          482
        ],
        "figures": [
          {
            "page": 482,
            "label": "Fig. 11.32:",
            "bbox": [
              0.3689,
              0.674763,
              0.440581,
              0.686596
            ],
            "printed_page": 468,
            "caption": "Fig. 11.32: Saving as a new vector layer"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.545603,
          0.33303,
          0.557437
        ],
        "printed_page": 466
      },
      "relationship": "partial",
      "note": "Export the GPS point layer as KML with WGS84 output as specified. The subsequent Google Earth launch/navigation and external-plugin claims are outside this guide.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "kml",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "label-font-p66",
      "operation_id": "label-font",
      "title": "Set feature-label font and size",
      "target": {
        "page": 411,
        "anchor": "Text tab",
        "figures": [
          {
            "page": 411,
            "label": "Fig. 10.25:",
            "bbox": [
              0.379033,
              0.686321,
              0.45073,
              0.698155
            ],
            "printed_page": 397,
            "caption": "Fig. 10.25: Labels settings - Text tab"
          }
        ],
        "related_pages": [
          412
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.178575,
          0.185352,
          0.190409
        ],
        "printed_page": 397
      },
      "relationship": "equivalent",
      "note": "Use the labeling Text tab to set font and size, including the size unit. This styles feature labels rather than a print-layout title.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 9",
      "source": {
        "page": 66,
        "anchor": "font",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.36167,
          0.374179,
          0.39642,
          0.38843
        ],
        "printed_page": 66
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "labels-p66",
      "group": "Lesson 9",
      "title": "Label features using Pass",
      "source": {
        "page": 66,
        "anchor": "label your points",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.19492,
          0.340689,
          0.347235,
          0.35494
        ],
        "printed_page": 66
      },
      "target": {
        "page": 537,
        "anchor": "Single labels",
        "related_pages": [],
        "figures": [
          {
            "page": 537,
            "label": "Fig. 12.25:",
            "bbox": [
              0.339528,
              0.761899,
              0.411225,
              0.773732
            ],
            "printed_page": 523,
            "caption": "Fig. 12.25: Layer labeling settings - Single labels"
          }
        ],
        "document": "new",
        "bbox": [
          0.192079,
          0.115106,
          0.276128,
          0.12694
        ],
        "printed_page": 523
      },
      "relationship": "equivalent",
      "note": "Use Single labels with Pass. Keep the course layer and choose the appropriate font. The official guide uses different sample data.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "labels",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "measure-p66",
      "operation_id": "measure",
      "title": "Measure distances between GPS passes",
      "target": {
        "page": 156,
        "anchor": "7.1.8 Measuring",
        "figures": [
          {
            "page": 157,
            "label": "Fig. 7.14:",
            "bbox": [
              0.40654,
              0.729213,
              0.469852,
              0.741046
            ],
            "printed_page": 143,
            "caption": "Fig. 7.14: Measure Distance"
          }
        ],
        "related_pages": [
          157,
          158
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.466252,
          0.275472,
          0.480452
        ],
        "printed_page": 142
      },
      "relationship": "partial",
      "note": "Interactive measurement helps assess separation. This is guidance for the exercise question, not an automatic matching/accuracy analysis of two GPS passes. Verify CRS, ellipsoid and measurement units.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "group": "Lesson 9",
      "source": {
        "page": 66,
        "anchor": "assess apparent distances",
        "kind": "text",
        "document": "old",
        "bbox": [
          0.588803,
          0.443725,
          0.811895,
          0.457976
        ],
        "printed_page": 66
      },
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    },
    {
      "id": "kml-screenshot-p67",
      "group": "Lesson 9",
      "title": "Export GPS points to KML",
      "source": {
        "page": 67,
        "anchor": "KML export dialog (continuation from page 66)",
        "kind": "screenshot",
        "document": "old",
        "bbox": [
          0.159,
          0.118,
          0.465,
          0.41
        ],
        "printed_page": 67
      },
      "target": {
        "page": 480,
        "anchor": "Vector specific parameters",
        "related_pages": [
          479,
          481,
          482
        ],
        "figures": [
          {
            "page": 482,
            "label": "Fig. 11.32:",
            "bbox": [
              0.3689,
              0.674763,
              0.440581,
              0.686596
            ],
            "printed_page": 468,
            "caption": "Fig. 11.32: Saving as a new vector layer"
          }
        ],
        "document": "new",
        "bbox": [
          0.120951,
          0.545603,
          0.33303,
          0.557437
        ],
        "printed_page": 466
      },
      "relationship": "partial",
      "note": "This is the QGIS vector-to-KML export dialog continuing from the preceding page. Google Earth actions elsewhere on this page are outside the QGIS reference. Choose KML and the appropriate output CRS.",
      "review_status": "documentation_checked",
      "workflow_tested": false,
      "operation_id": "kml",
      "evidence": {
        "method": "Explicit semantic curation; source text-anchor validation or manually reviewed screenshot region; destination text-anchor, figure-caption and printed-page validation",
        "checked_on": "2026-10-13",
        "limits": "Checked against the supplied PDFs; QGIS operations and course datasets were not executed."
      }
    }
  ],
  "unmapped": [
    {
      "pages": [
        1
      ],
      "reason": "Cover illustration, not an instruction."
    },
    {
      "pages": [
        2
      ],
      "reason": "Copyright and credits; no software operation."
    },
    {
      "pages": [
        3
      ],
      "reason": "Scope and Tutorials folder requirements; the exercise datasets are missing."
    },
    {
      "pages": [
        4
      ],
      "reason": "Contents index; use the operation links on the actual lesson pages."
    },
    {
      "pages": [
        5
      ],
      "reason": "Contents continuation; no separate operation mapping."
    },
    {
      "pages": [
        6
      ],
      "reason": "Public-health history/interpretation retained as course content."
    },
    {
      "pages": [
        7
      ],
      "reason": "GPS background and accuracy claims are not validated by this QGIS guide."
    },
    {
      "pages": [
        8
      ],
      "reason": "Foundational vector/raster examples, not a dialog workflow."
    },
    {
      "pages": [
        9
      ],
      "reason": "Software rationale/platform claims retained as historical course text."
    },
    {
      "pages": [
        20
      ],
      "reason": "Administrative table only; no QGIS command to map."
    },
    {
      "pages": [
        25
      ],
      "reason": "Administrative code table only; neither the codes nor boundaries are certified by this guide."
    },
    {
      "pages": [
        60
      ],
      "reason": "GPS receiver setup, subscriptions, datum examples and external websites are outside this desktop guide."
    },
    {
      "pages": [
        61
      ],
      "reason": "Hardware DOP/data dictionaries and field visibility are external to the mapped desktop operations."
    },
    {
      "pages": [
        62
      ],
      "reason": "Field collection and paper comparison have no direct desktop-tool equivalent."
    },
    {
      "pages": [
        68
      ],
      "reason": "Google Earth coordinate display and 3D View options are external; no false QGIS equivalent."
    },
    {
      "pages": [
        69
      ],
      "reason": "ArcMap/Google Earth precision exercise and local field-location map have no direct prescribed QGIS operation."
    },
    {
      "pages": [
        70
      ],
      "reason": "GPS recording forms only."
    },
    {
      "pages": [
        71
      ],
      "reason": "Back-cover art only."
    }
  ],
  "page_audit": [
    {
      "page": 1,
      "title": "Cover",
      "mapping_ids": [],
      "notes": [
        "Cover illustration, not an instruction."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "no_direct_operation"
    },
    {
      "page": 2,
      "title": "Editors and copyright",
      "mapping_ids": [],
      "notes": [
        "Copyright and credits; no software operation."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "no_direct_operation"
    },
    {
      "page": 3,
      "title": "Scope and supplied exercise data",
      "mapping_ids": [],
      "notes": [
        "Scope and Tutorials folder requirements; the exercise datasets are missing."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "no_direct_operation"
    },
    {
      "page": 4,
      "title": "Contents",
      "mapping_ids": [],
      "notes": [
        "Contents index; use the operation links on the actual lesson pages."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "no_direct_operation"
    },
    {
      "page": 5,
      "title": "Contents continued",
      "mapping_ids": [],
      "notes": [
        "Contents continuation; no separate operation mapping."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "no_direct_operation"
    },
    {
      "page": 6,
      "title": "Public health mapping and GIS",
      "mapping_ids": [],
      "notes": [
        "Public-health history/interpretation retained as course content."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "no_direct_operation"
    },
    {
      "page": 7,
      "title": "GPS and GIS foundations",
      "mapping_ids": [],
      "notes": [
        "GPS background and accuracy claims are not validated by this QGIS guide."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "no_direct_operation"
    },
    {
      "page": 8,
      "title": "Vector/raster concepts and software types",
      "mapping_ids": [],
      "notes": [
        "Foundational vector/raster examples, not a dialog workflow."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "no_direct_operation"
    },
    {
      "page": 9,
      "title": "Why QGIS",
      "mapping_ids": [],
      "notes": [
        "Software rationale/platform claims retained as historical course text."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "no_direct_operation"
    },
    {
      "page": 10,
      "title": "QGIS interface and toolbar visibility",
      "mapping_ids": [
        "interface",
        "toolbars-p10"
      ],
      "notes": [
        "QGIS instructions and screenshot context linked; course data and results remain local."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "mapped_with_scope_notes"
    },
    {
      "page": 11,
      "title": "Load the first vector layer",
      "mapping_ids": [
        "load-vector"
      ],
      "notes": [
        "QGIS instructions and screenshot context linked; course data and results remain local."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "mapped_with_scope_notes"
    },
    {
      "page": 12,
      "title": "District labels and label buffers",
      "mapping_ids": [
        "label-buffer",
        "label-case-p12",
        "labels"
      ],
      "notes": [
        "QGIS instructions and screenshot context linked; course data and results remain local."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "mapped_with_scope_notes"
    },
    {
      "page": 13,
      "title": "Anemia data and loading a shapefile",
      "mapping_ids": [
        "load-vector-p13"
      ],
      "notes": [
        "Anemia data and tutorial file paths are local course content."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "mapped_with_scope_notes"
    },
    {
      "page": 14,
      "title": "View/edit attributes, add a field, load another shapefile",
      "mapping_ids": [
        "attribute-table-p14",
        "edit-values-p14",
        "fields-p14",
        "load-vector-p14",
        "toggle-edit-p14"
      ],
      "notes": [
        "Practical A edits attributes; Practical B loads a new layer. Separate occurrences are linked."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "mapped_with_scope_notes"
    },
    {
      "page": 15,
      "title": "CSV table import and attribute-key join",
      "mapping_ids": [
        "join",
        "table"
      ],
      "notes": [
        "CSV contains attributes only; select No geometry. Key types/values must match."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "mapped_with_scope_notes"
    },
    {
      "page": 16,
      "title": "Join results and graduated classification",
      "mapping_ids": [
        "attribute-table-p16",
        "choropleth",
        "join-p16",
        "load-vector-p16"
      ],
      "notes": [
        "QGIS instructions and screenshot context linked; course data and results remain local."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "mapped_with_scope_notes"
    },
    {
      "page": 17,
      "title": "Choropleth result and colour changes",
      "mapping_ids": [
        "choropleth-p17"
      ],
      "notes": [
        "QGIS instructions and screenshot context linked; course data and results remain local."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "mapped_with_scope_notes"
    },
    {
      "page": 18,
      "title": "Load/select/copy district features",
      "mapping_ids": [
        "attribute-table-p18",
        "copy-p18",
        "identify-p18",
        "load-vector-p18",
        "select",
        "table-select-p18"
      ],
      "notes": [
        "Course wording incorrectly conflates Identify with selection; current selection and row-selection references are separate from identification."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "mapped_with_scope_notes"
    },
    {
      "page": 19,
      "title": "Visibility, zoom, labels, map-image and vector export",
      "mapping_ids": [
        "canvas-export-p19",
        "labels-p19",
        "layer-panel-p19",
        "save-selected",
        "zoom-layer-p19"
      ],
      "notes": [
        "The Galle temporary layer can be exported as a whole. When exporting directly from DSD, export selected features only. Image export is separate."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "mapped_with_scope_notes"
    },
    {
      "page": 20,
      "title": "Administrative GN/PHM/PHI data",
      "mapping_ids": [],
      "notes": [
        "Administrative table only; no QGIS command to map."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "no_direct_operation"
    },
    {
      "page": 21,
      "title": "Administrative data continued and GN selection",
      "mapping_ids": [
        "attribute-table-p21",
        "load-vector-p21",
        "table-select-p21"
      ],
      "notes": [
        "Administrative table is retained; QGIS loading/table/selection instructions below it are mapped."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "mapped_with_scope_notes"
    },
    {
      "page": 22,
      "title": "Copy selection and load the MOH layer",
      "mapping_ids": [
        "copy",
        "load-vector-p22"
      ],
      "notes": [
        "QGIS instructions and screenshot context linked; course data and results remain local."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "mapped_with_scope_notes"
    },
    {
      "page": 23,
      "title": "Labels, fields, editing and layer duplication",
      "mapping_ids": [
        "attribute-table-p23",
        "duplicate-p23",
        "fields",
        "labels-p23",
        "toggle-edit-p23"
      ],
      "notes": [
        "Duplicate Layer is not a dataset backup. The course says four fields but lists only two in text; rely on exercise requirements, not inferred fields."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "mapped_with_scope_notes"
    },
    {
      "page": 24,
      "title": "Entering administrative codes",
      "mapping_ids": [
        "edit-values"
      ],
      "notes": [
        "QGIS instructions and screenshot context linked; course data and results remain local."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "mapped_with_scope_notes"
    },
    {
      "page": 25,
      "title": "Administrative code lookup table",
      "mapping_ids": [],
      "notes": [
        "Administrative code table only; neither the codes nor boundaries are certified by this guide."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "no_direct_operation"
    },
    {
      "page": 26,
      "title": "Dissolve by PHI code",
      "mapping_ids": [
        "dissolve"
      ],
      "notes": [
        "QGIS instructions and screenshot context linked; course data and results remain local."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "mapped_with_scope_notes"
    },
    {
      "page": 27,
      "title": "Labels/buffers and optional low-birth-weight exercise",
      "mapping_ids": [
        "label-buffer-p27",
        "labels-p27"
      ],
      "notes": [
        "Optional LBW data/exercise lacks an explicit tool sequence; no automatic choice of renderer or health thresholds is asserted."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "mapped_with_scope_notes"
    },
    {
      "page": 28,
      "title": "District layer and delimited coordinate import",
      "mapping_ids": [
        "csv-points",
        "load-vector-p28"
      ],
      "notes": [
        "Course says projected coordinates; verify the actual input CRS before accepting WGS84 later."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "mapped_with_scope_notes"
    },
    {
      "page": 29,
      "title": "Import dialog and input CRS selection",
      "mapping_ids": [
        "crs-selector-p29",
        "csv-points-p29"
      ],
      "notes": [
        "WGS84 selection may conflict with the preceding projected-coordinate description. Actual coordinate data must determine CRS; datasets were not supplied."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "mapped_with_scope_notes"
    },
    {
      "page": 30,
      "title": "Point import/export, remove layer, attributes and symbology",
      "mapping_ids": [
        "attribute-table-p30",
        "csv-points-p30",
        "gps-save-p30",
        "load-vector-p30",
        "project-save-p30",
        "remove-layer-p30",
        "single-symbol-p30"
      ],
      "notes": [
        "School_Health input columns and geometry must be checked. Importing a table without coordinates does not automatically create points."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "mapped_with_scope_notes"
    },
    {
      "page": 31,
      "title": "Graduated point symbols",
      "mapping_ids": [
        "point-graduated",
        "project-save-p31"
      ],
      "notes": [
        "Official graduated figure uses a line example; configure Size for the point exercise."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "mapped_with_scope_notes"
    },
    {
      "page": 32,
      "title": "Province layers, labels/fields and spatial aggregation",
      "mapping_ids": [
        "fields-p32",
        "labels-p32",
        "load-vector-p32",
        "spatial-summary"
      ],
      "notes": [
        "Administrative names remain local. Summary aggregation is not an ordinary attribute-key join."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "mapped_with_scope_notes"
    },
    {
      "page": 33,
      "title": "Spatial-summary dialog, table and choropleth",
      "mapping_ids": [
        "attribute-table-p33",
        "choropleth-p33",
        "layer-panel-p33",
        "project-save-p33",
        "spatial-summary-p33"
      ],
      "notes": [
        "The course STH thresholds and health interpretation are not independently validated; unweighted means need instructor review."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "mapped_with_scope_notes"
    },
    {
      "page": 34,
      "title": "CRS theory and Natural Earth download",
      "mapping_ids": [
        "crs-theory-p34"
      ],
      "notes": [
        "CRS concepts are covered by projection guidance; Natural Earth browser/download steps are external, not QGIS. Historical default-CRS claims need review."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "mapped_with_scope_notes"
    },
    {
      "page": 35,
      "title": "Natural Earth download and ZIP layer import",
      "mapping_ids": [
        "archive-vector-p35",
        "load-vector-p35"
      ],
      "notes": [
        "Natural Earth download/save dialog is external. The QGIS vector/ZIP import below it is mapped."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "mapped_with_scope_notes"
    },
    {
      "page": 36,
      "title": "CRS information, load/zoom a district layer",
      "mapping_ids": [
        "layer-crs",
        "load-vector-p36",
        "zoom-layer-p36"
      ],
      "notes": [
        "QGIS instructions and screenshot context linked; course data and results remain local."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "mapped_with_scope_notes"
    },
    {
      "page": 37,
      "title": "CRS comparison, layer order and project reprojection",
      "mapping_ids": [
        "crs-info-p37",
        "layer-panel-p37",
        "load-vector-p37",
        "project-crs",
        "zoom-layer-p37"
      ],
      "notes": [
        "QGIS instructions and screenshot context linked; course data and results remain local."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "mapped_with_scope_notes"
    },
    {
      "page": 38,
      "title": "Disable-OTF exercise, layout and local CRS assignment",
      "mapping_ids": [
        "assign-crs-p38",
        "disable-otf",
        "layout-p38",
        "legend-p38",
        "load-vector-p38",
        "north-p38",
        "project-new-p38",
        "project-save-p38",
        "scale-p38"
      ],
      "notes": [
        "The course declares metre units, but the datum name alone does not establish those units. Check the full layer/project CRS and its units against the actual dataset. No CRS is a partial counterpart to disabling OTF."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "mapped_with_scope_notes"
    },
    {
      "page": 39,
      "title": "Layer/CRS exercise and buffer preparation",
      "mapping_ids": [
        "canvas-background-p39",
        "labels-p39",
        "layer-panel-p39",
        "load-vector-p39",
        "load-vector-p39-2",
        "load-vector-p39-3",
        "zoom-layer-p39"
      ],
      "notes": [
        "Historical OTF-disabled and unit assumptions require review. DIVA-GIS downloads, hypothetical dengue model and local data are not certified."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "mapped_with_scope_notes"
    },
    {
      "page": 40,
      "title": "Dengue layer and buffer tool",
      "mapping_ids": [
        "buffer",
        "load-vector-p40"
      ],
      "notes": [
        "The 100-metre mosquito-risk assumption is course content, not QGIS guidance. Use an appropriate metric CRS."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "mapped_with_scope_notes"
    },
    {
      "page": 41,
      "title": "100-unit buffer, layer order and dissolve",
      "mapping_ids": [
        "buffer-p41",
        "dissolve-boundaries",
        "layer-panel-p41"
      ],
      "notes": [
        "Buffer units come from the processing/input CRS; 100 is not automatically metres. Dissolve applies separately to the administrative layer."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "mapped_with_scope_notes"
    },
    {
      "page": 42,
      "title": "Layer order and KML export",
      "mapping_ids": [
        "kml",
        "layer-panel-p42"
      ],
      "notes": [
        "QGIS instructions and screenshot context linked; course data and results remain local."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "mapped_with_scope_notes"
    },
    {
      "page": 43,
      "title": "KML export dialog and Google Earth",
      "mapping_ids": [
        "kml-screenshot-p43"
      ],
      "notes": [
        "KML export dialog is mapped; launching, navigating and interpreting Google Earth are external."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "mapped_with_scope_notes"
    },
    {
      "page": 44,
      "title": "Google Earth result and GPX waypoints",
      "mapping_ids": [
        "gpx"
      ],
      "notes": [
        "Google Earth screenshot at top is external; QGIS GPX waypoint loading below is mapped."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "mapped_with_scope_notes"
    },
    {
      "page": 45,
      "title": "Attribute table and external CSV preparation",
      "mapping_ids": [
        "attribute-table-p45"
      ],
      "notes": [
        "Spreadsheet-to-CSV preparation and clinic names are external/local. The QGIS attribute table is mapped."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "mapped_with_scope_notes"
    },
    {
      "page": 46,
      "title": "CSV import, clinic-key join and labels",
      "mapping_ids": [
        "attribute-table-p46",
        "clinic-join",
        "labels-p46",
        "table-p46"
      ],
      "notes": [
        "Confirm waypoint name versus GPS_No values and types; repeated key join/import/labels are now linked."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "mapped_with_scope_notes"
    },
    {
      "page": 47,
      "title": "NIHS layer, attributes, graduated population and density",
      "mapping_ids": [
        "attribute-table-p47",
        "choropleth-p47",
        "density-p47",
        "load-vector-p47",
        "zoom-layer-p47"
      ],
      "notes": [
        "Density explanation is associated with the calculator, but population numerator and SHAPE_Area units must be checked; guide does not certify the formula."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "mapped_with_scope_notes"
    },
    {
      "page": 48,
      "title": "Field calculator, edits, classification and GPX import",
      "mapping_ids": [
        "attribute-table-p48",
        "choropleth-p48",
        "density",
        "gpx-p48",
        "toggle-edit-p48"
      ],
      "notes": [
        "Field width/precision, edits and GPX repeat are covered; local healthcare conclusions are not certified."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "mapped_with_scope_notes"
    },
    {
      "page": 49,
      "title": "CSV import, join, rename and export clinics",
      "mapping_ids": [
        "clinic-join-p49",
        "export-clinics-p49",
        "rename-p49",
        "table-p49"
      ],
      "notes": [
        "QGIS instructions and screenshot context linked; course data and results remain local."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "mapped_with_scope_notes"
    },
    {
      "page": 50,
      "title": "Shapefile export and plugin manager",
      "mapping_ids": [
        "basemap",
        "export-clinics",
        "plugins-p50"
      ],
      "notes": [
        "Plugin manager is documented independently of OpenLayers; XYZ/OSM is an alternative, not a verified Google basemap replacement."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "mapped_with_scope_notes"
    },
    {
      "page": 51,
      "title": "Plugin installation and shapefile import",
      "mapping_ids": [
        "load-vector-p51",
        "plugins-p51"
      ],
      "notes": [
        "A reinstall command is documented; no claim that it fixes legacy OpenLayers compatibility."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "mapped_with_scope_notes"
    },
    {
      "page": 52,
      "title": "Basemap alternative, layer order and single symbol",
      "mapping_ids": [
        "basemap-p52",
        "layer-panel-p52",
        "single-symbol-p52"
      ],
      "notes": [
        "Google/OpenLayers sequence has no verified direct equivalent in this guide. XYZ/OSM is labelled alternative; layer order and styles are direct QGIS operations."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "mapped_with_scope_notes"
    },
    {
      "page": 53,
      "title": "Single-symbol and marker dialogs",
      "mapping_ids": [
        "marker",
        "single-symbol-p53"
      ],
      "notes": [
        "Single Symbol and Simple Marker are separate levels of the style dialog."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "mapped_with_scope_notes"
    },
    {
      "page": 54,
      "title": "Marker colour and outline",
      "mapping_ids": [
        "marker-p54"
      ],
      "notes": [
        "QGIS instructions and screenshot context linked; course data and results remain local."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "mapped_with_scope_notes"
    },
    {
      "page": 55,
      "title": "Layers, basemap, styles, layout and page/export/grid settings",
      "mapping_ids": [
        "basemap-p55",
        "layer-panel-p55",
        "layout",
        "layout-grid-p55",
        "layout-page-p55",
        "layout-raster-p55",
        "load-vector-p55",
        "single-symbol-p55"
      ],
      "notes": [
        "Legacy Google/OpenLayers remains an alternative mapping; layout, page orientation, raster export and grid snapping are separate instructions."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "mapped_with_scope_notes"
    },
    {
      "page": 56,
      "title": "Map/label/legend items and item manipulation",
      "mapping_ids": [
        "layout-map",
        "layout-raise-p56",
        "layout-resize-p56",
        "layout-title",
        "legend",
        "project-save-p56",
        "rename-p56"
      ],
      "notes": [
        "QGIS instructions and screenshot context linked; course data and results remain local."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "mapped_with_scope_notes"
    },
    {
      "page": 57,
      "title": "Legend, scale bar, north arrow and frame",
      "mapping_ids": [
        "layout-frame-p57",
        "layout-resize-p57",
        "legend-p57",
        "north",
        "project-save-p57",
        "scale"
      ],
      "notes": [
        "Changing a unit label alone does not convert scale-bar distances. Frame hiding is separate from selecting a north-arrow item."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "mapped_with_scope_notes"
    },
    {
      "page": 58,
      "title": "Multiple maps, pan content and scale",
      "mapping_ids": [
        "layout-map-p58",
        "layout-move-content-p58",
        "layout-scale-p58"
      ],
      "notes": [
        "Multiple layout map items are different from a multi-page layout or atlas. Content panning and scale each have a separate reference."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "mapped_with_scope_notes"
    },
    {
      "page": 59,
      "title": "Layer locking, second map, overview and exports",
      "mapping_ids": [
        "export-pdf",
        "layout-image-p59",
        "layout-map-p59",
        "layout-title-p59",
        "lock-layers",
        "north-p59",
        "overview",
        "scale-p59"
      ],
      "notes": [
        "Locking layers, linking an overview, and JPG/PDF export are separately mapped."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "mapped_with_scope_notes"
    },
    {
      "page": 60,
      "title": "GPS receiver configuration",
      "mapping_ids": [],
      "notes": [
        "GPS receiver setup, subscriptions, datum examples and external websites are outside this desktop guide."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "no_direct_operation"
    },
    {
      "page": 61,
      "title": "GPS logging, DOP and field collection",
      "mapping_ids": [],
      "notes": [
        "Hardware DOP/data dictionaries and field visibility are external to the mapped desktop operations."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "no_direct_operation"
    },
    {
      "page": 62,
      "title": "Collecting and comparing GPS positions",
      "mapping_ids": [],
      "notes": [
        "Field collection and paper comparison have no direct desktop-tool equivalent."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "no_direct_operation"
    },
    {
      "page": 63,
      "title": "Coordinate preparation and GIS import concept",
      "mapping_ids": [
        "csv-points-p63"
      ],
      "notes": [
        "Excel entry and coordinate precision remain external; the QGIS delimited import concept is linked."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "mapped_with_scope_notes"
    },
    {
      "page": 64,
      "title": "Delimited GPS coordinate import",
      "mapping_ids": [
        "gps-table"
      ],
      "notes": [
        "QGIS instructions and screenshot context linked; course data and results remain local."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "mapped_with_scope_notes"
    },
    {
      "page": 65,
      "title": "GPS input CRS, shapefile export and project save",
      "mapping_ids": [
        "crs-selector-p65",
        "gps-save",
        "gps-table-p65",
        "project-save-p65"
      ],
      "notes": [
        "Use the actual longitude/latitude CRS; project saving is separate from point export."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "mapped_with_scope_notes"
    },
    {
      "page": 66,
      "title": "Pass styles/labels/measurement, KML and Google Earth",
      "mapping_ids": [
        "categorized-p66",
        "kml-p66",
        "label-font-p66",
        "labels-p66",
        "measure-p66"
      ],
      "notes": [
        "Categorized Pass styling is guidance for the stated task, not a named old dialog. Measurement is a partial aid; Google Earth launch/navigation/plugin claims are external."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "mapped_with_scope_notes"
    },
    {
      "page": 67,
      "title": "KML dialog continuation and Google Earth exercises",
      "mapping_ids": [
        "kml-screenshot-p67"
      ],
      "notes": [
        "Top QGIS KML export screenshot continues page 66 and is mapped. Finding coordinates in Google Earth below it remains external."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "mapped_with_scope_notes"
    },
    {
      "page": 68,
      "title": "Google Earth coordinate display/settings",
      "mapping_ids": [],
      "notes": [
        "Google Earth coordinate display and 3D View options are external; no false QGIS equivalent."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "no_direct_operation"
    },
    {
      "page": 69,
      "title": "Precision exercise and field location map",
      "mapping_ids": [],
      "notes": [
        "ArcMap/Google Earth precision exercise and local field-location map have no direct prescribed QGIS operation."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "no_direct_operation"
    },
    {
      "page": 70,
      "title": "GPS recording forms",
      "mapping_ids": [],
      "notes": [
        "GPS recording forms only."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "no_direct_operation"
    },
    {
      "page": 71,
      "title": "Back cover",
      "mapping_ids": [],
      "notes": [
        "Back-cover art only."
      ],
      "review": "text_and_page_image_reviewed",
      "status": "no_direct_operation"
    }
  ],
  "schema_version": 2,
  "documents": {
    "old": {
      "id": "old",
      "filename": "GIS_Manual.pdf",
      "version": "Course / QGIS 2.10.1",
      "pages": 71,
      "bytes": 7668959,
      "sha256": "8c90d2f3c8c8685a1239d404c53883499761be3c197e003e6294f1ede9b9353b"
    },
    "new": {
      "id": "new",
      "filename": "QGIS-3.44-DesktopUserGuide-en.pdf",
      "version": "QGIS 3.44",
      "pages": 1667,
      "bytes": 93201751,
      "sha256": "342cd80aae437ca638415171f2a91783ae047ad20f2d6e007191730857bba2df"
    }
  },
  "description": "Page-audited operation occurrences from a Sri Lankan public-health course to the QGIS 3.44 reference guide; not a new edition of the course.",
  "license": "MIT for application code and original mapping metadata; document licences remain separate."
}