What this maps
Every named settlement (OSM place=city/town/village/hamlet/suburb) in
Finland, Sweden, and Vietnam, fetched via the workspace osmkit toolkit.
How a name is matched
Finland: the compound-final suffix of the single written word (longest curated suffix wins, casefolded). Vietnam: the first whitespace syllable, with tone marks and đ significant (Tân ≠ Tan, Đông ≠ Dong), Unicode-normalised.
Sweden: matched the same way as Finland — the compound-final suffix of the single written word, longest casefolded match wins, from a curated set of 10 Swedish morphemes (e.g. -sjö lake, -fors rapids, -vik bay, -berg hill, -näs cape, -by village).
Each place gets at most one morpheme. Unmatched places appear as faint dots so density and the gaps (e.g. Khmer/Cham/montagnard naming in the Vietnamese south and highlands) stay visible. The morpheme set is curated for the story, not exhaustive. Counts are as of the build date.
The Sweden ↔ Finland concept bridge
The bridge pairs morphemes that name the same landscape concept across the two languages — it does not introduce any new morphemes. Each side of every pair is one of the existing curated Finnish or Swedish morphemes already matched above. The six pairs:
- lake — Swedish -sjö ↔ Finnish -järvi
- rapids — Swedish -fors ↔ Finnish -koski
- bay — Swedish -vik ↔ Finnish -lahti
- hill — Swedish -berg ↔ Finnish -mäki
- cape — Swedish -näs ↔ Finnish -niemi
- village — Swedish -by ↔ Finnish -kylä
All six pairs are attested on both sides in the real data — there are 0 dead pairs (every morpheme in every pair occurs at least once in its country's settlements).
The unique-by-province lens
This lens asks a different question: which name-elements are confined to one province rather than spread across the country?
- Provinces:
admin_level=4boundary polygons, fetched viaosmkit/Overpass. - Spatial join: each settlement is assigned to a province by point-in-polygon.
- Element key: for Finland and Sweden, the casefolded last four characters of the name (a suffix proxy); for Vietnam, the first whitespace token (NFC normalised).
- Confinement rule: an element is "confined" when it occurs at least 3 times total and at least 70% of its occurrences fall in a single province.
- Province score: the count of distinct confined elements anchored to that province.
The 0.7 threshold was chosen against the live data — high enough that an element is genuinely local, low enough that real regional substrates survive. On the real data the top provinces are Varsinais-Suomi (Finland, 17), Västra Götalands län (Sweden, 62), and Đắk Lắk (Vietnam, 36) — the last carrying Central-Highlands substrate elements ea and krông.
Substrate glosses
A few Vietnamese elements come from older, non-Vietnamese tongues that show through where
one province names the world its own way. The unique-by-province drill panel lists each
confined element with its count× and the % falling in that
province — it does not print a gloss. Two glosses worth noting (not shown in the
UI):
- đăk — "water" (Bahnaric / Mon-Khmer); this element is confined in the live data, anchoring the Central-Highlands substrate.
- bản — "village" (Tai / Thái); included as background only — it does not meet the confinement rule in the current build.
These glosses are curated; verify before citing. They are offered as a reading aid for the substrate story, not as authoritative etymology.
The terrain layer
The faint geography under the dots is OpenStreetMap water, coastline, and rivers
(natural=water, natural=coastline, waterway=river),
simplified for display (~0.015° ≈ 1.7 km) and thresholded to drop minor features — tiny
ponds, sub-2 km coastline skerries, short river stubs — so only the geography that gives
a name its reason remains. It is deliberately not a basemap: no roads, no labels,
no tiles; only the physical ground a name sits on. Map framing uses stepped presets —
Whole country, Region, Cluster — rather than free pan, so each
view has a stable, named frame of reference. Terrain geometry © OpenStreetMap contributors.
The natural-feature analysis
A separate layer asks whether a name keeps its promise: when a place is called
"-lake", does it sit on a lake? The source is named natural features only — OSM
natural=water (lakes/ponds), natural=peak, natural=hill,
and waterway=river — each reduced to a single point. This is the one place in the
project where we assert what a name should sit on, and we do it through one small,
curated table:
- Finnish
-järvi→ water (lake),-joki→ river,-mäki→ hill,-vaara→ hill - Swedish
-sjö→ water (lake),-berg→ peak - Vietnamese
thủy→ water
Uncurated morphemes get no verdict — we don't guess what an unlisted name denotes.
The table is pinned to the baked data by a guard test, and dead mappings (the Vietnamese
sơn/hà/giang) were pruned because no named feature in the
data actually carried them.
Step 1 — truth of the name
A feature whose name's morpheme denotes a class that matches its OSM feature type is
truthful; a mismatch is a transplanted, fossil name. In Finland a
-järvi is a lake 99.96% of the time and a -joki a
river 96.7% — the name keeps its promise. But a -mäki is an OSM
natural=hill only 4.2% of the time, and a -vaara just
0.3%: those are fossil names carried onto settlements, not the hills
themselves. Sweden behaves the same way for its two suffixes — -sjö
99.7% truthful, -berg 97.6%.
Vietnam — the honest null
For Vietnam the analysis simply does not apply, and we say so. Vietnamese feature-names lead with topographic generics — Núi (mountain), Hồ (lake), Sông (river) — that the project's administrative-morpheme set doesn't read; only a single named feature matched a curated morpheme. We show the null rather than invent a story to fill it.
Step 2 — spread
For each real feature with a matched morpheme, we ask whether its truthful name echoes
in the settlements around it. Within a radius R = 0.1° (~11 km here, a planar-degree
approximation), spread_score = echoing settlements ÷ nearby settlements. The honest
caveat: spread is weak almost everywhere (Finland mean ≈ 0.07; most features have no echo
at all). A truthful feature-name rarely floods the town names around it — so the per-feature
truth view is the primary payoff, and spread is a modest secondary layer.
The features files are judged-only: they carry only the features the analysis can actually rate, not the unverdicted remainder. Each feature © OpenStreetMap contributors.