demoMap = {
const regionSelector = vl.selectPoint()
.fields('Region')
.on('mouseover').nearest(true)
.clear('mouseout')
.bind('legend');
const teamSelector = vl.selectPoint()
.fields('Team')
.on('mouseover').nearest(true)
.clear('mouseout');
const colorScheme = 'category10';
const usMap = vl.markGeoshape({fill: 'rgb(225, 225, 225)', stroke: 'rgb(240, 240, 240)', strokeWidth: 1})
.data(vl.topojson(usBoundaries).feature('states'));
const foreign = vl.data(nbaLocations).key('Team').fields('Lat', 'Long');
const routes = vl.markRule({color: '#000', opacity: 0.35})
.data(nbaTeamConnections)
.transform(
vl.calculate("datum.OriginTeam").as("Team"),
vl.filter(teamSelector.empty(false)),
vl.lookup('OriginTeam').from(foreign),
vl.lookup('DestinationTeam').from(foreign).as('Lat2', 'Long2')
)
.encode(
vl.latitude().fieldQ('Lat'),
vl.longitude().fieldQ('Long'),
vl.latitude2().field('Lat2'),
vl.longitude2().field('Long2'),
vl.color().fieldN('Region'),
vl.opacity().if(regionSelector, vl.value(0.5)).value(0.1)
);
const logoLocations = vl.markImage({width: 30, height: 30, align: 'center'})
.data(nbaLocations)
.transform(
vl.lookup('Team').from(vl.data(nbaColorsAndLogos).key('Team').fields(['LogoSvgUrl']))
).encode(
vl.longitude().fieldQ('Long'),
vl.latitude().fieldQ('Lat'),
vl.url().fieldN('LogoSvgUrl'),
vl.opacity().if(regionSelector, vl.value(1)).value(0.1)
);
const textLocations = vl.markText({align: 'left', dx: 12, dy: -1, size: 13})
.data(nbaLocations)
.params(regionSelector, teamSelector)
.encode(
vl.longitude().fieldQ('Long'),
vl.latitude().fieldQ('AdjustedLat'),
vl.text().fieldN('Team'),
vl.color().fieldN('Region').scale({scheme: colorScheme}),
vl.opacity().if(regionSelector, vl.value(0.7)).value(0.1),
vl.size().if(teamSelector.empty(false), vl.value(14)).value(11)
);
return vl.layer(usMap, routes, logoLocations, textLocations)
.project(vl.projection('albersUsa'))
.width(900).height(500)
}