Geoprocessing workflows & model builders
Run vector/raster analyses, alone or as visual models, to a correct output layer.
20 project-authored proposals · taxonomy v1.1 · 0 new benchmark runs. Verifiers and partial-credit rules below are designs, not executed results.
- Typical applications
- QGIS Processing · ArcGIS ModelBuilder · GDAL
- Class GUI-need label
HY· Hybrid
Task proposals · 20
Expand to inspect the complete original wording and proposed checks. Original proposal text remains English in both interfaces.
R07.06.01.03-T01 Count residential parcels within 500 m of schools per district
Original instruction
In QGIS with fixtures/city.gpkg (layers schools, parcels, districts; EPSG:3857 input), reproject to EPSG:32610, buffer schools by 500 m (dissolved), select parcels with landuse='RES' whose centroid falls in the buffer, and write out/res_near_schools.csv with district_id and count, sorted by district_id.
- Platforms
mac· macOSwin· Windowslin· Linux- Applications
- QGIS Processing · GeoPandas
- Interfaces
desk· Desktop GUIterm· Terminal- GUI need · task setting
HY· Hybrid- GUI need · ordinary access
CL· CLI-sufficient- Interaction primitives
click· Point & clickcode· Code & commands- Work product
WP02· Records/table- Conditions
- None declared
- Proposed difficulty
- 2 / 5
Proposed verifier
CSV rows equal grader recompute (counts exact per district) using metric CRS; a common error (buffering in EPSG:3857 metres) yields different counts and fails.
Proposed partial credit
25% correct CRS; 25% buffer/selection; 50% counts per district
R07.06.01.03-T02 Compute slope zonal statistics per watershed into a GeoPackage
Original instruction
From input/dem_10m.tif (EPSG:25833) compute slope in degrees, then zonal mean, max and std of slope per polygon in input/watersheds.gpkg, writing out/watershed_slope.gpkg with fields ws_id, slope_mean, slope_max, slope_std.
- Platforms
mac· macOSwin· Windowslin· Linux- Applications
- QGIS Processing · GDAL
- Interfaces
desk· Desktop GUIterm· Terminal- GUI need · task setting
HY· Hybrid- GUI need · ordinary access
CL· CLI-sufficient- Interaction primitives
click· Point & clickcode· Code & commands- Work product
WP04· 3D/spatial model- Conditions
- None declared
- Proposed difficulty
- 3 / 5
Proposed verifier
Per watershed values within 0.5° (mean/std) and 1° (max) of grader's gdaldem+rasterstats; geometry and ws_id preserved; degrees not percent.
Proposed partial credit
30% slope raster in degrees; 50% zonal values; 20% output schema
R07.06.01.03-T03 Reproject and clip a land-cover raster to a county and tabulate class areas
Original instruction
With GDAL CLI only, reproject input/landcover_conus.tif (Albers, 30 m, categorical) to EPSG:26915 with nearest-neighbour at 30 m, clip to the county polygon in input/county.gpkg (cutline, crop to cutline), and write out/lc_county.tif and out/class_area_ha.csv.
- Platforms
lin· Linuxmac· macOSwin· Windows- Applications
- GDAL
- Interfaces
term· Terminal- GUI need · task setting
CL· CLI-sufficient- GUI need · ordinary access
CL· CLI-sufficient- Interaction primitives
code· Code & commands- Work product
WP02· Records/table- Conditions
- None declared
- Proposed difficulty
- 2 / 5
Proposed verifier
Raster CRS 26915, 30 m, nearest (no new class values); extent within one pixel of cutline bbox; class areas within 0.5% of reference.
Proposed partial credit
25% reprojection; 25% clip; 50% class areas
R07.06.01.03-T04 Build a ModelBuilder tool that clips and merges every feature class in a GDB
Original instruction
In ArcGIS Pro ModelBuilder create model 'ClipMergeAll' in fixtures/tools.atbx: iterate feature classes in an input geodatabase (parameter), clip each to a clip-boundary parameter, collect values, and merge into one output feature class (parameter), adding the source name field. Run it on fixtures/regions.gdb with input/study_area.shp.
- Platforms
win· Windows- Applications
- ArcGIS ModelBuilder
- Interfaces
desk· Desktop GUI- GUI need · task setting
G2· GUI-essential- GUI need · ordinary access
G2· GUI-essential- Interaction primitives
drag· Drag & dropclick· Point & clicktype· Text & forms- Work product
WP06· Code/engineering- Conditions
licensed· Licensed pro app- Proposed difficulty
- 3 / 5
Proposed verifier
Parse model XML in .atbx: Iterate Feature Classes → Clip → Collect Values → Merge chain; 3 model parameters; grader reruns tool on a hidden GDB and compares output (feature count, area within 0.1%, source field). ArcGIS Pro Python window, Notebooks and ArcPy are disabled for the agent, and Python script tools in the .atbx are rejected.
Proposed partial credit
35% model structure; 20% parameters; 30% hidden rerun matches; 15% source field
R07.06.01.03-T05 Create a QGIS Graphical Modeler model with a parameterized buffer
Original instruction
In QGIS Graphical Modeler create model 'flood_exposure' with inputs rivers (line) and buildings (polygon) and numeric parameter buffer_m (default 100). It buffers rivers, extracts intersecting buildings and outputs them plus a count. Save out/flood_exposure.model3 and run it with buffer_m=250 on fixtures/town.gpkg.
- Platforms
mac· macOSwin· Windowslin· Linux- Applications
- QGIS Processing
- Interfaces
desk· Desktop GUI- GUI need · task setting
G2· GUI-essential- GUI need · ordinary access
CL· CLI-sufficient- Interaction primitives
drag· Drag & dropclick· Point & clicktype· Text & forms- Work product
WP06· Code/engineering- Conditions
- None declared
- Proposed difficulty
- 3 / 5
Proposed verifier
Parse .model3: 2 layer inputs + numeric param wired to buffer distance; algorithms native:buffer and native:extractbylocation; grader runs model via qgis_process with hidden inputs and buffer values: outputs match reference. QGIS Python console, Processing script editor and qgis_process are disabled for the agent; a .model3 written by any process other than QGIS is flagged by a file audit log.
Proposed partial credit
35% model graph; 20% parameter wiring; 30% hidden reruns; 15% run with 250
R07.06.01.03-T06 Add preconditions so a ModelBuilder model skips empty inputs
Original instruction
fixtures/tools.atbx/ProcessParcels fails when an input feature class in the iteration is empty. Add Get Count and a Calculate Value/If-Then logic so empty inputs are skipped (preconditions), log skipped names to an output table, and keep all other outputs unchanged. Run on fixtures/county_parts.gdb (3 of 14 are empty).
- Platforms
win· Windows- Applications
- ArcGIS ModelBuilder
- Interfaces
desk· Desktop GUI- GUI need · task setting
G2· GUI-essential- GUI need · ordinary access
G2· GUI-essential- Interaction primitives
drag· Drag & dropclick· Point & clicktype· Text & forms- Work product
WP06· Code/engineering- Conditions
licensed· Licensed pro app- Proposed difficulty
- 4 / 5
Proposed verifier
Model XML has Get Count + If logic with preconditions on downstream tools; run completes without error; output equals reference on 11 non-empty; log table lists the 3 empty names. ArcGIS Pro Python window, Notebooks and ArcPy are disabled for the agent, and Python script tools in the .atbx are rejected.
Proposed partial credit
35% logic structure; 25% runs without error; 25% outputs correct; 15% skip log
R07.06.01.03-T07 Run a weighted-overlay site suitability analysis and rank parcels
Original instruction
For a solar farm siting study, combine slope (<5°=10 … >15°=0), distance to substations (fuzzy linear 0-5 km), land cover suitability table input/lc_scores.csv and exclusion mask input/protected.gpkg, with weights 0.4/0.35/0.25. Output out/suitability.tif (0-10) and out/top5_parcels.csv of parcels ≥20 ha with highest mean score.
- Platforms
mac· macOSwin· Windowslin· Linux- Applications
- QGIS Processing · GDAL
- Interfaces
desk· Desktop GUIterm· Terminal- GUI need · task setting
HY· Hybrid- GUI need · ordinary access
CL· CLI-sufficient- Interaction primitives
click· Point & clickcode· Code & commands- Work product
WP04· 3D/spatial model- Conditions
- None declared
- Proposed difficulty
- 4 / 5
Proposed verifier
Suitability raster vs reference: mean abs diff ≤0.2 and exclusion pixels 0; top5 parcel IDs equal reference (order-insensitive, ≥4/5 for partial).
Proposed partial credit
30% slope & distance scoring; 30% land cover & exclusion; 40% top-5 parcels
R07.06.01.03-T08 Spatially join a million GPS points to census tracts and compute rates
Original instruction
With GeoPandas (or DuckDB spatial), join input/trips_2026_09.parquet (1.2M pickup points, WGS84) to input/tracts.gpkg, compute pickups per 1,000 residents per tract, and write out/tract_rates.csv (GEOID, pickups, rate) for tracts with pop > 0. The run must finish under 5 minutes.
- Platforms
lin· Linuxmac· macOSwin· Windows- Applications
- GeoPandas
- Interfaces
term· Terminal- GUI need · task setting
CL· CLI-sufficient- GUI need · ordinary access
CL· CLI-sufficient- Interaction primitives
code· Code & commands- Work product
WP02· Records/table- Conditions
- None declared
- Proposed difficulty
- 3 / 5
Proposed verifier
Counts per GEOID exact; rates within 0.01; runtime ≤300 s on grader box; boundary points handled by 'within' (documented ties).
Proposed partial credit
60% counts exact; 25% rates; 15% runtime
R07.06.01.03-T09 Build 10-minute walking isochrones from clinics and count population covered
Original instruction
Using fixtures/roads.gpkg (walkable network, 4.8 km/h) and fixtures/clinics.gpkg in QGIS, compute 10-minute service areas from each clinic (QGIS Network Analysis or ORS Tools offline backend), dissolve, and compute population covered from input/pop_100m.tif. Write out/isochrones.gpkg and out/coverage.json (covered, total, pct).
- Platforms
mac· macOSwin· Windowslin· Linux- Applications
- QGIS Processing
- Interfaces
desk· Desktop GUIterm· Terminal- GUI need · task setting
HY· Hybrid- GUI need · ordinary access
CL· CLI-sufficient- Interaction primitives
click· Point & clickcode· Code & commands- Work product
WP04· 3D/spatial model- Conditions
- None declared
- Proposed difficulty
- 4 / 5
Proposed verifier
Isochrone polygon IoU with reference ≥0.85 (same concave-hull method allowed tolerance); covered population within 3%; non-walkable roads excluded.
Proposed partial credit
20% network setup; 40% isochrone IoU; 40% coverage numbers
R07.06.01.03-T10 Run a hot-spot analysis on incidents aggregated to a hexagon grid
Original instruction
In ArcGIS Pro aggregate input/incidents_2025.csv (XY in EPSG:4326) to 250 m hexagons over fixtures/city.gdb/Boundary, then run Hot Spot Analysis (Getis-Ord Gi*) with fixed distance band 750 m and FDR correction. Save out/hotspots.gdb/hex_gi and write count of 99%-confidence hot hexes to out/summary.txt.
- Platforms
win· Windows- Applications
- ArcGIS Pro
- Interfaces
desk· Desktop GUI- GUI need · task setting
HY· Hybrid- GUI need · ordinary access
CL· CLI-sufficient- Interaction primitives
click· Point & clicktype· Text & formscode· Code & commands- Work product
WP04· 3D/spatial model- Conditions
licensed· Licensed pro app- Proposed difficulty
- 3 / 5
Proposed verifier
Hex grid 250 m covering boundary; counts per hex exact; Gi_Bin values match reference ≥98% of hexes; summary count exact.
Proposed partial credit
25% hex aggregation; 50% Gi* bins; 25% summary
R07.06.01.03-T11 Build a cloud-masked NDVI median composite from five Sentinel-2 dates
Original instruction
From input/s2/ (five L2A scenes, bands B04, B08, SCL at 10/20 m) compute NDVI per date, mask SCL classes 3, 8, 9, 10, 11 (resampled nearest to 10 m), take the per-pixel median over valid dates, and write out/ndvi_median.tif (float32, nodata -9999) plus a valid-count raster.
- Platforms
lin· Linuxmac· macOSwin· Windows- Applications
- GDAL · rasterio
- Interfaces
term· Terminal- GUI need · task setting
CL· CLI-sufficient- GUI need · ordinary access
CL· CLI-sufficient- Interaction primitives
code· Code & commands- Work product
WP04· 3D/spatial model- Conditions
- None declared
- Proposed difficulty
- 4 / 5
Proposed verifier
Pixel-wise comparison with reference: ≥99% pixels within 0.01; nodata where valid count 0; count raster exact; correct scale/offset of L2A reflectance applied.
Proposed partial credit
20% NDVI per date; 25% SCL mask; 40% median composite; 15% count raster
R07.06.01.03-T12 Delineate a watershed and stream network from a DEM for a gauge outlet
Original instruction
From input/dem_25m.tif, fill sinks, compute D8 flow direction and accumulation, extract streams with contributing area ≥1 km², snap the gauge point input/gauge.gpkg to the highest-accumulation cell within 100 m, and delineate its watershed. Output out/streams.gpkg, out/watershed.gpkg and area km² in out/ws.json.
- Platforms
mac· macOSwin· Windowslin· Linux- Applications
- QGIS Processing · GRASS GIS
- Interfaces
desk· Desktop GUIterm· Terminal- GUI need · task setting
HY· Hybrid- GUI need · ordinary access
CL· CLI-sufficient- Interaction primitives
click· Point & clickcode· Code & commands- Work product
WP04· 3D/spatial model- Conditions
- None declared
- Proposed difficulty
- 4 / 5
Proposed verifier
Watershed IoU ≥0.95 vs reference; area within 2%; stream network buffer-F1 ≥0.9; snapped outlet within 25 m of reference outlet.
Proposed partial credit
20% conditioning/flow; 25% streams; 15% snapping; 40% watershed & area
R07.06.01.03-T13 Compute the combined viewshed of three proposed turbines over a protected area
Original instruction
In ArcGIS Pro, from input/dsm_5m.tif and three turbine points (hub 120 m, observer offset 120 m, target 1.7 m) compute a cumulative viewshed (0-3 visible turbines). Report the area (ha) of fixtures/park.gdb/Protected from which at least one turbine is visible in out/viewshed.json and save the raster.
- Platforms
win· Windows- Applications
- ArcGIS Pro
- Interfaces
desk· Desktop GUI- GUI need · task setting
HY· Hybrid- GUI need · ordinary access
CL· CLI-sufficient- Interaction primitives
click· Point & clicktype· Text & forms- Work product
WP04· 3D/spatial model- Conditions
licensed· Licensed pro app- Proposed difficulty
- 3 / 5
Proposed verifier
Viewshed raster matches reference ≥97% of cells; visible area within 3%; offsets applied correctly (a run without offsets differs by >30%).
Proposed partial credit
30% offsets configured; 40% viewshed raster; 30% area answer
R07.06.01.03-T14 Find the nearest hospital for every village with a KNN query in PostGIS
Original instruction
Load input/villages.gpkg and input/hospitals.gpkg into the provided PostGIS database (docker compose up), and write SQL that returns for each village the nearest hospital id and great-circle distance (km) using a KNN index (<-> operator). Save the query in out/nearest.sql and results in out/nearest.csv.
- Platforms
lin· Linuxmac· macOS- Applications
- PostGIS · GDAL
- Interfaces
term· Terminal- GUI need · task setting
CL· CLI-sufficient- GUI need · ordinary access
CL· CLI-sufficient- Interaction primitives
code· Code & commands- Work product
WP02· Records/table- Conditions
- None declared
- Proposed difficulty
- 3 / 5
Proposed verifier
nearest.csv: hospital ids exact for all villages; distances within 0.1 km (geography); EXPLAIN shows index scan with KNN.
Proposed partial credit
20% data loaded; 50% correct nearest ids; 20% distances; 10% KNN index used
R07.06.01.03-T15 Batch-clean twelve municipal layers with a looping Graphical Modeler model
Original instruction
Build QGIS model 'clean_muni.model3' that fixes geometries, reprojects to EPSG:2154, dissolves by insee_code and exports with the input file name to an output folder, then run it in batch mode over the 12 shapefiles in input/muni/ writing out/clean/*.gpkg.
- Platforms
mac· macOSwin· Windowslin· Linux- Applications
- QGIS Processing
- Interfaces
desk· Desktop GUI- GUI need · task setting
G2· GUI-essential- GUI need · ordinary access
CL· CLI-sufficient- Interaction primitives
drag· Drag & dropclick· Point & clicktype· Text & forms- Work product
WP09· Files & folders- Conditions
- None declared
- Proposed difficulty
- 4 / 5
Proposed verifier
Model graph has fixgeometries → reproject → dissolve → output; 12 outputs exist with CRS 2154, valid geometries, one feature per insee_code, areas within 0.01% of reference. QGIS Python console, Processing script editor and qgis_process are disabled for the agent; a .model3 written by any process other than QGIS is flagged by a file audit log.
Proposed partial credit
35% model graph; 30% 12 outputs; 35% outputs correct
R07.06.01.03-T16 Export a ModelBuilder model to Python and make it run standalone
Original instruction
Export fixtures/tools.atbx/FloodZones to a Python script, clean it so it runs standalone with arcpy (parameterized paths via argparse, overwrite enabled, workspace set), and verify it reproduces the model's output on fixtures/test.gdb. Save out/flood_zones.py.
- Platforms
win· Windows- Applications
- ArcGIS ModelBuilder · arcpy
- Interfaces
desk· Desktop GUIterm· Terminal- GUI need · task setting
HY· Hybrid- GUI need · ordinary access
G2· GUI-essential- Interaction primitives
click· Point & clickcode· Code & commands- Work product
WP06· Code/engineering- Conditions
licensed· Licensed pro app- Proposed difficulty
- 3 / 5
Proposed verifier
Grader runs script with hidden paths: exit 0; output feature class equals model output (count, area within 0.01%); no hard-coded paths.
Proposed partial credit
20% exported; 40% standalone runs; 40% output equality
R07.06.01.03-T17 Interpolate rainfall with IDW and kriging and pick the better by cross-validation
Original instruction
From 84 gauges in input/rain_2026_08.gpkg (field mm) interpolate monthly rainfall to a 1 km grid over input/region.gpkg using IDW (power 2) and ordinary kriging (spherical, fitted). Run leave-one-out cross-validation for both and write RMSE to out/cv.json; save the better surface as out/rain_best.tif.
- Platforms
mac· macOSwin· Windowslin· Linux- Applications
- QGIS Processing · GRASS GIS · SAGA
- Interfaces
desk· Desktop GUIterm· Terminal- GUI need · task setting
HY· Hybrid- GUI need · ordinary access
CL· CLI-sufficient- Interaction primitives
click· Point & clickcode· Code & commands- Work product
WP07· Simulation result- Conditions
- None declared
- Proposed difficulty
- 3 / 5
Proposed verifier
cv.json RMSEs within 5% of grader's LOOCV; chosen method matches lower RMSE; raster grid/extent correct; values at 10 holdout points plausible within reference ±5%.
Proposed partial credit
25% IDW; 30% kriging fit; 30% cross-validation; 15% choice & output
R07.06.01.03-T18 Model June solstice irradiance on roofs with GRASS r.sun
Original instruction
In a GRASS location EPSG:32632 import input/dsm_1m.tif, compute slope/aspect, run r.sun for day 172 (global irradiation, Linke turbidity 3.0, albedo 0.2), and report mean Wh/m²/day for each roof polygon in input/roofs.gpkg to out/roof_irr.csv.
- Platforms
lin· Linuxmac· macOSwin· Windows- Applications
- GRASS GIS
- Interfaces
term· Terminal- GUI need · task setting
CL· CLI-sufficient- GUI need · ordinary access
CL· CLI-sufficient- Interaction primitives
code· Code & commands- Work product
WP07· Simulation result- Conditions
- None declared
- Proposed difficulty
- 2 / 5
Proposed verifier
Per roof mean within 3% of grader's r.sun run with same params; all roofs present.
Proposed partial credit
30% r.sun parameters; 50% per-roof values; 20% output
R07.06.01.03-T19 Reallocate tract population to new districts by area-weighted and dasymetric methods
Original instruction
Redistribute population from input/tracts.gpkg to proposed districts input/districts_v3.gpkg (a) by area weighting and (b) dasymetrically using residential land cover from input/lc.tif (classes 21-24 weights 0.1/0.3/0.6/0.9). Output out/district_pop.csv with both estimates and validate (b) against block-level truth input/blocks_pop.gpkg (report MAPE).
- Platforms
mac· macOSwin· Windowslin· Linux- Applications
- QGIS Processing · GeoPandas
- Interfaces
desk· Desktop GUIterm· Terminal- GUI need · task setting
HY· Hybrid- GUI need · ordinary access
CL· CLI-sufficient- Interaction primitives
code· Code & commandsclick· Point & click- Work product
WP02· Records/table- Conditions
long· Long-horizon- Proposed difficulty
- 5 / 5
Proposed verifier
Area-weighted values within 0.5% of reference; dasymetric within 2%; totals conserved (sum equals tract total); MAPE value within 0.5 points of grader.
Proposed partial credit
30% area-weighted; 40% dasymetric; 10% conservation; 20% MAPE
R07.06.01.03-T20 Build an iterating ModelBuilder change-detection model over annual rasters
Original instruction
In ArcGIS Pro ModelBuilder build 'ForestLoss' that iterates over annual land-cover rasters 2018-2025 in fixtures/lc.gdb, computes forest→non-forest transitions between consecutive years with Raster Calculator, tabulates area per district (Tabulate Area) and appends rows (year, district, loss_ha) to one table. Run it.
- Platforms
win· Windows- Applications
- ArcGIS ModelBuilder
- Interfaces
desk· Desktop GUI- GUI need · task setting
G2· GUI-essential- GUI need · ordinary access
G2· GUI-essential- Interaction primitives
drag· Drag & dropclick· Point & clicktype· Text & forms- Work product
WP06· Code/engineering- Conditions
licensed· Licensed pro applong· Long-horizon- Proposed difficulty
- 5 / 5
Proposed verifier
Model XML: Iterate Rasters + previous-year handling + Raster Calculator + Tabulate Area + Append; output table 7 years × N districts, loss_ha within 0.5% of reference; ArcGIS Pro Python window, Notebooks and ArcPy are disabled for the agent, and Python script tools in the .atbx are rejected.
Proposed partial credit
35% model structure; 15% iteration correctness; 40% loss table values; 10% runs cleanly
Mapped research references
Existing benchmark-to-class links from the research catalog. They are not record-level annotations, executions or product endorsements.