Checks reference¶
Every issue geomlint reports has a stable code, used both in the table/JSON output and in config (disabled_checks, severity_overrides).
Geometry validity & topology¶
| Code | Default severity | Applies to | What it means |
|---|---|---|---|
unparseable-geometry |
error | all formats | The feature's geometry couldn't be parsed at all (malformed JSON geometry, or a format the reader couldn't decode). |
empty-geometry |
error | all formats | The feature has a geometry object, but it's empty (no coordinates). |
invalid-geometry |
error | all formats | The geometry is topologically invalid per GEOS (self-intersections, collapsed rings, etc.) — shapely's explain_validity() reason is included in the message. |
zero-area-polygon |
error | Polygon/MultiPolygon | The polygon's area is at or below zero_area_epsilon — almost certainly a collapsed ring, not "just small." |
zero-length-line |
error | LineString/MultiLineString | The line's start and end coincide with zero length. |
duplicate-vertices |
warning | all geometry types | Consecutive vertices repeat. Harmless on its own, but a common precursor to self-intersection after the next simplify/reproject. |
wrong-ring-orientation |
warning | Polygon/MultiPolygon, GeoJSON only | A ring doesn't follow the RFC 7946 right-hand rule (exterior counterclockwise, holes clockwise). Not checked for Shapefile/GPKG, which don't share that convention. |
antimeridian-crossing-suspected |
warning | all non-point geometry types | The feature's bounding box spans more than 180° of longitude — almost always a feature that crosses ±180° without being split, not a genuinely huge shape. |
excessive-coordinate-precision |
info | all geometry types | A coordinate carries more decimal places than max_coordinate_precision — usually fake precision from a float round-trip, not real measurement accuracy. |
CRS sanity¶
| Code | Default severity | Applies to | What it means |
|---|---|---|---|
unrecognized-crs |
error | all formats | The file declares a CRS that doesn't resolve via pyproj — check the authority code/name. |
missing-crs |
warning | Shapefile/GPKG only | No CRS was found at all. Not flagged for GeoJSON, since RFC 7946 mandates WGS84 with no CRS member required. |
coordinates-out-of-wgs84-range |
error or warning | all formats | Coordinates fall outside valid lon/lat bounds — very likely projected data (UTM, state plane, etc.) mislabeled or exported without reprojecting to WGS84. Severity is error when more than out_of_range_error_pct% of features in the file are affected, warning otherwise. |
mismatched-crs-across-files |
warning | batch-level, across all files in one run | Two or more files in the same run declare different CRSes — an easy way to silently corrupt a spatial join if it's not intentional. |
Structural checks¶
| Code | Default severity | Applies to | What it means |
|---|---|---|---|
duplicate-feature-id |
error | GeoJSON, features with an explicit id member |
The same user/pipeline-assigned id is used by more than one feature in the file. Not checked for Shapefile/GPKG, where ids are driver-assigned FIDs guaranteed unique by the format. |
Not implemented¶
Positional/GPS-drift detection isn't a check here — on purpose
Telling a real turn from a multipath-induced jump needs a speed/heading-plausibility model, not a distance threshold — see geomlint/checks/drift.py for the full roadmap. Passing --drift on the CLI fails loudly with that explanation rather than silently doing nothing.