Problems
Real geospatial problems, graded automatically. Choose a track, a level and what you want to hand in.
- Not started, Can the cycle parking feed report real capacity?Data preparationSQLData ManagementbeginnerDifficulty: beginner130 XP~25 min7 checksData ManagementbeginnerDifficulty: beginner
Clean a Berlin cycle parking staging table for an operations map and capacity rollup.
You hand in a spatial SQL query.
Dataset
- Berlin bicycle parking capacity staging · Point · 27 features · EPSG:4326
What you’ll do
- Resolve source precedence before casting.
- Keep unknown capacity distinct from zero.
- Return geometry for the operational map.
data-preparationberlinsqlAlso trains PostGIS / SQLOpen problem - Not started, Docks and bikes per borough, in one querySpatial analysisSQLPostGIS / SQLbeginnerDifficulty: beginner150 XP~25 min4 checksPostGIS / SQLbeginnerDifficulty: beginner
A point-in-polygon join with GROUP BY — and the outer join that keeps the boroughs with nothing to count.
You hand in a spatial SQL query.
Datasets
- London boroughs · Polygon · 33 features · EPSG:4326
- Santander Cycles docking stations (live snapshot) · Point · 799 features · EPSG:4326
What you’ll do
- Join stations to boroughs with a spatial predicate
- Aggregate per borough
- Keep every borough, including the ones outside the scheme
ST_ContainsGROUP BYouter jointransportLondonAlso trains Spatial AnalysisOpen problem - Not started, How many mapped rivers touch each country?Spatial analysisSQLPostGIS / SQLbeginnerDifficulty: beginner150 XP~25 min4 checksPostGIS / SQLbeginnerDifficulty: beginner
ST_Intersects between lines and polygons with GROUP BY — and the outer join that keeps the countries with none.
You hand in a spatial SQL query.
Datasets
- Countries · MultiPolygon · 241 features · EPSG:4326
- Rivers and lake centrelines · LineString · 461 features · EPSG:4326
What you’ll do
- Join lines to polygons with a spatial predicate
- Aggregate per polygon
- Keep every polygon, including those with no match
ST_IntersectsGROUP BYouter joinhydrologyglobalOpen problem - Not started, How many tiles does an offline London need?Web deliveryAnswersWeb GISbeginnerDifficulty: beginner140 XP~25 min3 checksWeb GISbeginnerDifficulty: beginner
From a bounding box to a tile count: size the offline basemap for a field app across zoom 10–15.
You hand in your answers as values.
Dataset
- London boroughs · Polygon · 33 features · EPSG:4326
What you’ll do
- Take the bounding box of the borough layer
- Convert box corners to tile coordinates at each zoom
- Count tiles per zoom and total them into a storage estimate
XYZ tilesWeb Mercatorofflinecapacity planningLondonAlso trains CartographyOpen problem - Not started, Make the pharmacy handover loadableData preparationPythonData ManagementbeginnerDifficulty: beginner125 XP~25 min6 checksData ManagementbeginnerDifficulty: beginner
Repair a field table so a Paris health directory can map its pharmacy locations reliably.
You hand in a Python script.
Dataset
- Raw Paris pharmacy handover · Table · 21 rows · EPSG:4326
What you’ll do
- Parse and validate coordinates before constructing point geometry.
- Preserve the first source record for each reference.
- Deliver a typed, spatially plausible point layer.
data-preparationcoordinatesquality-controlparisAlso trains PythonOpen problem - Not started, Normalise the map before you shade itCartographyGeoJSONCartographybeginnerDifficulty: beginner140 XP~25 min6 checksCartographybeginnerDifficulty: beginner
Turn a count into a rate: population per square kilometre for every country, with the area measured rather than looked up.
You hand in a GeoJSON result.
Dataset
- Countries · MultiPolygon · 241 features · EPSG:4326
What you’ll do
- Measure every polygon's area in an equal-area projection
- Compute a rate by dividing the count by the area
- Return every country, ready to shade
choroplethnormalisationEqual EarthdensityglobalAlso trains Spatial AnalysisOpen problem - Not started, Package one playground location per source featureData preparationDataset fileData ManagementbeginnerDifficulty: beginner130 XP~30 min6 checksData ManagementbeginnerDifficulty: beginner
Turn mixed playground points and areas into a projected GeoPackage site directory.
You hand in a prepared dataset file.
Dataset
- Sydney playground mixed-geometry source · Point · 8 features · EPSG:4326
What you’ll do
- Convert mixed source geometry into a consistent site layer.
- Reproject coordinates to the receiving metric CRS.
- Package exact schema and layer name in GeoPackage.
data-preparationsydneyfileAlso trains Spatial AnalysisOpen problem - Not started, What is Greater London made of?Raster analysisAnswersRemote SensingbeginnerDifficulty: beginner
A class histogram on a 10 m land-cover raster: the shares a planning document quotes, and the reason a pixel count is not quite an area.
You hand in your answers as values.
Dataset
- Greater London land cover 2021 (ESA WorldCover 10 m) · Raster · EPSG:4326
What you’ll do
- Read a categorical raster and count pixels per class
- Express classes as shares of the valid pixels
- State what the number is and is not
land coverWorldCoverhistogramrasterLondonAlso trains Data ManagementOpen problem - Not started, Which airport codes will break the schedule join?Data qualityAnswersData ManagementbeginnerDifficulty: beginner130 XP~25 min5 checksData ManagementbeginnerDifficulty: beginner
Audit a registry's identifiers before they become a join key: missing, malformed and duplicated codes, and positions that are only approximate.
You hand in your answers as values.
Dataset
- World airports · Point · 893 features · EPSG:4326
What you’ll do
- Find nulls, duplicates and malformed values in an identifier column
- Distinguish a key defect from a position defect
- Report counts the integration can be sized against
data qualityidentifiersjoin keysaviationAlso trains PythonOpen problem - Not started, Which airports sit inside a city?Spatial analysisGeoJSONSpatial AnalysisbeginnerDifficulty: beginner130 XP~20 min5 checksSpatial AnalysisbeginnerDifficulty: beginner
Point-in-polygon screening: the airports whose point falls inside a built-up footprint, for a noise-exposure programme.
You hand in a GeoJSON result.
Datasets
- World airports · Point · 893 features · EPSG:4326
- Urban areas · Polygon · 2,143 features · EPSG:4326
What you’ll do
- Test each point for containment in any polygon of a second layer
- Return the qualifying points once each, with their attributes
point-in-polygonspatial joinscreeningaviationglobalAlso trains Data ManagementOpen problem - Not started, Which boroughs is the cycle-hire scheme actually in?Spatial analysisGeoJSONSpatial AnalysisbeginnerDifficulty: beginner130 XP~25 min6 checksSpatial AnalysisbeginnerDifficulty: beginner
Join 799 docking stations to 33 boroughs and rank them by docks per square kilometre.
You hand in a GeoJSON result.
Datasets
- London boroughs · Polygon · 33 features · EPSG:4326
- Santander Cycles docking stations (live snapshot) · Point · 799 features · EPSG:4326
What you’ll do
- Spatially join docking stations to the borough that contains them
- Sum docking points per borough without dropping the boroughs that have none
- Measure borough area in a metric CRS and compute docks per km²
spatial joinaggregationCRStransportLondonAlso trains Data ManagementOpen problem - Not started, Which countries have no airport in the registry?Spatial analysisPythonPythonbeginnerDifficulty: beginner150 XP~30 min4 checksPythonbeginnerDifficulty: beginner
A points-in-polygons count as a script the grader runs: one row per country, zeros kept, on a global registry that misses a lot of places.
You hand in a Python script.
Datasets
- Countries · MultiPolygon · 241 features · EPSG:4326
- World airports · Point · 893 features · EPSG:4326
What you’ll do
- Read both layers from /data and join points to polygons with a spatial predicate
- Count per country without losing the countries that count zero
- Assign the finished GeoDataFrame, one row per country, to result
GeoPandasspatial joinreproducibilityaviationglobalAlso trains Spatial AnalysisOpen problem - Not started, Accept the rasters, or send them backData qualityAnswersData ManagementintermediateDifficulty: intermediate200 XP~35 min6 checksData ManagementintermediateDifficulty: intermediate
The checks a data manager runs on delivered rasters before anyone analyses them: extent, nodata, value range, and whether the figures are plausible for the place.
You hand in your answers as values.
Datasets
- Greater London elevation (Copernicus DEM GLO-30) · Raster · EPSG:4326
- Greater London land cover 2021 (ESA WorldCover 10 m) · Raster · EPSG:4326
- Greater London, Sentinel-2 red and NIR, 11 July 2025 · Raster · EPSG:32630
What you’ll do
- Read raster metadata and full-resolution statistics
- Distinguish nodata from valid extremes
- Record facts a later dispute can start from
raster QAnodatametadataacceptanceLondonAlso trains Remote SensingOpen problem - Not started, Airports per state, as a script that runs againSpatial analysisPythonPythonintermediateDifficulty: intermediate190 XP~35 min5 checksPythonintermediateDifficulty: intermediate
Spatially join a global airport layer to US states and hand back one row per state, zeros included — in a script the grader runs.
You hand in a Python script.
Datasets
- United States states · Polygon · 51 features · EPSG:4326
- World airports · Point · 893 features · EPSG:4326
What you’ll do
- Read both layers from /data and join airports to states with a spatial predicate
- Count airports and major airports per state without losing a state that has none
- Assign the finished GeoDataFrame, one row per state, to the variable named result
GeoPandasspatial joinreproducibilityaviationAlso trains Spatial AnalysisOpen problem - Not started, At which zoom does every capital get its own tile?Web deliveryAnswersWeb GISintermediateDifficulty: intermediate180 XP~25 min4 checksWeb GISintermediateDifficulty: intermediate
Count capitals per XYZ tile across zooms to decide where a label layer switches from clustering to one label per city.
You hand in your answers as values.
Dataset
- Populated places · Point · 1,251 features · EPSG:4326
What you’ll do
- Convert points to tile indices at several zooms
- Find the busiest tile per zoom
- Choose a switch-over zoom from the data
XYZ tileslabelsclusteringzoom levelsglobalAlso trains CartographyOpen problem - Not started, At which zoom does the dock layer fit in a tile?Web deliveryAnswersWeb GISintermediateDifficulty: intermediate190 XP~30 min4 checksWeb GISintermediateDifficulty: intermediate
Count features per XYZ tile across zoom levels to set a vector-tile pipeline's minimum zoom and its per-tile limit honestly.
You hand in your answers as values.
Dataset
- Santander Cycles docking stations (live snapshot) · Point · 799 features · EPSG:4326
What you’ll do
- Convert coordinates to tile indices at several zooms
- Count features per tile and find the maximum
- Choose a minimum zoom from the data rather than a default
vector tilesXYZtippecanoezoom levelsLondonAlso trains Spatial AnalysisOpen problem - Not started, Build the global seismic reconnaissance watchlistDecision supportPythonSpatial AnalysisintermediateDifficulty: intermediate240 XP~40 min5 checksSpatial AnalysisintermediateDifficulty: intermediate
Turn a fixed USGS event feed into a mapped, reproducible shallow strong-event watchlist for requesting impact products.
You hand in a Python script.
Dataset
- Global M5.5+ earthquakes, Jan–Mar 2025 · Point · 86 features · EPSG:4326
What you’ll do
- Apply two inclusive, unit-aware filters to the frozen event snapshot
- Carry stable event identifiers and response metadata into a point GeoDataFrame
- Map event magnitude as a proportional point result without claiming it is impact
USGSearthquakesGeoPandasemergency screeningglobalAlso trains Python, Data Management, CartographyOpen problem - Not started, How big does Web Mercator make Greenland?CartographyAnswersCartographyintermediateDifficulty: intermediate210 XP~30 min4 checksCartographyintermediateDifficulty: intermediate
Put a number on the most famous distortion in cartography: the same countries measured on the ellipsoid and on the projection every web map uses.
You hand in your answers as values.
Dataset
- Countries · MultiPolygon · 241 features · EPSG:4326
What you’ll do
- Measure area geodesically or in an equal-area projection
- Project the same polygons to Web Mercator and take their planar area
- Express the distortion as ratios a reader can repeat
Web Mercatorprojectionarea distortionEqual EarthglobalAlso trains Spatial AnalysisOpen problem - Not started, How green was London on 11 July 2025?Raster analysisAnswersRemote SensingintermediateDifficulty: intermediate220 XP~35 min4 checksRemote SensingintermediateDifficulty: intermediate
Compute NDVI from a two-band Sentinel-2 clip, handle nodata and integer types properly, and report the distribution a monitoring programme quotes.
You hand in your answers as values.
Dataset
- Greater London, Sentinel-2 red and NIR, 11 July 2025 · Raster · EPSG:32630
What you’ll do
- Compute a band ratio index with correct types
- Exclude nodata from every statistic
- Summarise the index as the programme's three figures
NDVISentinel-2band mathnodataLondonOpen problem - Not started, How much of each borough lies below ten metres?Raster analysisGeoJSONSpatial AnalysisintermediateDifficulty: intermediate240 XP~40 min6 checksSpatial AnalysisintermediateDifficulty: intermediate
Threshold a DEM, count inside polygons, and turn pixels into square kilometres on a geographic grid — a flood-screening figure per borough.
You hand in a GeoJSON result.
Datasets
- Greater London elevation (Copernicus DEM GLO-30) · Raster · EPSG:4326
- London boroughs · Polygon · 33 features · EPSG:4326
What you’ll do
- Threshold a continuous raster
- Count the thresholded pixels per polygon
- Convert pixels to ground area on a geographic grid
DEMthresholdzonalpixel areafloodLondonAlso trains Remote SensingOpen problem - Not started, How much of Inner London is a five-minute walk from a dock?Spatial analysisGeoJSONSpatial AnalysisintermediateDifficulty: intermediate240 XP~45 min5 checksSpatial AnalysisintermediateDifficulty: intermediate
Buffer, dissolve and clip: the covered share of each Inner London borough at a 400 m walk.
You hand in a GeoJSON result.
Datasets
- London boroughs · Polygon · 33 features · EPSG:4326
- Santander Cycles docking stations (live snapshot) · Point · 799 features · EPSG:4326
What you’ll do
- Buffer 799 stations by 400 m in a metric CRS
- Dissolve the buffers into one coverage geometry
- Clip the coverage to each Inner London borough
bufferdissolveclipCRStransportLondonAlso trains CartographyOpen problem - Not started, Protect the bus stop key during the loadData preparationSQLData ManagementintermediateDifficulty: intermediate210 XP~40 min7 checksData ManagementintermediateDifficulty: intermediate
Recover zero-padded stop identifiers before a transport timetable join.
You hand in a spatial SQL query.
Dataset
- Singapore bus stop code staging · Point · 31 features · EPSG:4326
What you’ll do
- Preserve identifier semantics through SQL casting.
- Resolve repeated source rows deterministically.
- Return a clean point layer for the timetable join.
data-preparationsingaporesqlAlso trains PostGIS / SQLOpen problem - Not started, Redirect the rider at an empty dockDecision supportSQLPostGIS / SQLintermediateDifficulty: intermediate250 XP~40 min5 checksPostGIS / SQLintermediateDifficulty: intermediate
For every station with no bikes, the nearest station that has one, and the walk in metres — with the KNN operator so it stays fast at 799 stations or 79,000.
You hand in a spatial SQL query.
Dataset
- Santander Cycles docking stations (live snapshot) · Point · 799 features · EPSG:4326
What you’ll do
- Filter to stations with no bikes
- Find each one's nearest stocked station with an index-assisted nearest-neighbour search
- Report the distance in metres
KNNLATERALGiSTgeographyperformancetransportOpen problem - Not started, The buffer that shrank on the way to the mapCartographyAnswersCartographyintermediateDifficulty: intermediate200 XP~30 min4 checksCartographyintermediateDifficulty: intermediate
Quantify what a 400 m buffer drawn in EPSG:3857 actually covers on the ground in London, and how much of the coverage report it loses.
You hand in your answers as values.
Datasets
- Santander Cycles docking stations (live snapshot) · Point · 799 features · EPSG:4326
- London boroughs · Polygon · 33 features · EPSG:4326
What you’ll do
- Derive the Web Mercator scale factor at London's latitude
- Translate a projected buffer distance into its ground equivalent
- Re-run the coverage analysis with the shrunken buffer and measure the shortfall
Web Mercatorscale factorprojectionbufferLondonAlso trains Spatial AnalysisOpen problem - Not started, When the attributes and the geometry disagreeData qualityAnswersData ManagementintermediateDifficulty: intermediate200 XP~35 min5 checksData ManagementintermediateDifficulty: intermediate
A reference gazetteer carries a latitude and a longitude column beside its geometry. Audit how far apart they are, and what else does not add up.
You hand in your answers as values.
Dataset
- Populated places · Point · 1,251 features · EPSG:4326
What you’ll do
- Compare each feature's geometry to the coordinate attributes it carries
- Count the disagreements at two thresholds and identify the worst
- Find keys the downstream spreadsheet cannot distinguish
data qualitygazetteerhaversineduplicatesglobalAlso trains PythonOpen problem - Not started, Where are the bikes, as a share of the docks?Spatial analysisPythonPythonintermediateDifficulty: intermediate190 XP~35 min5 checksPythonintermediateDifficulty: intermediate
A scripted per-borough ratio from a live snapshot: bikes over docking points, every borough kept, so it can run again on the next snapshot.
You hand in a Python script.
Datasets
- London boroughs · Polygon · 33 features · EPSG:4326
- Santander Cycles docking stations (live snapshot) · Point · 799 features · EPSG:4326
What you’ll do
- Read both layers from /data and assign stations to boroughs with a spatial predicate
- Sum two columns per borough and compute their ratio, with zero where the denominator is zero
- Assign the finished GeoDataFrame, one row per borough, to result
GeoPandasspatial joinratioreproducibilitytransportLondonAlso trains Spatial AnalysisOpen problem - Not started, Where should a waterway survey start?Decision supportSQLSpatial AnalysisintermediateDifficulty: intermediate320 XP~50 min9 checksSpatial AnalysisintermediateDifficulty: intermediate
Screen large global urban footprints for mapped river contact while keeping scale limitations explicit.
You hand in a spatial SQL query.
Datasets
- Urban areas · Polygon · 2,143 features · EPSG:4326
- Rivers and lake centrelines · LineString · 461 features · EPSG:4326
What you’ll do
- Apply a spatial join to real river and urban geometry
- Keep zero-contact footprints in the inventory
- Distinguish map-scale contact classes for survey planning
Natural Earthurban waterPostGISspatial screeningcategorical mapglobalAlso trains PostGIS / SQL, Cartography, Data ManagementOpen problem - Not started, Where should the sewer service desk review closure lag?Decision supportPythonSpatial AnalysisintermediateDifficulty: intermediate320 XP~50 min5 checksSpatial AnalysisintermediateDifficulty: intermediate
Turn a fixed 311 complaint cohort into a map of requests open longer than an analyst-defined day.
You hand in a Python script.
Dataset
- NYC 311 sewer requests, 1–7 June 2025 · Point · 408 features · EPSG:4326
What you’ll do
- Calculate closure lag from timestamp fields without inventing values for open requests
- Select the service manager's review queue
- Map the concentration of selected requests while retaining per-request details
NYC 311urban servicestemporal GISheat mapGeoPandasAlso trains Python, Cartography, Data ManagementOpen problem - Not started, Which airfields should the response desk check?Decision supportSQLPostGIS / SQLintermediateDifficulty: intermediate260 XP~45 min6 checksPostGIS / SQLintermediateDifficulty: intermediate
Use a metre-based spatial join to identify civil airfields near strong, shallow earthquake epicentres, with the facilities drawn on the map.
You hand in a spatial SQL query.
Datasets
- Global M5.5+ earthquakes, Jan–Mar 2025 · Point · 86 features · EPSG:4326
- World airports · Point · 893 features · EPSG:4326
What you’ll do
- Filter events by magnitude and depth
- Join the selected events to civil airfields within 250 km in metres
- Return traceable, mapped airport points and measured distances
PostGISearthquake responseairportsgeographyglobalAlso trains Spatial Analysis, CartographyOpen problem - Not started, Which boroughs have the least tree cover?Raster analysisGeoJSONRemote SensingintermediateDifficulty: intermediate230 XP~40 min7 checksRemote SensingintermediateDifficulty: intermediate
Zonal statistics on a categorical raster: the share of tree-cover pixels inside each borough polygon, for a tree-planting programme's targeting.
You hand in a GeoJSON result.
Datasets
- Greater London land cover 2021 (ESA WorldCover 10 m) · Raster · EPSG:4326
- London boroughs · Polygon · 33 features · EPSG:4326
What you’ll do
- Compute zonal statistics of a categorical raster over polygons
- Express the class as a share per zone
- Return the polygons ready for a choropleth
zonal statisticsland coverraster–vectorWorldCoverLondonAlso trains Spatial AnalysisOpen problem - Not started, Which capitals are more than an hour from a scheduled airport?Decision supportGeoJSONSpatial AnalysisintermediateDifficulty: intermediate230 XP~40 min5 checksSpatial AnalysisintermediateDifficulty: intermediate
Nearest-neighbour from 200 national capitals to 872 civil airports, geodesically, with a threshold that has to be applied honestly.
You hand in a GeoJSON result.
Datasets
- Populated places · Point · 1,251 features · EPSG:4326
- World airports · Point · 893 features · EPSG:4326
What you’ll do
- Filter the places to national capitals and the airports to civil scheduled-traffic fields
- Find each capital's nearest qualifying airport with a geodesic distance
- Keep the capitals beyond 75 km and report the airport and the distance
nearest neighbourgeodesichaversinelogisticsglobalAlso trains Data ManagementOpen problem - Not started, Which places can the emissions change map actually compare?Data qualityPythonData ManagementintermediateDifficulty: intermediate290 XP~45 min6 checksData ManagementintermediateDifficulty: intermediate
Audit two-date indicator coverage and map the places excluded before showing a climate trend.
You hand in a Python script.
Datasets
- Countries · MultiPolygon · 241 features · EPSG:4326
- CO2 per capita by country, 2010 and 2022 · Point · 241 features · EPSG:4326
What you’ll do
- Audit missingness before a two-date map is interpreted
- Prevent a many-to-many join on nonstandard ISO codes
- Show complete and incomplete coverage on real country polygons
World Bankdata qualitymissing datacategorical mapglobalAlso trains Python, CartographyOpen problem - Not started, Which ports are within 25 km of a capital?Spatial analysisSQLPostGIS / SQLintermediateDifficulty: intermediate220 XP~35 min5 checksPostGIS / SQLintermediateDifficulty: intermediate
ST_DWithin on geography: a proximity join in true metres that the index can still answer.
You hand in a spatial SQL query.
Datasets
- Populated places · Point · 1,251 features · EPSG:4326
- Ports · Point · 1,081 features · EPSG:4326
What you’ll do
- Write a proximity join with ST_DWithin
- Measure in metres on SRID 4326 data by casting to geography
- Keep the predicate in a form the GiST index can serve
ST_DWithingeographyGiSTproximityglobalOpen problem - Not started, Which ports in the registry are the same port?Data qualityAnswersData ManagementintermediateDifficulty: intermediate190 XP~30 min4 checksData ManagementintermediateDifficulty: intermediate
Find probable duplicates in a facility registry by combining a name match with a distance rule — and separate them from the honest homonyms.
You hand in your answers as values.
Dataset
- Ports · Point · 1,081 features · EPSG:4326
What you’ll do
- Find repeated identifiers in a registry
- Combine an attribute match with a spatial rule to separate duplicates from homonyms
- Size the missing attribute that would resolve the rest
data qualitydeduplicationhaversineregistryglobalAlso trains Spatial AnalysisOpen problem - Not started, Why a cloud-optimised GeoTIFF is cheap to serveWeb deliveryAnswersGIS ArchitectureintermediateDifficulty: intermediate200 XP~30 min4 checksGIS ArchitectureintermediateDifficulty: intermediate
Read a COG's internal structure — tiles, overviews, bytes — and turn it into the numbers a tile server's capacity plan rests on.
You hand in your answers as values.
Datasets
- Greater London land cover 2021 (ESA WorldCover 10 m) · Raster · EPSG:4326
- Greater London, Sentinel-2 red and NIR, 11 July 2025 · Raster · EPSG:32630
What you’ll do
- Read a GeoTIFF's block size and overview structure
- Count internal tiles from dimensions and block size
- Relate the structure to what a tile request costs
COGGeoTIFFtile servercapacity planningrasterAlso trains Web GISOpen problem - Not started, Are these country polygons fit to assign cities to?Data qualitySQLPostGIS / SQLadvancedDifficulty: advanced300 XP~45 min5 checksPostGIS / SQLadvancedDifficulty: advanced
A point-in-polygon audit that exposes what 1:50m generalisation does to a coastline — and which places the attribute and the geometry disagree about.
You hand in a spatial SQL query.
Datasets
- Populated places · Point · 1,251 features · EPSG:4326
- Countries · MultiPolygon · 241 features · EPSG:4326
What you’ll do
- Join points to the polygon containing them with an outer join
- Compare an attribute to a derived value with NULL-safe semantics
- Return the disagreement list, including the points nothing contains
ST_Containsouter joinIS DISTINCT FROMgeneralisationdata qualityAlso trains Data ManagementOpen problem - Not started, Build an earthquake contact reconnaissance queueProjectDecision support3 stepsSpatial AnalysisadvancedDifficulty: advanced550 XP~95 min12 checksSpatial AnalysisadvancedDifficulty: advanced
Screen strong shallow events, quantify airfield and settlement proximity, and hand over a traceable contact map.
Worked in 3 steps, each checked before the next one opens.
- Select the event queue · SQL
- Measure contact gaps · Answers
- Hand over the access map · Python
Datasets
- Global M5.5+ earthquakes, Jan–Mar 2025 · Point · 86 features · EPSG:4326
- World airports · Point · 893 features · EPSG:4326
- Populated places · Point · 1,251 features · EPSG:4326
What you’ll do
- Select a reproducible event queue in SQL
- Measure two independent global proximity indicators
- Deliver an auditable access map with an explicit contact-gap distinction
projectUSGSnearest neighbourlogisticsglobalAlso trains Python, Data Management, CartographyOpen project - Not started, Classify a map where most of the values are zeroCartographyAnswersCartographyadvancedDifficulty: advanced290 XP~45 min6 checksCartographyadvancedDifficulty: advanced
Quantile breaks collapse on a distribution dominated by zeros. Measure how, on the river-kilometres-per-country table, and say what a map maker should do instead.
You hand in your answers as values.
Datasets
- Countries · MultiPolygon · 241 features · EPSG:4326
- Rivers and lake centrelines · LineString · 461 features · EPSG:4326
What you’ll do
- Reproduce a derived per-country measure
- Compute quantile and equal-interval breaks on a zero-heavy distribution
- Quantify how each scheme distributes the countries
choroplethclassificationquantileszero-inflatedhydrologyAlso trains Python, Spatial AnalysisOpen problem - Not started, Defend a borough greening shortlistProjectDecision support3 stepsRemote SensingadvancedDifficulty: advanced620 XP~110 min13 checksRemote SensingadvancedDifficulty: advanced
Measure canopy and summer vegetation on their own grids, then add low-ground context and apply one transparent shortlist rule.
Worked in 3 steps, each checked before the next one opens.
- Audit the vegetation rasters · Answers
- Deliver the borough evidence table · Dataset file
- Add low-ground context and shortlist · GeoJSON
Datasets
- Greater London land cover 2021 (ESA WorldCover 10 m) · Raster · EPSG:4326
- Greater London, Sentinel-2 red and NIR, 11 July 2025 · Raster · EPSG:32630
- Greater London elevation (Copernicus DEM GLO-30) · Raster · EPSG:4326
- London boroughs · Polygon · 33 features · EPSG:4326
What you’ll do
- Audit the two vegetation measures from observed raster pixels
- Hand over a per-borough canopy and NDVI table as a GIS file
- Add area-weighted low ground and an explicit shortlist flag
zonal statisticsNDVIland coverDEMmulti-criteriaLondonAlso trains Spatial Analysis, Data ManagementOpen project - Not started, Deliver a compact sewer review mapProjectWeb delivery3 stepsWeb GISadvancedDifficulty: advanced580 XP~90 min9 checksWeb GISadvancedDifficulty: advanced
Extract a review cohort, make its browser payload inspectable, and measure the transfer budget.
Worked in 3 steps, each checked before the next one opens.
- Extract the review cohort · SQL
- Prepare the browser layer · Python
- Measure the transfer budget · Answers
Dataset
- NYC 311 sewer requests, 1–7 June 2025 · Point · 408 features · EPSG:4326
What you’ll do
- Query the exact review cohort
- Serve a compact, inspectable WGS 84 point layer
- Measure raw and compressed payload size from the delivered layer
NYC 311urban servicestemporal GISheat mapGeoPandasAlso trains PostGIS / SQL, PythonOpen project - Not started, Deliver a field-ready public asset registerProjectData preparation4 stepsData ManagementadvancedDifficulty: advanced600 XP~105 min17 checksData ManagementadvancedDifficulty: advanced
Merge two open asset extracts into a quality-controlled GeoPackage for field inspection.
Worked in 4 steps, each checked before the next one opens.
- Audit both incoming sources · Answers
- Build the common asset model · Dataset file
- Verify and round coordinates · GeoJSON
- Package and verify the handover · Dataset file
Datasets
- Melbourne toilet source · Point · 7 features · EPSG:4326
- Melbourne drinking-water source · Point · 21 features · EPSG:4326
What you’ll do
- Profile and reconcile two source layers without multiplying assets.
- Normalise access without representing unknown status as public.
- Deliver a reproducible, typed WGS 84 GeoPackage handover.
data-preparationprojectgeopackagemelbournehandoverAlso trains Spatial Analysis, CartographyOpen project - Not started, Deliver an access-safe public toilet layerData preparationDataset fileData ManagementadvancedDifficulty: advanced365 XP~55 min6 checksData ManagementadvancedDifficulty: advanced
Classify access honestly and deliver a typed projected GeoPackage without null locations.
You hand in a prepared dataset file.
Dataset
- Amsterdam toilet access staging · Point · 14 features · EPSG:4326
What you’ll do
- Distinguish missing access from public access.
- Preserve first-source precedence and drop null geometry.
- Deliver a named GeoPackage in the receiving CRS.
data-preparationamsterdamfileAlso trains Spatial AnalysisOpen problem - Not started, Design the global event map and detail serviceGeospatial systemsDecisionsGIS ArchitectureadvancedDifficulty: advanced430 XP~65 min6 checksGIS ArchitectureadvancedDifficulty: advanced
Separate a frequently refreshed spatial overview from authoritative event details and revision history.
You hand in a set of design decisions.
Dataset
- Global M5.5+ earthquakes, Jan–Mar 2025 · Point · 86 features · EPSG:4326
What you’ll do
- Size the cost of browser fan-out against the measured snapshot
- Choose a shared ingestion and overview delivery pattern
- Separate global summary from per-event detail
system designUSGSGeoJSON feedcacheevent revisionsglobalAlso trains Web GIS, Data ManagementOpen problem - Not started, Design the searchable imagery archiveGeospatial systemsDecisionsGIS ArchitectureadvancedDifficulty: advanced460 XP~70 min5 checksGIS ArchitectureadvancedDifficulty: advanced
Choose a search, storage, preview and revision pattern for an imagery service with reproducible results.
You hand in a set of design decisions.
Dataset
- Greater London, Sentinel-2 red and NIR, 11 July 2025 · Raster · EPSG:32630
What you’ll do
- Separate scene discovery from pixel storage and map rendering
- Select an access pattern suited to small viewport reads and flexible band expressions
- Preserve exact-version provenance through corrections
system designSTACcloud optimized GeoTIFFraster tilesprovenanceAlso trains Remote Sensing, Data Management, Web GISOpen problem - Not started, How much of each state is built up?Spatial analysisPythonPythonadvancedDifficulty: advanced320 XP~55 min5 checksPythonadvancedDifficulty: advanced
Overlay the urban footprints on the states in an equal-area projection and credit each side of a state line only what lies on it.
You hand in a Python script.
Datasets
- United States states · Polygon · 51 features · EPSG:4326
- Urban areas · Polygon · 2,143 features · EPSG:4326
What you’ll do
- Reproject both layers to an equal-area CRS
- Clip the urban footprints to the states with an overlay
- Sum clipped area per state and express it as a share of the state's area
GeoPandasoverlayequal-areaAlbersland useAlso trains Spatial Analysis, Data ManagementOpen problem - Not started, Mean NDVI per borough, across a projection boundaryRaster analysisGeoJSONRemote SensingadvancedDifficulty: advanced300 XP~50 min7 checksRemote SensingadvancedDifficulty: advanced
Zonal statistics where the raster is in UTM and the polygons are in WGS 84: reproject the right layer, compute the index per borough, and hand back a map.
You hand in a GeoJSON result.
Datasets
- Greater London, Sentinel-2 red and NIR, 11 July 2025 · Raster · EPSG:32630
- London boroughs · Polygon · 33 features · EPSG:4326
What you’ll do
- Recognise a CRS mismatch between a raster and a vector layer
- Reproject the vector layer rather than resample the raster
- Compute a per-zone mean of a derived index
NDVIzonal statisticsCRSUTMSentinel-2LondonAlso trains Spatial Analysis, Data ManagementOpen problem - Not started, Model event and airfield condition checksGeospatial systemsSchemaData ManagementadvancedDifficulty: advanced520 XP~85 min12 checksData ManagementadvancedDifficulty: advanced
Design a PostGIS schema that keeps earthquake events, airfields and repeated condition checks traceable.
You hand in a database schema (DDL).
What you’ll do
- Model stable event and airfield identities with timestamped condition observations
- Declare point type and WGS 84 SRID at the database boundary
- Build spatial and chronological indexes that support the response dashboard
projectPostGISschemadata engineeringemergency responseAlso trains PostGIS / SQL, GIS ArchitectureOpen problem - Not started, Plan a cycle redistribution shiftProjectDecision support3 stepsSpatial AnalysisadvancedDifficulty: advanced600 XP~100 min11 checksSpatial AnalysisadvancedDifficulty: advanced
Classify the dock snapshot, propose bounded bike moves, and size the resulting shift with its unserved stations visible.
Worked in 3 steps, each checked before the next one opens.
- Classify the snapshot · SQL
- Map feasible transfers · GeoJSON
- Size the preliminary shift · Answers
Dataset
- Santander Cycles docking stations (live snapshot) · Point · 799 features · EPSG:4326
What you’ll do
- Classify full and empty active stations in SQL
- Build a bounded nearest-source transfer map
- Size a shift and report unserved empties from the same rules
nearest neighbouroperationscapacityCRStransportLondonAlso trains Data Management, GIS ArchitectureOpen project
48 of 59 problems shown