Renders a deck.gl layer on top of a MapLibre map.
deck.gl is a WebGL visualisation library for large datasets. This component wires deck.gl layers into MapLibre GL JS from Phoenix LiveView.
The deck.gl packages are lazy-loaded the first time a layer mounts, so applications that never use this component pay nothing for it. They are optional peer dependencies — see the installation guide in the README.
Requires maplibre-gl v5
@deck.gl/mapbox reads MapLibre's internal map.transform, which
maplibre-gl v6 removed, and every published version still does. Under v6
this component raises with a message naming the constraint. The rest of
MaplibreX works on both v5 and v6.
Attributes
id(required) - Unique layer identifiermap_id(required) - Id of the map to render intolayer_type(required) - deck.gl layer type, e.g."ScatterplotLayer","ArcLayer"data(required) - List of records to visualiseprops- Layer-specific properties (default:%{})before_id- Insert the layer before this layer id (default:nil)opacity- Layer opacity, 0-1 (default:1.0)visible- Layer visibility (default:true)pickable- Whether the layer responds to pointer events (default:false)auto_highlight- Highlight objects on hover (default:false)update_triggers- deck.gl update triggers (default:%{})
Supported layer types
Basic layers
ScatterplotLayer- Points with a variable radiusArcLayer- Arcs between point pairsLineLayer- Lines and routesPolygonLayer- 2D polygonsPathLayer- PathsColumnLayer- 3D columnsTextLayer- Text labelsIconLayer- Icons
Aggregation layers
HexagonLayer- Aggregated hexagonal binsGridLayer- Grid cellsScreenGridLayer- Grid in screen coordinatesHeatmapLayer- HeatmapContourLayer- Contour lines
Advanced layers
GeoJsonLayer- GeoJSON rendering
Events
This component emits:
deckgl:layer_loaded- Layer loaded successfullydeckgl:click- An object in the layer was clickeddeckgl:hover- The pointer entered an objectdeckgl:drag_start- Drag started on an objectdeckgl:drag- Object is being draggeddeckgl:drag_end- Drag finisheddeckgl:error- The layer failed to process
Examples
A basic ScatterplotLayer:
<.deckgl_layer
id="points"
map_id="my-map"
layer_type="ScatterplotLayer"
data={@points}
pickable={true}
props={%{
"getPosition" => "coordinates",
"getRadius" => 1000,
"getFillColor" => [255, 140, 0],
"radiusMinPixels" => 2
}}
/>An ArcLayer visualising connections:
<.deckgl_layer
id="arcs"
map_id="my-map"
layer_type="ArcLayer"
data={@flights}
pickable={true}
auto_highlight={true}
props={%{
"getSourcePosition" => "from",
"getTargetPosition" => "to",
"getSourceColor" => [255, 140, 0],
"getTargetColor" => [255, 200, 0],
"getWidth" => 2
}}
/>A HexagonLayer showing density:
<.deckgl_layer
id="hexagons"
map_id="my-map"
layer_type="HexagonLayer"
data={@events}
props={%{
"getPosition" => "location",
"elevationScale" => 4,
"radius" => 200,
"extruded" => true,
"coverage" => 0.9
}}
/>Handling events
def handle_event("deckgl:click", %{"object" => object, "coordinate" => coord}, socket) do
# `object` holds the clicked feature's data, `coord` is [lng, lat]
{:noreply, socket}
end
def handle_event("deckgl:hover", %{"object" => object}, socket) do
{:noreply, assign(socket, :hovered_object, object)}
endAccessors
Accessors accept several forms:
# A string naming a property
"getPosition" => "coordinates" # d => d.coordinates
# A MapLibre-style expression
"getPosition" => ["get", "coords"] # d => d.coords
# A constant value
"getFillColor" => [255, 0, 0] # always redPerformance
For large datasets (>100k points):
- Prefer
HexagonLayerorGridLayeroverScatterplotLayer - Set
update_triggersso deck.gl only recomputes what changed - Filter data server-side before sending it to the client
- Reach for aggregation layers wherever they fit
References
- deck.gl documentation: https://deck.gl/docs
- Layer catalog: https://deck.gl/docs/api-reference/layers
Summary
Functions
Renders a deck.gl layer.
Functions
Renders a deck.gl layer.
Example
<.deckgl_layer
id="my-layer"
map_id="map"
layer_type="ScatterplotLayer"
data={@points}
props={%{"getPosition" => "coords"}}
/>Attributes
id(:string) (required) - Unique layer identifier.map_id(:string) (required) - Id of the map to render into.layer_type(:string) (required) - deck.gl layer type.data(:list) (required) - Records to visualise.props(:map) - Layer-specific properties. Defaults to%{}.before_id(:string) - Insert before this layer id. Defaults tonil.opacity(:float) - Opacity, 0-1. Defaults to1.0.visible(:boolean) - Layer visibility. Defaults totrue.pickable(:boolean) - Whether the layer responds to pointer events. Defaults tofalse.auto_highlight(:boolean) - Highlight objects on hover. Defaults tofalse.update_triggers(:map) - deck.gl update triggers. Defaults to%{}.