All thirty days

Day 8: Utopia

902 official place names in Canada that promise a paradise, a happiness, a hope or a fortune, and unmap's fastest drive from Utopia, Ontario to Paradise, Newfoundland and Labrador.

utopia.json
Loading 902 names
Show or hide
Click a dot or the line.

Canada has 11 official names that say Utopia outright: nine Utopias, from a hamlet near Barrie to a lake in New Brunswick, and two Lacs de l'Utopie in Quebec. Around them are 891 more names that hope out loud, sorted here into four families: 318 paradises (Paradise, Eden, Canaan, Zion, Valhalla), 116 happinesses (Happy, Joy, Bliss, Bonheur), 325 hopes and peaces (Hope, Espoir, Peace, Harmony, Providence) and 143 fortunes (Eureka, Eldorado, Bonanza).

The magenta line is the fastest drive from Utopia, Ontario to Paradise, Newfoundland and Labrador: 3,171 km and 36 h 57 min by unmap's estimate, ferry across the Cabot Strait included. On the way it passes within 5 km of 35 other hopeful names, among them Port Hope, Mount Zion, Canaan Rapids, Marshy Hope and, near the end, the Isthmus of Avalon.

Quebec has the most names, 262, but read them with care: Paradis is a common Quebec surname, and many of the province's 91 Paradis names may honour a family rather than a dream. Newfoundland and Labrador has 25 of the 116 happy names, second only to Quebec: Heart's Content, Heart's Delight, Happy Adventure.

British Columbia has the most fortunes, 37, and the Yukon keeps the most famous pair: Bonanza Creek and Eldorado Creek, in the Klondike. The northernmost name is Eureka, a weather station at 80° north on Ellesmere Island. And one name on the map was given to a real attempt at utopia: Sointula, on Malcolm Island in British Columbia, Finnish for harmony, founded in 1901 by Finnish settlers as a commune.

How it's made

One basemap and one layer. This is the whole map, minus the legend.

import { Unmap, createMap } from '@unmap/sdk'

const key = 'um_pk_live_...'
const unmap = new Unmap({ key })

// Keep an official name when a hopeful word appears in it as a whole word.
const families = {
  paradise: ['utopia', 'paradise', 'paradis', 'eden', 'canaan', 'zion', 'valhalla' /* ... */],
  happiness: ['happy', 'joy', 'bliss', 'delight', 'content', 'bonheur' /* ... */],
  harmony: ['hope', 'espoir', 'peace', 'paix', 'harmony', 'providence', 'sointula' /* ... */],
  fortune: ['eureka', 'eldorado', 'bonanza', 'success', 'fortune' /* ... */],
}
const word = (w) => new RegExp('(?<!\\p{L})' + w + '(?!\\p{L})', 'iu') // so Hopedale is not Hope
const family = (name) => Object.keys(families).find((f) => families[f].some((w) => word(w).test(name)))
const hopeful = names.filter((n) => family(n.name)) // names: Day 6's CGNDB file

// The fastest drive from Utopia, Ontario to Paradise, Newfoundland and Labrador.
const route = await unmap.router.route([-79.837, 44.329], [-52.884, 47.535], { mode: 'car' })

const map = createMap({ key, container: '#map', style: 'muted' })
map.on('load', () => {
  const labels = map.getStyle().layers.find((l) => l.type === 'symbol').id
  map.addSource('names', { type: 'geojson', data: toPoints(hopeful) })
  map.addLayer({ id: 'names', type: 'circle', source: 'names',
    paint: { 'circle-color': ['match', ['get', 'family'],
      'paradise', '#F2B84B', 'happiness', '#B58CFF', 'harmony', '#4FB3E8', '#7DD87F'] } }, labels)
  map.addSource('route', { type: 'geojson', data: route.geometry })
  map.addLayer({ id: 'route', type: 'line', source: 'route',
    paint: { 'line-color': '#FF3E9A', 'line-width': 3 } }, labels) // over the dots, under the place names
})

The names are Day 6's file of every official name in the Canadian Geographical Names Database. A script keeps a name when one of 46 English and French words appears in it as a whole word, so Hopedale does not count, and sorts it by that word into one of four families. The match reads words, not reasons: it cannot tell Hope Lake named for hope from one named for a Mr. Hope, and it misses names in Indigenous languages with the same meaning, because the database does not translate them. Eight names whose word is plainly part of a person's name, such as Sainte-Félicité and Parc Rosa-Bonheur, are left out. The drive is one request to unmap's routing API by car. The routing graph covers Canada only, so the drive cannot cut through Maine, and the ferry time is the engine's estimate, with no wait for a sailing.

Data

  • Names: Canadian Geographical Names Database, Natural Resources Canada. Contains information licensed under the Open Government Licence - Canada.
  • Route: unmap routing on OpenStreetMap data, © OpenStreetMap contributors (ODbL).
  • Basemap: unmap, © OpenStreetMap contributors.

Share this map

Post it, or make your own and tag it #30DayMapChallenge.