{"id":"696bf038eb6062fd2870c795","title":"2026 01 17 Issue 104","path":"how-to/committee/release-notes/2026-01-17-issue-104","contentMarkdown":"# 17-Jan-2026 — Added reverse geocoding for walks missing locations [ref: #104](https://github.com/nbarrett/ngx-ramblers/issues/104)\n\n  ## [build 424](https://github.com/nbarrett/ngx-ramblers/actions/runs/21100215074) — [commit 5a382cc](https://github.com/nbarrett/ngx-ramblers/commit/5a382ccd3542ff449a8deb0a3bc1785a49a8c70d)\n\n  ---\n\n### Migration & Data Population\n\n  - **Reverse geocoding migration**: A database migration was applied to any events that were missing locations from lat/lng coordinates using postcodes.io API. Also populates grid references, locations, and corrects invalid end times. Locations are extracted from walk events using several methods, prioritised by accuracy:\n    - **Coordinates (`coordinates`)** — Direct latitude/longitude values provided in the event data. This is the most precise method as it requires no geocoding lookup.\n    - **Postcode (`postcode`)** —  UK postcode extracted from event text (e.g., \"SG4 7TY\"). The system uses postcodes.io to convert this to coordinates, grid references, and locality information.\n    - **Grid Reference (`grid-reference`)** — Ordnance Survey grid reference extracted from event text (e.g., \"TL 192 288\" or \"TL192288\"). Supports 6, 8, and 10-figure references. Converted to coordinates via grid reference lookup services.\n    - **Place Name (`place-name`)** — Named location extracted from event text (e.g., \"Hitchin\", \"Royston Heath\"). Uses geocoding services to resolve to coordinates. Less precise than postcodes or grid references as place names can be ambiguous.\n    - **Title Extraction (`title-extraction`)** — Location inferred from the walk title itself (e.g., \"Afternoon walk from Hitchin station\"). The extractor parses common patterns like \"walk from [location]\" or \"Meet at [location]\" to identify starting points and trims parentheses for cleaner start location storage.\n    - **Start Location (`start-location`)** — Location data inherited from an existing `start_location` field on the event, typically populated from Ramblers Walks Manager imports or previous manual entry. Used when migrating or validating existing data.\n  - **Event history logging**: Data migrations now write events to walk history showing fields changed, including geocoding failures for diagnostic purposes.\n  ### Location & Search Improvements\n  - **\"No location details\"**: Advanced search toggle now provides additional checkbox to filter events with no location details. Filter only matches walks truly lacking coordinates or postcodes (missing latitude/longitude/postcode/grid reference).\n\n\n![](https://ngx-ramblers.org.uk/api/aws/s3/site-content/c85d2635-d2ba-4e25-a7f7-fd5557e163cc.jpeg)\n\n### Walk Navigation & History\n\n  - **New \"View\" button**: Walk views now show a view button for members with walk admin privileges, providing read-only access to all NGX-Ramblers fields. Event history view available at `walks/view/<slug>?tab=history`.\n  - **Rebuilt history view**: Walk edit history expanded for clearer display of field changes . Each row now uses a show/hide accordion which one expanded shows field-level change tables with from/to values. \n  - **Revert capability**: Added \"revert to this version\" for sites with local walk population.\n\n\n![](https://ngx-ramblers.org.uk/api/aws/s3/site-content/4f25f871-d585-4a2f-8ffb-64c6c2b8d04b.jpeg)\n\n - **JSON event copy**: Walk edit action row now offers copy JSON to clipboard facility to help diagnose location or migration changes (useful for bug reporting).\n\n![](https://ngx-ramblers.org.uk/api/aws/s3/site-content/c991ab25-7cec-49cf-af53-f7d91a6f1738.jpeg)\n\n  ### Maintenance Admin Changes\n  - Applied/Failed and Duration column added to present migration statistics in a cleaner, more readable table.\n\n![](https://ngx-ramblers.org.uk/api/aws/s3/site-content/7cd5841b-0333-42bf-ad0f-eadc8805754f.jpeg)\n\n\n\n  ### Refactoring & Code Quality\n  - **Data safety**: `WalksAndEventsService` consistently reads/deletes from local store to avoid cross-population confusion; `edit-group-event-images` guards against missing fields.\n  - **Centralised map style selection**: Single `OSMapStyle` record with zoom calculation flags (`is27700`, `is3857`) and key lookup. All map controls/services now consult this record for consistent behaviour across walk-edit, walk list, dynamic-content maps, and admin controls.\n  - **Enum consolidation**: Migrated enums/string unions (map providers, backup/session/status/payloads, markdown list types, route profiles, input sizes, AGM stats/tabs, sorting, migration modes, location statuses) into model files. All enums now use kebab-case values and are shared between frontend and server.\n  - **Helper consolidation**: Standalone `entries` helper moved to `functions/object-utils.ts` using `keys` from es-toolkit/compat.\n  - **Mailchimp types**: Updated to export const objects + union types matching official SDK shape exactly, enabling `lists.batchListMembers` calls without type errors.\n  - **DRY improvements**: Shared model files for backup/session configs; server imports rely only on frontend model definitions.\n  - **Consistent location extraction**: Data pipeline now uses standardised `GeocodeMatchType` (kebab-case values) everywhere. ","contentHtml":"<h1>17-Jan-2026 — Added reverse geocoding for walks missing locations <a href=\"https://github.com/nbarrett/ngx-ramblers/issues/104\">ref: #104</a></h1>\n<h2><a href=\"https://github.com/nbarrett/ngx-ramblers/actions/runs/21100215074\">build 424</a> — <a href=\"https://github.com/nbarrett/ngx-ramblers/commit/5a382ccd3542ff449a8deb0a3bc1785a49a8c70d\">commit 5a382cc</a></h2>\n<hr>\n<h3>Migration &amp; Data Population</h3>\n<ul>\n<li><strong>Reverse geocoding migration</strong>: A database migration was applied to any events that were missing locations from lat/lng coordinates using postcodes.io API. Also populates grid references, locations, and corrects invalid end times. Locations are extracted from walk events using several methods, prioritised by accuracy:<ul>\n<li><strong>Coordinates (<code>coordinates</code>)</strong> — Direct latitude/longitude values provided in the event data. This is the most precise method as it requires no geocoding lookup.</li>\n<li><strong>Postcode (<code>postcode</code>)</strong> —  UK postcode extracted from event text (e.g., &quot;SG4 7TY&quot;). The system uses postcodes.io to convert this to coordinates, grid references, and locality information.</li>\n<li><strong>Grid Reference (<code>grid-reference</code>)</strong> — Ordnance Survey grid reference extracted from event text (e.g., &quot;TL 192 288&quot; or &quot;TL192288&quot;). Supports 6, 8, and 10-figure references. Converted to coordinates via grid reference lookup services.</li>\n<li><strong>Place Name (<code>place-name</code>)</strong> — Named location extracted from event text (e.g., &quot;Hitchin&quot;, &quot;Royston Heath&quot;). Uses geocoding services to resolve to coordinates. Less precise than postcodes or grid references as place names can be ambiguous.</li>\n<li><strong>Title Extraction (<code>title-extraction</code>)</strong> — Location inferred from the walk title itself (e.g., &quot;Afternoon walk from Hitchin station&quot;). The extractor parses common patterns like &quot;walk from [location]&quot; or &quot;Meet at [location]&quot; to identify starting points and trims parentheses for cleaner start location storage.</li>\n<li><strong>Start Location (<code>start-location</code>)</strong> — Location data inherited from an existing <code>start_location</code> field on the event, typically populated from Ramblers Walks Manager imports or previous manual entry. Used when migrating or validating existing data.</li>\n</ul>\n</li>\n<li><strong>Event history logging</strong>: Data migrations now write events to walk history showing fields changed, including geocoding failures for diagnostic purposes.</li>\n</ul>\n<h3>Location &amp; Search Improvements</h3>\n<ul>\n<li><strong>&quot;No location details&quot;</strong>: Advanced search toggle now provides additional checkbox to filter events with no location details. Filter only matches walks truly lacking coordinates or postcodes (missing latitude/longitude/postcode/grid reference).</li>\n</ul>\n<p><img src=\"https://ngx-ramblers.org.uk/api/aws/s3/site-content/c85d2635-d2ba-4e25-a7f7-fd5557e163cc.jpeg\" alt=\"\"></p>\n<h3>Walk Navigation &amp; History</h3>\n<ul>\n<li><strong>New &quot;View&quot; button</strong>: Walk views now show a view button for members with walk admin privileges, providing read-only access to all NGX-Ramblers fields. Event history view available at <code>walks/view/&lt;slug&gt;?tab=history</code>.</li>\n<li><strong>Rebuilt history view</strong>: Walk edit history expanded for clearer display of field changes . Each row now uses a show/hide accordion which one expanded shows field-level change tables with from/to values. </li>\n<li><strong>Revert capability</strong>: Added &quot;revert to this version&quot; for sites with local walk population.</li>\n</ul>\n<p><img src=\"https://ngx-ramblers.org.uk/api/aws/s3/site-content/4f25f871-d585-4a2f-8ffb-64c6c2b8d04b.jpeg\" alt=\"\"></p>\n<ul>\n<li><strong>JSON event copy</strong>: Walk edit action row now offers copy JSON to clipboard facility to help diagnose location or migration changes (useful for bug reporting).</li>\n</ul>\n<p><img src=\"https://ngx-ramblers.org.uk/api/aws/s3/site-content/c991ab25-7cec-49cf-af53-f7d91a6f1738.jpeg\" alt=\"\"></p>\n<h3>Maintenance Admin Changes</h3>\n<ul>\n<li>Applied/Failed and Duration column added to present migration statistics in a cleaner, more readable table.</li>\n</ul>\n<p><img src=\"https://ngx-ramblers.org.uk/api/aws/s3/site-content/7cd5841b-0333-42bf-ad0f-eadc8805754f.jpeg\" alt=\"\"></p>\n<h3>Refactoring &amp; Code Quality</h3>\n<ul>\n<li><strong>Data safety</strong>: <code>WalksAndEventsService</code> consistently reads/deletes from local store to avoid cross-population confusion; <code>edit-group-event-images</code> guards against missing fields.</li>\n<li><strong>Centralised map style selection</strong>: Single <code>OSMapStyle</code> record with zoom calculation flags (<code>is27700</code>, <code>is3857</code>) and key lookup. All map controls/services now consult this record for consistent behaviour across walk-edit, walk list, dynamic-content maps, and admin controls.</li>\n<li><strong>Enum consolidation</strong>: Migrated enums/string unions (map providers, backup/session/status/payloads, markdown list types, route profiles, input sizes, AGM stats/tabs, sorting, migration modes, location statuses) into model files. All enums now use kebab-case values and are shared between frontend and server.</li>\n<li><strong>Helper consolidation</strong>: Standalone <code>entries</code> helper moved to <code>functions/object-utils.ts</code> using <code>keys</code> from es-toolkit/compat.</li>\n<li><strong>Mailchimp types</strong>: Updated to export const objects + union types matching official SDK shape exactly, enabling <code>lists.batchListMembers</code> calls without type errors.</li>\n<li><strong>DRY improvements</strong>: Shared model files for backup/session configs; server imports rely only on frontend model definitions.</li>\n<li><strong>Consistent location extraction</strong>: Data pipeline now uses standardised <code>GeocodeMatchType</code> (kebab-case values) everywhere.</li>\n</ul>\n"}