About Skills Work Research Experience Education Contact
Digital Agriculture & Applied Research

Zachary Komarnisky

I build open-source tools that close the gap between raw field data and something farmers and researchers can actually use.

Digital Agriculture student at Olds College · open-source tools for field-data workflows · ICPA/ConBAP 2026 poster

01

About

I'm a Digital Agriculture student at Olds College. My time is split between the field and the analysis — I've spent two summers at the Olds College Centre for Innovation collecting data with drones, soil probes and GPS equipment. But the part I care about is what happens next: turning that mess into something usable.

My current focus is the RETA research — an open-source toolkit for cleaning agricultural geospatial data, and its machine-learning extension RETA-ML, which uses graph neural networks to detect spatial outliers in field sensor data — alongside continuing work on Kestrel, a geospatial data inspector that diagnoses and repairs the problems that stop layers from displaying. They sit in a growing family of open-source tools for field-data workflows.

BasedCarstairs, Alberta
DegreeBachelor of Digital Agriculture
Expected 2027
RoleResearch Assistant, OCCI
Summers 2025 & 2026
CertifiedRPAS Pilot (VLOS)
Transport Canada
InterestsOpen source · Fishing
Agriculture · Technology
02

Skills

GIS & Remote Sensing

  • QGIS · plugin development
  • ArcGIS
  • Sentinel-2 imagery
  • NDVI / NDWI analysis
  • Drone & UAV data
  • Spatial interpolation
  • Pix4D · Emlid · Trimble

Machine Learning

  • PyTorch · PyTorch Geometric
  • Graph neural nets (HeteroGAT)
  • Random Forest · XGBoost
  • scikit-learn
  • Optuna search
  • Focal loss · class balancing
  • Calibration & validation

Programming

  • Python
  • Pandas · NumPy
  • GeoPandas
  • Matplotlib
  • R · RStudio
  • Bash
  • Jupyter

Precision Agriculture

  • Variable rate application
  • Yield mapping
  • Soil EC sampling
  • SMS Advanced
  • ISOBUS / FMIS
  • Crop scouting
  • Weather integration

Tools & Platforms

  • Git · GitHub Actions
  • Linux (Ubuntu)
  • PySide6 · FastAPI
  • SQLite · GeoPackage
  • PyInstaller
  • PyCharm
03

Work

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
GitHub →
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
GitHub →
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
GitHub →
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
GitHub →
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
GitHub →
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
GitHub →
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
GitHub →
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
GitHub →
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
GitHub →
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
GitHub →
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
Private repository
More

Everything else

Experiments, coursework and works in progress — including this site, hand-built with no frameworks. It all lives on GitHub.

04

Research

A Machine Learning Framework for Automated Anomaly Detection in Precision Agriculture Geospatial Data

Poster — 17th International Conference on Precision Agriculture / 11th Brazilian Congress on Precision and Digital Agriculture · Porto Alegre, Brazil
With Felippe H. S. Karp (Olds College). Built an expert-annotated ~50,000-point dataset spanning three sensors (EM38, Veris 3100, GreenStar yield monitor) and evaluated Random Forest and XGBoost under leave-one-sensor-out cross-validation. Clean readings transferred reliably (RF F1 = 0.95) and operational errors moderately (0.52), but local spatial anomalies transferred poorly (0.30) — the finding that motivates RETA-ML's graph neural network approach. Funded by an NSERC CCI Mobilize Grant.
July 2026
05

Experience

Research Assistant

Olds College Centre for Innovation — Olds, AB
Collaborated with senior researchers and industry partners on applied research projects. Collected field data using drones, soil moisture probes and GPS equipment, and provided technical support for ag-tech sensors in the field.
Summers 2025 & 2026

Seasonal Labourer — Operational Services

Town of Carstairs — Carstairs, AB
Operated landscaping and maintenance equipment; facility and infrastructure upkeep.
2022 — 2024
06

Education

Bachelor of Digital Agriculture

Olds College of Agriculture & Technology — Olds, AB
Co-Curricular Record: Student Research Experience, 2026.
Expected 2027

Small RPAS Pilot Certificate — Basic Operations (VLOS)

Transport Canada
2025
07

Contact

Open to research collaborations, precision agriculture projects, and conversations about AI and agricultural data systems.

Best reached by email or LinkedIn.