GeoData Lab / FIELD NOTES
Six units you can compute and challenge.
Verified university readings, original browser exercises and independent geometry evidence.
Start with a question you can test
Read a specific university lesson, write a prediction, compute an original exercise, then change an input in the workbench. These six units cover coordinate contracts, topology, spatial relations, optimization and measurement. The exercises are original Lab work, not copies or solutions of university assignments.
Two verified university course editions
Two published Helsinki course editions directly support geometry, CRS, spatial joins and reproducible programming. These are historical open materials, not a claim about 2026 enrollment.
2 courses shown
Automating GIS processes (AutoGIS) · GEOG-329-2
University of Helsinki · Department of Geosciences and Geography · Digital Geography Lab
- Edition / term
- 2024.0 · Autumn 2024 · teaching period II (archived edition)
- Published status
- Published; archive says last updated 2025-08-12
- Prerequisites
- Basic Python (for example GEOG-329-1); GEOG-G301 Introduction to advanced geoinformatics recommended by the course.
- Public reading
- Lessons, recorded videos and linked exercise instructions are openly readable. This Lab links readings; it does not reproduce or solve their assignments.
- Registration / payment
- Reading the public pages requires no registration or payment. University credits, grading, Discord and CSC Noppe access are separate institutional services; Finnish university student eligibility and enrollment apply. No current tuition/credit-fee claim is made.
- Archive caveat
- The archive contains an unresolved starting_date template. Use its 2024 general information, not that template, for term identification.
- Verified
- 2026-11-14
Geo-Python · GEOG-329-1 / GEOK3001
University of Helsinki · Department of Geosciences and Geography
- Edition / term
- 2025.0 · Autumn 2025 · teaching period I (archived edition)
- Published status
- Published; archive says last updated 2026-08-27
- Prerequisites
- No previous programming experience required.
- Public reading
- Tutorials, lesson pages, selected videos and exercise instructions are openly readable.
- Registration / payment
- Self-study reading is free and needs no registration. Helsinki students sign up under one course code for credit; grading and institutional cloud/chat access are separate. No current 2026 registration or fee availability is asserted.
- Archive caveat
- The 2025.0 homepage retains some 2023 schedule text; the general-info page explicitly names the 2025 teaching team. The archive version is pinned; this Lab does not infer a 2026 timetable.
- Verified
- 2026-11-14
Download structured course + unit catalog (JSON) · Public-page verification record
Public reading requires no course registration or payment. Credits, grading, institutional services and any current registration fees have separate conditions. No 2026 timetable is inferred from an archived page.
U1. Coordinate contract before computation
Read: Automating GIS processes (AutoGIS) · Lesson 2 · Map projections
Handling coordinate reference systems in Geopandas
Predict: Which of projected meters, plausible axis swaps and antimeridian coordinates can range validation detect?
Run U1. Inspect seven rejected inputs and the two accepted but semantically different [24,60] / [60,24] points. The private PROJ exercise converts EPSG:3067 to EPSG:4326 and checks a meter roundtrip.
Change one thing: In the workbench, import islands.geojson, add crs to a Feature, and analyze; then remove crs and swap a Point axis order. Relabeling cannot replace reprojection.
Check the expected behavior
CRS members and dateline extents are rejected. A plausible swap is accepted: metadata review remains necessary.
Owner-only source checkout equivalent:
node labs/geo/run-exercise.mjs coordinates
U2. Shells, holes and predicate choice
Read: Automating GIS processes (AutoGIS) · Lesson 3 · Point-in-polygon queries
How to check if point is inside a polygon? / shapely geometries
Predict: Is [1,3] on a hole edge inside, outside or on the boundary? What changes with covers versus contains?
Run U2, then probe [-1e-11,3] and [1e-11,3]. Read the separately recorded GEOS counterexample.
Change one thing: Open the islands workbench. Set probe [1,3], toggle boundary membership, then move to [4,4]. The location label and membership are different concepts.
Check the expected behavior
Hole edge is boundary; hole interior is outside. Both 1e-11 probes fall into the Lab tolerance band while GEOS distinguishes their sides.
Owner-only source checkout equivalent:
node labs/geo/run-exercise.mjs boundary
U3. Disconnected regions with one identity
Read: Automating GIS processes (AutoGIS) · Lesson 1 · Shapely and geometry objects
Multipolygons; Validity of geometries
Predict: Does the island [2,2]–[3,3] inside another component’s hole belong to the same feature? Is a gap covered by its envelope a member?
Run U3. The original archipelago has three strictly disjoint components and a hole. Contrast overlapping, nested, edge-touching and point-touching components.
Change one thing: Change the detached component from [8,0]–[10,2] to [5,0]–[7,2]. Analyze and explain the rejection before inspecting the saved validation rows.
Check the expected behavior
The island in a hole is accepted. Overlap is rejected. Point-touching is valid in GEOS but intentionally outside this stricter Lab subset.
Owner-only source checkout equivalent:
node labs/geo/run-exercise.mjs multipart
U4. A spatial join is a relation
Read: Automating GIS processes (AutoGIS) · Lesson 3 · Spatial join
Load input data; Join input layers (related official Exercise 3 is linked in the course navigation)
Predict: Nine points, two region IDs and four polygon components: how many pairs should remain with and without boundaries?
Run U4. Compare all region IDs for east, inspect empty lab_matches for hole, and verify the original input remains unchanged.
Change one thing: Use the islands input in Spatial join, export both boundary settings, and move east from [9,1] to [10.5,1]. Identify precisely which pairs disappear.
Check the expected behavior
Inclusive: 7 pairs / 6 points; strict: 4 pairs / 3 points. Moving east removes both of its pairs.
Owner-only source checkout equivalent:
node labs/geo/run-exercise.mjs join
U5. Prove the filter preserves answers
Read: Automating GIS processes (AutoGIS) · Lesson 1 · Convex hull and envelope
Envelope is a bounding rectangle; combine with Lesson 3 spatial join
Predict: Which points fool an envelope-only implementation, and which does a first-component implementation miss?
Run U5. Compare the real full scan with the real prefilter, then inspect two deliberately wrong algorithm controls.
Change one thing: Move gap to [8.25,1]. It now belongs to archipelago even though it still does not belong to overlap-zone. Recompute rather than relying on the old point ID.
Check the expected behavior
Scan and prefilter agree. Envelope-only falsely includes hole and gap. First-component-only misses island, east and the east vertex.
Owner-only source checkout equivalent:
node labs/geo/run-exercise.mjs prefilter
U6. Units, time and approximation error
Read: Geo-Python · Lesson 6 · Processing data with pandas II; Debugging your Python code
Parsing dates; supplement with notebooks/L6/debugging.html → Test your code with known outputs
Predict: For one longitude degree at 0° and 60° latitude, are degree distance, spherical meters and WGS84 ellipsoidal meters interchangeable?
Run U6. A five-point synthetic minute-spaced track has one isolated spike. The independent PROJ run compares the same two distance pairs against a sphere and WGS84.
Change one thing: In the original sample, change the speed threshold to 1 km/h and inspect candidates before exporting. A stricter threshold need not remove more isolated points.
Check the expected behavior
The original exercise flags two segments and index 2, retaining four points. Spherical and ellipsoidal distances differ; the saved values quantify only these two pairs.
Owner-only source checkout equivalent:
node labs/geo/run-exercise.mjs trajectory
Independent oracle: agreement and limits
The saved run executed the Lab JavaScript and an independent Shapely 2.0.6 / GEOS 3.11.4 oracle. 2,735 classifications across 5 region geometries (multipart, holes, a diagonal triangle, concavity and reversed winding) had zero unexpected mismatches. Fifteen hand-derived cases were checked against GEOS before the JavaScript comparison. This finite synthetic corpus is not a universal correctness proof.
Counterexamples stay visible: at x=±10⁻¹¹, y=3, the Lab reports boundary twice while GEOS reports outside / inside. The Lab retains a 10⁻¹⁰ degree numerical tolerance. Point-touching multipart geometry is valid in GEOS but deliberately rejected by this stricter implementation. Neither result certifies cadastral precision or GPS accuracy.
The join agrees with GEOS covers / contains (7 / 4 pairs). Envelope-only logic falsely includes hole and gap; first-component-only logic misses three covered points. Sixteen invalid or unsupported inputs are rejected; topology invalidity is distinguished from format and regional scope gates.
| Latitude | Sphere m | WGS84 ellipsoid m | Difference |
|---|---|---|---|
| 0° | 111195.080 | 111319.491 | -0.1118% |
| 60° | 55597.011 | 55799.470 | -0.3628% |
These are one-longitude-degree comparisons at two latitudes using independent PROJ, not a global error bound. The browser runs the small JavaScript engine; GEOS/PROJ values above are separately recorded observations, not live Python execution in this tab.
1. A point on the boundary
Load the synthetic sample. The polygon region-a has a hole; region-b overlaps it. In Geofence mode, click the coordinate plot or enter longitude and latitude. Try [114.3, 30.59] inside region-a, [114.3, 30.61] inside its hole, and [114.28, 30.60] on the exterior edge.
Toggle “Include boundary”. The reported geometric location stays “boundary”, while membership changes. A hole interior is outside; a hole edge is a boundary. Ring winding direction does not change this Lab’s point-location result.
2. Associate observations with regions
Switch to Spatial join. With boundaries included, the sample produces four point-polygon pairs from three matched points. The overlap point matches both regions. With boundaries excluded, the edge point no longer matches and three pairs remain.
Export the annotated GeoJSON. Every Point gets a lab_matches array containing all matches; original properties and other features are retained. The result table is capped at 500 visible pairs, while the export includes every computed match.
3. Measure a prefilter
Run the seeded benchmark below the workbench. It generates 1,500 points and 36 polygons with seed 42, then compares a full pair scan with a bounding-box prefilter. Both methods apply the same exact point-in-polygon test; the benchmark verifies identical match lists.
Each method warms up once and is measured five times in alternating order. The displayed time is the median and includes validation. Exact-test counts describe work avoided; elapsed times depend on browser, device, geometry and system load. A prefilter is not guaranteed to be faster for every input.
4. Inspect a trajectory spike
Switch to Trajectory. LineString features need properties.timestamps with one strictly increasing, timezone-qualified ISO timestamp per coordinate. The sample has one isolated jump at point index 2. At 120 km/h, both adjacent segments are fast but the bridge from point 1 to point 3 is plausible.
The review preview omits that isolated candidate. Amber shows the original; teal dashed shows the preview. Export the preview only after checking the flagged segments. A fast segment may be a real trip, a timestamp error or a coordinate error. This heuristic does not identify which explanation is true.
5. Bring your own data
Export a WGS84 GeoJSON FeatureCollection from your GIS workflow. Use explicit feature IDs so exported matches remain traceable. Import the file or paste its JSON, select the experiment, then choose Analyze input.
For trajectories, put one timezone-qualified timestamp per coordinate in properties.timestamps. Download the result after inspection; the tab does not retain files after closing. The entire workflow is available in this browser without installation, a map account or an API key.