const capitals = [
{ name: 'Vienna', lon: 16.3738, lat: 48.2082, bloc: 'European Union' },
{ name: 'Bratislava', lon: 17.1077, lat: 48.1486, bloc: 'European Union' },
{ name: 'Budapest', lon: 19.0402, lat: 47.4979, bloc: 'European Union' },
{ name: 'Brussels', lon: 4.3517, lat: 50.8503, bloc: 'European Union' },
{ name: 'Amsterdam', lon: 4.9041, lat: 52.3676, bloc: 'European Union' },
{ name: 'Luxembourg', lon: 6.1319, lat: 49.6116, bloc: 'European Union' },
{ name: 'Paris', lon: 2.3522, lat: 48.8566, bloc: 'European Union' },
{ name: 'Berlin', lon: 13.405, lat: 52.52, bloc: 'European Union' },
{ name: 'Rome', lon: 12.4964, lat: 41.9028, bloc: 'European Union' },
{ name: 'Madrid', lon: -3.7038, lat: 40.4168, bloc: 'European Union' },
{ name: 'Warsaw', lon: 21.0122, lat: 52.2297, bloc: 'European Union' },
{ name: 'Stockholm', lon: 18.0686, lat: 59.3293, bloc: 'European Union' },
{ name: 'London', lon: -0.1276, lat: 51.5072, bloc: 'Outside the EU' },
{ name: 'Oslo', lon: 10.7522, lat: 59.9139, bloc: 'Outside the EU' },
{ name: 'Bern', lon: 7.4474, lat: 46.948, bloc: 'Outside the EU' },
{ name: 'Belgrade', lon: 20.4489, lat: 44.7866, bloc: 'Outside the EU' },
{ name: 'Reykjavík', lon: -21.9426, lat: 64.1466, bloc: 'Outside the EU' },
]
ApexMaps.registerPalette('capitals', {
kind: 'categorical',
stops: ['#2f6fd0', '#dd4d6a'],
})
const map = new ApexMaps(document.getElementById('map'), {
chart: { height: 580 },
geo: {
map: 'world/countries@50m',
projection: { name: 'azimuthalEqualArea', rotate: [-10, -52] },
view: { fit: [-25, 33, 45, 71], padding: 12 },
fill: '#e9edf4',
},
series: [
{
type: 'marker',
name: 'Capitals',
data: capitals,
shape: 'pin',
size: 15,
colorBy: 'bloc',
palette: 'capitals',
stroke: { color: '#141a22', width: 1.3 },
labels: { show: false },
cluster: {
radius: 34,
minPoints: 3,
size: [15, 26],
color: '#4a5568',
},
},
],
legend: { show: false },
tooltip: {
formatter: ({ name, value, datum }) =>
Array.isArray(datum)
? `<div style="font-weight:640">${value} capitals</div>` +
`<div style="opacity:.62">${datum
.slice(0, 3)
.map((m) => m?.name)
.filter(Boolean)
.join(', ')}${value > 3 ? ` and ${value - 3} more` : ''}</div>`
: `<div style="font-weight:640">${name}</div>` +
`<div style="opacity:.62">${datum?.bloc ?? ''}</div>`,
},
})
map.render()