Skip to main content

Get Started

Installation​

npm install @deck.gl-community/editable-layers

You'll also need deck.gl and a base map provider:

npm install deck.gl @deck.gl/react @deck.gl/core @deck.gl/layers maplibre-gl react-map-gl

Quick Overview of the API​

EditableGeoJsonLayer​

EditableGeoJsonLayer is implemented as a deck.gl layer. It provides the ability to view and edit multiple types of geometry formatted as GeoJSON (an open standard format for geometry) including polygons, lines, and points.

Edit Modes​

Edit modes control how the user interacts with features. Each mode defines a specific editing behavior:

  • View modes: ViewMode — Select features without editing
  • Draw modes: DrawPointMode, DrawLineStringMode, DrawPolygonMode, DrawRectangleMode, DrawCircleFromCenterMode, and more — Create new geometry by clicking on the map
  • Transform modes: ModifyMode, TranslateMode, RotateMode, ScaleMode — Modify existing geometry by dragging vertices or features
  • Measurement modes: MeasureDistanceMode, MeasureAreaMode, MeasureAngleMode — Measure distances, areas, and angles
  • Composite modes: CompositeMode, SnappableMode — Combine multiple modes or add snapping behavior

Set the mode via the mode prop on EditableGeoJsonLayer. See the Edit Modes API reference for the full list.

Callbacks​

When editing is enabled, the onEdit callback fires with details about each edit:

onEdit: ({updatedData, editType, editContext}) => {
// updatedData — the new FeatureCollection after the edit
// editType — 'addFeature', 'movePosition', 'removePosition', etc.
// editContext — mode-specific context (e.g. featureIndexes for addFeature)
setFeatures(updatedData);
}

Minimal Example​

import React, {useState} from 'react';
import DeckGL from '@deck.gl/react';
import {
EditableGeoJsonLayer,
DrawPolygonMode,
ViewMode
} from '@deck.gl-community/editable-layers';
import StaticMap from 'react-map-gl/maplibre';

const INITIAL_VIEW_STATE = {
longitude: -122.43,
latitude: 37.775,
zoom: 12
};

export function GeometryEditor() {
const [features, setFeatures] = useState({
type: 'FeatureCollection',
features: []
});
const [mode, setMode] = useState(() => DrawPolygonMode);
const [selectedFeatureIndexes, setSelectedFeatureIndexes] = useState([]);

const layer = new EditableGeoJsonLayer({
data: features,
mode,
selectedFeatureIndexes,
onEdit: ({updatedData}) => {
setFeatures(updatedData);
}
});

return (
<DeckGL
initialViewState={INITIAL_VIEW_STATE}
controller={{doubleClickZoom: false}}
layers={[layer]}
getCursor={layer.getCursor.bind(layer)}
>
<StaticMap mapStyle="https://basemaps.cartocdn.com/gl/positron-gl-style/style.json" />
</DeckGL>
);
}

See the getting-started example for a complete runnable version.

Widgets​

editable-layers ships deck.gl widgets that provide editing UI without requiring you to build custom React components.

EditModeTrayWidget​

Renders a tray of mode selection buttons. Pass it to the widgets prop on your DeckGL component:

import {EditModeTrayWidget, ViewMode, DrawPolygonMode} from '@deck.gl-community/editable-layers';

const trayWidget = new EditModeTrayWidget({
placement: 'top-left',
layout: 'vertical',
modes: [
{id: 'view', mode: ViewMode, label: 'View'},
{id: 'draw-polygon', mode: DrawPolygonMode, label: 'Polygon'}
],
onSelectMode: ({mode}) => setMode(mode)
});

<DeckGL widgets={[trayWidget]} ... />

EditorToolbarWidget​

Renders a toolbar with boolean operations (union, difference, intersection), clear, and export buttons:

import {EditorToolbarWidget} from '@deck.gl-community/editable-layers';

const toolbarWidget = new EditorToolbarWidget({
placement: 'bottom-left',
onSetBooleanOperation: (op) => setModeConfig(op ? {booleanOperation: op} : {}),
onClear: () => setFeatures({type: 'FeatureCollection', features: []}),
onExport: () => downloadGeoJson(features)
});

See the editor example for a full widgets-only editing setup, and the Widget API docs for the complete props reference.

See Also​