Tool · 2026Featured
SMSLIBRE
QGIS plugin that reads the data cards farm machinery writes — yield, as-applied, as-planted and boundaries — and turns them into styled map layers with every logged sensor channel kept as an attribute. The import Ag Leader SMS does, inside QGIS. Built for the Olds College Centre for Innovation Smart Farm.
PythonC#.NETQGISADAPTISOXMLGeoPackage
The gap it fills
- QGIS is already good at maps, styling and analysis; the one thing it cannot do is read proprietary machine formats. This fills exactly that gap rather than rebuilding GIS features QGIS already does better
- Runs the AgGateway ADAPT plugin suite — the same import engine SMS itself uses — plus readers written here for formats ADAPT does not cover, so one plugin spans several manufacturers
Format support
- Working on real cards: John Deere GS2/GS3/GS4 (licensed SDK), ISO 11783 / ISOXML incl. New Holland and AGCO, Raven Slingshot via a reader written here, and field boundaries from any ADAPT source
- Trimble AgData needs its own vendor licence; ADM, Climate FieldView and Precision Planting load but are untested on data
What comes out
- An AGCO ISOXML harvest card yields 45 layers, 550,219 points and 46 channels — yield mass and volume, moisture, feeder throughput, rotor speed, header height, processor loss
- A John Deere Gen4 seeding card yields 127 layers and up to 598 channels; New Holland ISOXML 59 layers and 544,167 points
- Everything lands in a GeoPackage (EPSG:4326), styled on the meaningful channel with a quantile ramp classified on non-zero readings so headland zeros do not flatten the map
Architecture
- Python QGIS plugin talks JSON over a subprocess to a self-contained .NET sidecar that hosts the ADAPT plugins and writes the GeoPackage
- Loading a CLR inside the QGIS-bundled Python is fragile and a crash would take QGIS with it — the separate process avoids that and keeps the plugin cross-platform
- QGIS 3.22+. Internal distribution: the John Deere SDK licence restricts use to internal purposes and forbids redistributing the licensed components
Tool · 2026
Waxwing
Management-zone builder for Alberta and Saskatchewan fields — pulls multi-year Sentinel-2 NDVI history, finds where a field is consistently above or below its own average, and clusters it into zones. Carries through to soil sampling design and variable-rate fertilizer prescriptions.
PythonStreamlitSentinel-2ClusteringVRA
Zoning
- Growing-season NDVI history from 2017 onward via Copernicus, with quality gates for cloud, clear-pixel share and field NDVI
- Weighted scene averaging; z-score, ratio, percentile or raw normalization
- Selectable indices beyond NDVI — NDRE, GNDVI, MSAVI2 — plus bare-soil indices and brightness as an organic-matter proxy, with inverted season windows and quality gates
- Balanced-breaks clustering (exact one-dimensional dynamic programme) with zone-size floors; silhouette analysis for zone count, k-means available as a comparison baseline
- Split-half and leave-one-year-out validation (Cohen's kappa)
Sampling & prescriptions
- Ten soil-sampling designs across three families — directed, design-based and spatial — from zone composite to conditioned Latin hypercube
- Built-in sample-count calculator: n = (t·CV/D)² solved iteratively
- Lab-result ANOVA per nutrient and N/P₂O₅/K₂O/S variable-rate prescriptions from provincial guidelines
Prairie-specific
- Township-Range-Meridian boundary navigation; correct 486 × 483-chain survey grid
- Soil-zone-aware nitrogen targets (Brown through Gray)
- Optional yield monitor, soil EC and DEM-derivative layers; all data stays local
Tool · 2026
CropCore
Desktop analytics pipeline for Canadian prairie fields — consolidates Sentinel-2 imagery, weather, elevation and soil into multi-format farm reports with yield forecasting for wheat, barley and canola.
PythonSentinel-2GeoPandasReportLab
Data sources
- Sentinel-2 NDVI via Copernicus CDSE
- Open-Meteo weather
- CDEM / SRTM elevation & slope
- Alberta Open Data soil
Outputs
- PDF, HTML and text reports per field and farm
- Field-summary CSV + QGIS layer manifest
- NDVI time-lapse animations
Methodology
- Stress index (0–100) and review priority ranking
- All API calls run concurrently (ThreadPoolExecutor); interactive console or headless
--sd-path run, with an optional SMTP summary email - Yield forecast with drought-stress penalties, a soil-drainage modifier and ±20% confidence interval
- 187 automated tests
Research · 2026
RETA
Unified framework for cleaning yield-monitor and spatial agricultural data — removes operational, global and local errors through a sequential CRS-aware pipeline, as a QGIS plugin or headless script.
PythonQGISpyproj
Pipeline
- 3-phase filtering: operational → global → local
- CRS-aware distance and area via optional pyproj, falling back to WGS84 Haversine
- Auto-detection for speed, delay, turn threshold and AOI
Integration
- QGIS Processing Toolbox algorithm
- Headless DataCleaner for global/AOI filtering — no QGIS runtime (the full three-phase pipeline runs in QGIS)
- Manual correction and annotation tools
Output
- Filtered layer with category and reason per point
- Colour-coded by error class
Research · 2026
RETA-ML
Graph-neural-network outlier detection built on the RETA pipeline — classifies yield-monitor errors into four categories using a HeteroGAT model with temporal, spatial and transect graph edges.
Pythonscikit-learnXGBoostPyTorchPyGHeteroGAT
Ships
- Trained Random Forest (400 trees) and XGBoost models with a model card — 49,665 training points, 13 features
- Streamlit app to load a field, run a model and inspect the results
Architecture
- HeteroGAT, 3 edge types per field
- 4 classes: clean, operational, global, local
- Variogram-derived spatial radius
Training
- Masked hierarchical focal loss
- Temperature-scaling calibration
- Optuna hyperparameter sweep
Poster results — RF / XGBoost baselines
- Presented at the 17th ICPA / 11th ConBAP, Brazil (2026)
- ~50,000-point annotated dataset, 3 sensors
- Leave-one-sensor-out CV: clean F1 0.95 (RF) / 0.90 (XGB); local anomalies only 0.30 / 0.34 — the gap motivating the graph approach
- These are the poster's tree-ensemble baselines. The HeteroGAT model is the spatially-explicit next step and is not yet benchmarked against them
Tool · 2026
Albatross
Local Sentinel-2 field monitoring console. Upload boundaries and it auto-checks Copernicus for new acquisitions, downloads only the pixels inside each field, and builds an NDVI + NDWI dashboard. Data stays local.
PythonCopernicusNDVINDWISQLite
Monitoring
- Auto-scans Copernicus for new L2A passes
- NDVI = (B08 − B04)/(B08 + B04) and NDWI = (B03 − B08)/(B03 + B08) at 10 m
- Cloud masking via SCL classes 3, 8, 9, 10
Outputs
- NDVI and NDWI GeoTIFFs (float32) with colormap PNGs, true-colour PNG and the SCL scene-classification TIFF
- Mean-NDVI timeline with outlier filtering
- Local SQLite store — nothing leaves the machine
Tool · 2026
Lapwing
Sentinel-2 L2A imagery downloader for field boundaries — all-time cloud-filtered retrieval, output as analysis-ready GeoTIFFs clipped to the field.
PythonSentinel-2GeoTIFF
Outputs
- RGB, NDVI, NDWI and false-colour composites
- DEM and slope with provider fallback
- All clipped to the exact field boundary
- Historical NDVI average — composites every year inside a seasonal window, the direct input to zone work like Waxwing
Technical
- Copernicus CDSE, with optional direct S3 access for faster downloads
- Parallel downloads, configurable cloud filter
- GUI or CLI
Tool · 2026
Kestrel
Desktop inspector that works out why a geospatial layer will not display — in QGIS, ArcGIS or an ArcGIS REST service — then fixes it. Names the actual problem in plain language, and can assign a CRS, reproject, repair geometry or convert format. Originals are never touched; repairs write new files.
PythonGDALPROJrasterioInno Setup
Diagnoses
- Missing or undefined CRS and absent .prj files
- Coordinate/CRS mismatch — lat-lon values tagged as projected
- Data outside its CRS validity zone, or the wrong UTM hemisphere
- Empty layers, zero-area extents and Null Island coordinates
- Invalid or self-intersecting geometry; clashing CRS between layers in one GeoPackage
Repairs
- Assign a CRS without moving coordinates, or reproject to a new one
- Validate and repair geometry
- Convert between GeoPackage, Shapefile and GeoJSON
- Turn a CSV or Excel coordinate table into a point layer
Inspection
- EPSG code, UTM zone, datum and validity region; extent reprojected to WGS84
- Interactive map preview — offline coastlines and borders, optional satellite imagery
- Vector geometry type, feature count and field names; raster bands, data type, pixel size and NoData
ArcGIS
- Paste an ArcGIS REST URL (FeatureServer / MapServer) to read CRS, location, geometry type, fields and a map preview — and verify the service’s published extent actually matches its data, since a stale one sends every client’s “Zoom to Layer” to the wrong place
- Drop a .lyrx or .mapx and it follows the layer through to its source, flagging broken links, scratch Default.gdb paths that work today and break next week, and definition queries quietly hiding features
Batch & automation
- Audit an entire folder — one row per dataset, worst problems first, exported to CSV or HTML; answers which of 400 files will be a problem before a delivery goes out
- JSON CLI mode returning a non-zero exit code on error, so it drops straight into a CI check; ~48 checks in total
Inputs & distribution
- Shapefile, multi-layer GeoPackage, File Geodatabase, GeoJSON, KML/KMZ, GML, GPX, DXF, CSV/Excel, LAS/LAZ point clouds (header-only, so instant on huge clouds), rasters (GeoTIFF, IMG, VRT, JPEG2000) — and most other OGR/GDAL formats
- Windows installer needing no admin rights, or a portable zip; right-click integration via --register
Tool · 2026
Plover
QGIS plugin solving the travelling-salesperson problem for field routing — shortest tour across all waypoints, staying inside the field and routing around sloughs and exclusion zones — or a plain straight-line TSP when no boundary is supplied.
PythonQGISDijkstra
Algorithm
- Visibility graph reduced to turn vertices only — concave field and hole corners, so a rectangular field contributes no graph nodes
- Dijkstra shortest paths between waypoints
- Multi-start nearest-neighbour polished by alternating 2-opt and Or-opt — 11× faster and 5% shorter tours than v2.7 on a 100-point field
Integration
- QGIS 3.22+ and 4.x (Qt5/Qt6)
- GeoPackage, Shapefile, GeoJSON, plus GPX and KML reprojected to WGS84 for a handheld or phone
- Registered Processing algorithm (plover:tsproute) for Model Designer, batch and PyQGIS; runs as a cancellable background task
- Built for soil sampling and sensor verification
Tool · 2026
Perch
Windows GUI for sorting multispectral MicaSense drone imagery into band-specific folders — auto-detects the sensor from EXIF, with parallel copy and live progress.
PythonMicaSensePyInstaller
Features
- RedEdge-MX Dual (10-band) and Altum-PT (7-band) presets
- Auto-detects camera model from EXIF
- Parallel workers with live rate and ETA
Distribution
- Single-file PyInstaller executable
- Auto-update against GitHub Releases
Tool · 2026
Magpie
Weekly crop-monitoring package builder — merges Survey123 observations, PT2R lab nutrient data and Pest ID bug counts into per-crop Excel and GeoPackage deliverables.
PythonPySide6FastAPISQLite
Data sources
- Survey123 — disease, soil sensors, insects, growth stage
- PT2R lab nutrient panels
- Pest ID per-field bug-count log
Architecture
- PySide6 desktop and FastAPI web on one service layer
- SQLite (WAL); parity test guarantees identical output
More
Everything else
Experiments, coursework and works in progress — including this site, hand-built with no frameworks. It all lives on GitHub.