deck.gl Arc Layers
A deck.gl ArcLayer integrated into a MapLibre map, with hover and popup support.
Iowa
<MapLibre
style="https://basemaps.cartocdn.com/gl/positron-gl-style/style.json"
pitch={30}
center={[-100, 40]}
maxZoom={5}
bind:zoom
class="relative w-full aspect-[9/16] max-h-[70vh] sm:max-h-full sm:aspect-video"
standardControls
>
<GeoJson id="states-base" data={states} promoteId="GEOID">
<!-- We use the base map to provide the visuals, but this gives something to click. -->
<FillLayer
id="counties-click"
hoverCursor="pointer"
paint={{
'fill-color': '#000',
'fill-opacity': mode === 'showOne' ? hoverStateFilter(0, 0.1) : 0,
}}
manageHoverState
on:mousemove={(e) => {
if (mode === 'showOne') {
let newGeoId = e.detail.features[0]?.properties?.STATEFP;
if (newGeoId !== activeState) {
activeState = newGeoId;
hovered = null;
}
}
}}
/>
</GeoJson>
<DeckGlLayer
type={ArcLayer}
data={arcs.filter((a, i) => {
if (mode === 'showAll') return i < 50000;
return a.fromState === activeState || a.toState === activeState;
})}
bind:hovered
getSourcePosition={(d) => d.source}
getTargetPosition={(d) => d.target}
getSourceColor={(d) => d.sourceColor}
getTargetColor={(d) => d.targetColor}
autoHighlight={mode === 'showAll'}
highlightColor={[30, 255, 30]}
getWidth={mode === 'showAll' ? 5 : 1}
getHeight={clamp(3 / zoom, 0, 1)}
>
<Popup openOn="click" let:data>
From {data.fromName} to {data.toName}
</Popup>
</DeckGlLayer>
</MapLibre>