Earth observation and geospatial data science · Python · Copernicus · validation first
I build Earth-observation pipelines from open data and validate them against independent ground measurements. Acceptance criteria are fixed before the results are computed. Every number on a map comes with its error, and negative results are reported too.
GeoWorldLook is the umbrella for my open-data EO projects. Each module is a standalone repository with its own pipeline, validation and documentation.
| Module | Question | Data | Validated against | Status |
|---|---|---|---|---|
| AgriScreen | Is this vineyard entering drought? | Sentinel-2 (10 m), ERA5-Land, satellite soil water index | soil sensors at 11 sites (ICOS, ISMN), Météo-France | v1.3.1 · active |
| EGMS Check | Can EGMS InSAR be trusted to monitor subsidence? | EGMS L2b / L3, Sentinel-1 | GNSS (NGL), state levelling (NRW) | v1.0.0 · active |
| geoworldlook-web | Where the results are published | Next.js, MapLibre, Supabase | — | live |
AgriScreen: key results
- “Dry soil” hint confirmed by soil sensors in the ground on 81% of days (49% by chance): 4,783 days at 11 sites in France, test rules registered before computing.
- 30-day rainfall vs the Météo-France rain gauge in Condom: R = 0.90; heat days: 70% detected, 15% false alarms.
- Reported as not confirmed: the vegetation hint vs measured evapotranspiration (67% vs 52% by chance).
- Live panel, updated automatically every week.
EGMS Check: key results
- North Rhine-Westphalia (1,216 levelling benchmarks, independent of GNSS): EGMS shows the same height change as levelling (slope 0.96, up to −140 mm in 3 years); same direction of motion at all 54 benchmarks in subsidence bowls.
- Groningen (24 subsiding GNSS stations): the EGMS subsidence rate agrees with GNSS within 1.5 mm/yr for 91% of station × track pairs (release 2019–2023) and 99% (release 2020–2024).
- Reported as failed: a constant ≈ −2 mm/yr offset to the levelling datum (3 of 4 pre-registered rules not met) and the stable-station check in Groningen.
- One command runs the pipeline on a normal computer; offline tests run in CI on every change.
| Area | Tools and methods |
|---|---|
| EO data | Sentinel-1/2, ERA5-Land, EGMS, Landsat 8, airborne LiDAR |
| Processing | Python (pandas, NumPy, SciPy, rasterio, GeoPandas), Google Earth Engine, QGIS / PyQGIS, ArcGIS, PostGIS |
| Machine learning | scikit-learn, TensorFlow, PyTorch (SEN2SR super-resolution) |
| Validation | in-situ match-ups, bootstrap confidence intervals, Brier score, pre-registered criteria |
| Engineering | reproducible Colab pipelines, offline self-tests, manifests with checksums |
| Learning now | STAC, xarray, Docker, GitHub Actions, U-Net segmentation |
| Project | Data | What it shows |
|---|---|---|
| landsat-lst-ndvi | Landsat 8 thermal and optical | land surface temperature with NDVI-based emissivity (ArcPy) |
| lidar-powerline-classification | airborne LiDAR (LAS) | power-line conductor detection with a neural network (TensorFlow) |
| renewable-energy-site-selection | BDOT10k, solar and wind rasters | PV and wind site screening for all 16 Polish provinces (PyQGIS, PostGIS) |
| f1-race-pace-prediction | FastF1 timing data | per-driver LSTM forecasts, checked race by race |
| pulsar-classification | radio-astronomy candidates | imbalanced classification done honestly (PCA + KNN) |