Plugin icon

STAT GEOM QC

Plugin ID: 5784

Quality control and geometric statistics for vector layers, with a correctness score and exportable report.

(7) votes 
Download latest
Versions JSON
Latest version

STAT GEOM QC analyses QGIS vector layers and detects quality issues: null or empty geometries, invalid geometries, self-intersections, overlaps/intersections between polygons, duplicates, small polygons (optional, configurable m² threshold), duplicate vertices (optional), holes in polygons (optional, with an area threshold so that large justified holes are kept) and multipart features. Overlap detection is strictly topological — interiors that intersect, however slightly, with no metric tolerance — so a shared boundary or a single point of contact is never reported. An "Extras" section adds four optional checks: sharp angles (spike vertices), vertices that are too close together, the height of nested polygons - when a polygon lies entirely inside another, its elevation must be strictly greater than the containing polygon's - and, for line layers, unnoded crossings between two distinct line features (a crossing or a touch with no shared vertex at the meeting point, so a network tool cannot connect there); the check is silent on layers with no line features, and does not verify a line crossing itself. The AGL and HEIGHT fields are matched case-insensitively and each is compared with its own counterpart; only the inner polygon is flagged, a missing or non-numeric value makes the pair "not verifiable" rather than compliant, and a layer carrying neither field marks the check as not run instead of reporting zero. The overlap check has exactly two exceptions, both on by default and presented as sub-choices of the check itself: ignore overlaps caused by a missing vertex on the shared wall, and ignore polygons entirely contained in another. Neither has any threshold to set. Duplicate vertex detection is likewise threshold-free: only exactly superimposed vertices count. The panel header shows the installed version. Any indicator tied to a control that did not run is labelled "not requested" instead of a misleading zero, and one that ran without being able to conclude is labelled "not conclusive" instead of a misleading zero of its own; such a control is excluded from the correctness score and its breakdown, so a score is never a verdict on a dimension that was never measured. It computes a weighted correctness score (0-100) that never rounds up to a perfect mark, on the overall score or on any single sub-score, while any counted issue remains — shows a modern summary (gauge, indicators, breakdown) and produces an exportable report (HTML/CSV/JSON). Built-in QGIS actions: select flagged features, create a point error layer locating each issue exactly (self-intersection nodes for invalid geometries, representative point otherwise), and selective geometry repair that writes the result to a NEW file without modifying the source layer. Each correction type in the repair dialog shows an adaptive preview computed on the layer at hand before anything is written: how many will actually be fixed, how many are deliberately left untouched because fixing them would risk corrupting the geometry, and — for the two checks with no automatic fix at all (nested-height violations, unnoded line crossings) — a plain explanation of why, with the manual path to follow. Every adjustable tolerance (small-polygon threshold, overlap trim percentage, sharp-angle degree, close-vertex distance, hole area) can be tuned right there, with the preview recomputed on demand; the repair button stays disabled until every checked correction has an up-to-date preview, so nothing is ever applied against a stale estimate. Detection thresholds can only be TIGHTENED there, never widened past the analysis: repair only ever works on features the analysis already flagged, so widening would treat identical data two different ways. Only the repaired file is produced — nothing else is written, and no PARTIAL output is ever written: if a single feature is rejected the whole repair is refused rather than handing back an amputated file that reads as complete. A check that could examine nothing is declared not applicable or not conclusive and leaves the score entirely — a layer with no polygons no longer reports "0 overlaps" as if it had passed, an unreadable elevation (empty, or a non-finite number) makes a nested pair unverifiable rather than compliant, and a hole whose area cannot be measured in m² is kept rather than judged in the wrong unit. Editing the analysed layer marks the result stale: the actions that touch data refuse to run until a fresh analysis, feature ids from a bygone state being able to designate other features entirely. Anomalies with no automatic fix are listed together with their source FIDs in the repair summary. A background re-check automatically re-runs the same controls on the repaired file and reports whether anything remains. An optional ANALYSIS ZONE (AOI) restricts the whole analysis to a rectangle drawn on the map (or to the current map extent): quality control tile by tile on a layer of hundreds of thousands of features. A feature counts as soon as it INTERSECTS the zone, so a building straddling the edge is analysed whole, never clipped. Immediate neighbours outside the zone are still read for the pairwise checks - overlaps, nesting, line crossings - because a feature inside the zone overlapping its neighbour just outside is a real error; those neighbours contribute no anomaly of their own. The score and every counter are relative to the zone, and an EMPTY zone reports an explicit "Not evaluated" grade rather than a meaningless 100/100. Repairing under a zone writes a file covering exactly the same perimeter as the analysis - an extract, announced as such. The zone is never remembered between sessions, and the same optional extent parameter is available to the Processing algorithms, hence to batch runs and qgis_process. Native PyQGIS port of the STAT GEOM application, with no external dependencies.

Version QGIS >= QGIS <= Date
2.9.44 - 3.16.0 3.99.0 19 Bchini 2026-09-08T08:57:58.383818+00:00
2.9.31 - 3.16.0 3.99.0 180 Bchini 2026-08-15T14:32:14.024603+00:00
2.9.21 - 3.16.0 3.99.0 154 Bchini 2026-07-30T13:33:05.108022+00:00
2.9.10 - 3.16.0 3.99.0 66 Bchini 2026-07-28T12:03:17.784330+00:00