A suite of 3D-enabled data visualization overlays, suitable for react-map-gl
—
Quality
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Pending
The risk profile of this skill
React components and hooks for integrating deck.gl visualizations into React applications, providing declarative API patterns and lifecycle management.
Main React component for rendering deck.gl visualizations within React applications.
/**
* Main React component for deck.gl visualizations
* Provides declarative API for managing deck.gl instances
*/
const DeckGL: React.ForwardRefExoticComponent<
DeckGLProps & React.RefAttributes<DeckGLRef>
>;
interface DeckGLProps extends DeckProps {
/** CSS styles for the container */
style?: React.CSSProperties;
/** CSS class name for the container */
className?: string;
/** Child elements to render inside the container */
children?: React.ReactNode;
}
interface DeckGLRef {
/** Access to underlying Deck instance */
deck: Deck;
/** Pick objects at screen coordinates */
pickObject(opts: PickObjectOptions): PickingInfo | null;
/** Pick multiple objects at screen coordinates */
pickMultipleObjects(opts: PickMultipleObjectsOptions): PickingInfo[];
}Basic Usage:
import React from 'react';
import DeckGL from '@deck.gl/react';
import { ScatterplotLayer, MapView } from 'deck.gl';
function MyMap() {
const layers = [
new ScatterplotLayer({
id: 'scatter',
data: myData,
getPosition: d => d.coordinates,
getRadius: 100,
getFillColor: [255, 0, 0]
})
];
return (
<DeckGL
initialViewState={{
longitude: -122.4,
latitude: 37.8,
zoom: 10
}}
controller={true}
layers={layers}
style={{ width: '100%', height: '400px' }}
/>
);
}import React from 'react';
import DeckGL from '@deck.gl/react';
import { Map } from 'react-map-gl';
function MapboxDeckGL() {
return (
<DeckGL
initialViewState={{
longitude: -122.4,
latitude: 37.8,
zoom: 10
}}
controller={true}
layers={layers}
>
<Map
mapboxAccessToken={MAPBOX_ACCESS_TOKEN}
mapStyle="mapbox://styles/mapbox/light-v9"
/>
</DeckGL>
);
}import React from 'react';
import { GoogleMapsOverlay } from '@deck.gl/google-maps';
import { ScatterplotLayer } from 'deck.gl';
function GoogleMapsDeckGL() {
const overlay = new GoogleMapsOverlay({
layers: [
new ScatterplotLayer({
id: 'scatter',
data: myData,
getPosition: d => d.coordinates,
getRadius: 100,
getFillColor: [255, 0, 0]
})
]
});
// Add overlay to Google Maps instance
overlay.setMap(googleMapInstance);
return <div id="google-map" style={{ width: '100%', height: '400px' }} />;
}Pre-built React components for common UI controls.
/**
* Zoom control widget for React applications
*/
function ZoomWidget(props: ZoomWidgetProps): JSX.Element;
interface ZoomWidgetProps {
/** Widget ID */
id?: string;
/** Widget placement */
placement?: WidgetPlacement;
/** Custom style */
style?: React.CSSProperties;
/** Custom class name */
className?: string;
/** View ID for multi-view setups */
viewId?: string;
/** Zoom in label */
zoomInLabel?: string;
/** Zoom out label */
zoomOutLabel?: string;
/** Transition duration */
transitionDuration?: number;
}
/**
* Compass navigation widget for React applications
*/
function CompassWidget(props: CompassWidgetProps): JSX.Element;
interface CompassWidgetProps {
/** Widget ID */
id?: string;
/** Widget placement */
placement?: WidgetPlacement;
/** Custom style */
style?: React.CSSProperties;
/** Custom class name */
className?: string;
/** View ID for multi-view setups */
viewId?: string;
/** Transition duration */
transitionDuration?: number;
}
/**
* Fullscreen toggle widget for React applications
*/
function FullscreenWidget(props: FullscreenWidgetProps): JSX.Element;
interface FullscreenWidgetProps {
/** Widget ID */
id?: string;
/** Widget placement */
placement?: WidgetPlacement;
/** Custom style */
style?: React.CSSProperties;
/** Custom class name */
className?: string;
/** Enter fullscreen label */
enterLabel?: string;
/** Exit fullscreen label */
exitLabel?: string;
}
type WidgetPlacement =
| 'top-left'
| 'top-right'
| 'bottom-left'
| 'bottom-right'
| 'fill';/**
* Hook for managing widget state and interactions
*/
function useWidget<T extends Widget>(
widget: T,
viewId?: string
): {
widget: T;
viewId: string;
setViewState: (viewState: ViewState) => void;
};interface DeckGLContextValue {
/** Current deck instance */
deck?: Deck;
/** Current view state */
viewState?: ViewState;
/** View state setter */
setViewState?: (viewState: ViewState) => void;
/** Current viewport */
viewport?: Viewport;
}
const DeckGLContext: React.Context<DeckGLContextValue>;import React, { useState } from 'react';
import DeckGL from '@deck.gl/react';
import { ScatterplotLayer } from 'deck.gl';
interface DataPoint {
coordinates: [number, number];
size: number;
color: [number, number, number];
}
interface MapComponentProps {
data: DataPoint[];
}
function MapComponent({ data }: MapComponentProps) {
const [viewState, setViewState] = useState({
longitude: -122.4,
latitude: 37.8,
zoom: 10,
bearing: 0,
pitch: 0
});
const layers = [
new ScatterplotLayer({
id: 'scatter',
data,
getPosition: (d: DataPoint) => d.coordinates,
getRadius: (d: DataPoint) => d.size,
getFillColor: (d: DataPoint) => d.color,
radiusMinPixels: 5,
radiusMaxPixels: 100,
pickable: true
})
];
return (
<DeckGL
viewState={viewState}
onViewStateChange={({viewState}) => setViewState(viewState)}
controller={true}
layers={layers}
style={{ width: '100%', height: '600px' }}
onHover={(info) => {
// Handle hover events
console.log('Hovered:', info.object);
}}
onClick={(info) => {
// Handle click events
console.log('Clicked:', info.object);
}}
/>
);
}import React, { useState } from 'react';
import DeckGL from '@deck.gl/react';
import { MapView, OrbitView } from 'deck.gl';
function MultiViewComponent() {
const [viewState, setViewState] = useState({
map: {
longitude: -122.4,
latitude: 37.8,
zoom: 10
},
orbit: {
target: [0, 0, 0],
distance: 100,
rotationX: 0,
rotationOrbit: 0,
zoom: 1
}
});
const views = [
new MapView({
id: 'map',
x: '0%',
y: '0%',
width: '50%',
height: '100%',
controller: true
}),
new OrbitView({
id: 'orbit',
x: '50%',
y: '0%',
width: '50%',
height: '100%',
controller: true
})
];
return (
<DeckGL
views={views}
viewState={viewState}
onViewStateChange={({viewState}) => setViewState(viewState)}
layers={layers}
style={{ width: '100%', height: '600px' }}
/>
);
}import React, { useState } from 'react';
import DeckGL from '@deck.gl/react';
import { Map } from 'react-map-gl';
import { ScatterplotLayer } from 'deck.gl';
function MapboxIntegration() {
const [viewState, setViewState] = useState({
longitude: -122.4,
latitude: 37.8,
zoom: 10,
bearing: 0,
pitch: 0
});
const layers = [
new ScatterplotLayer({
id: 'scatter',
data: myData,
getPosition: d => d.coordinates,
getRadius: 100,
getFillColor: [255, 0, 0, 128],
pickable: true
})
];
return (
<DeckGL
viewState={viewState}
onViewStateChange={({viewState}) => setViewState(viewState)}
controller={true}
layers={layers}
style={{ width: '100%', height: '600px' }}
>
<Map
reuseMaps
mapStyle="mapbox://styles/mapbox/light-v9"
mapboxAccessToken={process.env.REACT_APP_MAPBOX_TOKEN}
/>
</DeckGL>
);
}import React from 'react';
import DeckGL, { ZoomWidget, CompassWidget, FullscreenWidget } from '@deck.gl/react';
function MapWithWidgets() {
return (
<div style={{ position: 'relative', width: '100%', height: '600px' }}>
<DeckGL
initialViewState={{
longitude: -122.4,
latitude: 37.8,
zoom: 10
}}
controller={true}
layers={layers}
style={{ width: '100%', height: '100%' }}
/>
<ZoomWidget placement="top-left" />
<CompassWidget placement="top-right" />
<FullscreenWidget placement="bottom-right" />
</div>
);
}import React from 'react';
import DeckGL from '@deck.gl/react';
import { Layer, PickingInfo } from 'deck.gl';
interface MapProps {
layers: Layer[];
onDataHover?: (info: PickingInfo) => void;
}
const TypedMap: React.FC<MapProps> = ({ layers, onDataHover }) => {
return (
<DeckGL
initialViewState={{
longitude: -122.4,
latitude: 37.8,
zoom: 10
}}
controller={true}
layers={layers}
onHover={onDataHover}
style={{ width: '100%', height: '400px' }}
/>
);
};The DeckGL component follows React lifecycle patterns:
Performance optimizations:
Install with Tessl CLI
npx tessl i tessl/npm-deck-gl