@deck.gl-community/leaflet 9.2.0-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2020 vis.gl a Series of LF Projects, LLC
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,118 @@
1
+ # @deck.gl-community/leaflet
2
+
3
+ This module allows [Leaflet](https://leafletjs.com/) to be used as a [deck.gl](https://deck.gl) basemap.
4
+
5
+ More precisely, it provides a Leaflet custom layer that wraps a deck.gl renderer, enabling deck.gl to render layers synchronized with the Leaflet basemap.
6
+
7
+ ## Installation
8
+
9
+ ```bash
10
+ npm install deck.gl @deck.gl-community/leaflet leaflet
11
+ ```
12
+
13
+ ## Usage
14
+
15
+ ```js
16
+ import {DeckLayer} from '@deck.gl-community/leaflet';
17
+ import {MapView} from '@deck.gl/core';
18
+ import {GeoJsonLayer, ArcLayer} from '@deck.gl/layers';
19
+ import * as L from 'leaflet';
20
+ import 'leaflet/dist/leaflet.css';
21
+
22
+ // source: Natural Earth http://www.naturalearthdata.com/ via geojson.xyz
23
+ const AIR_PORTS =
24
+ 'https://d2ad6b4ur7yvpq.cloudfront.net/naturalearth-3.3.0/ne_10m_airports.geojson';
25
+
26
+ // Create map
27
+ const map = L.map(document.getElementById('map'), {
28
+ center: [51.47, 0.45],
29
+ zoom: 4,
30
+ });
31
+ L.tileLayer('https://tiles.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}@2x.png', {
32
+ maxZoom: 22,
33
+ attribution:
34
+ '© <a href="https://carto.com/about-carto/" target="_blank" rel="noopener">CARTO</a>, © <a href="http://www.openstreetmap.org/about/" target="_blank">OpenStreetMap</a> contributors',
35
+ }).addTo(map);
36
+
37
+ // Add deck.gl overlay
38
+ const deckLayer = new DeckLayer({
39
+ views: [
40
+ new MapView({ repeat: true }),
41
+ ],
42
+ layers: [
43
+ new GeoJsonLayer({
44
+ id: 'airports',
45
+ data: AIR_PORTS,
46
+ // Styles
47
+ filled: true,
48
+ pointRadiusMinPixels: 2,
49
+ pointRadiusScale: 2000,
50
+ getPointRadius: (f) => 11 - f.properties.scalerank,
51
+ getFillColor: [200, 0, 80, 180],
52
+ // Interactive props
53
+ pickable: true,
54
+ autoHighlight: true,
55
+ onClick: (info) =>
56
+ // eslint-disable-next-line
57
+ info.object && alert(`${info.object.properties.name} (${info.object.properties.abbrev})`)
58
+ }),
59
+ new ArcLayer({
60
+ id: 'arcs',
61
+ data: AIR_PORTS,
62
+ dataTransform: (d: any) => d.features.filter((f) => f.properties.scalerank < 4),
63
+ // Styles
64
+ getSourcePosition: (f) => [-0.4531566, 51.4709959], // London
65
+ getTargetPosition: (f) => f.geometry.coordinates,
66
+ getSourceColor: [0, 128, 200],
67
+ getTargetColor: [200, 0, 80],
68
+ getWidth: 1
69
+ })
70
+ ],
71
+ getTooltip: (info) => info.object && info.object.properties.name
72
+ });
73
+ map.addLayer(deckLayer);
74
+ ```
75
+
76
+ ## API Reference
77
+
78
+ ### DeckLayer
79
+
80
+ An implementation of [L.Layer](https://leafletjs.com/reference.html#layer).
81
+
82
+ ```js
83
+ const deckLayer = new DeckLayer({
84
+ views: [
85
+ new MapView({ repeat: true }),
86
+ ],
87
+ layers: [...],
88
+ });
89
+ map.addLayer(deckLayer);
90
+ ```
91
+
92
+ The constructor accepts a props object that is passed to the [Deck](https://deck.gl/docs/api-reference/core/deck) constructor. See the [limitations](#supported-features-and-limitations) section below for more details.
93
+
94
+ The following [Deck methods](https://deck.gl/docs/api-reference/core/deck#methods) can be called directly from a `DeckLayer` instance:
95
+
96
+ - `deckLayer.setProps`
97
+ - `deckLayer.pickObject`
98
+ - `deckLayer.pickMultipleObjects`
99
+ - `deckLayer.pickObjects`
100
+
101
+ ## Supported Features and Limitations
102
+
103
+ Supported deck.gl features:
104
+
105
+ - Layers
106
+ - Effects
107
+ - Auto-highlighting
108
+ - Attribute transitions
109
+ - `onHover` and `onClick` callbacks
110
+ - Tooltip
111
+
112
+ Not supported features:
113
+
114
+ - Tilting
115
+ - Multiple views
116
+ - Controller
117
+ - React integration
118
+ - Gesture event callbacks (e.g. `onDrag*`)
@@ -0,0 +1,21 @@
1
+ import * as L from 'leaflet';
2
+ import type { Deck, DeckProps } from '@deck.gl/core';
3
+ import type { ViewOrViews } from "./deck-utils.js";
4
+ export declare class DeckLayer extends L.Layer {
5
+ #private;
6
+ props: DeckProps<ViewOrViews>;
7
+ _container: HTMLDivElement | undefined;
8
+ _deck: Deck<ViewOrViews> | undefined;
9
+ _animate: boolean | undefined;
10
+ constructor(props: DeckProps<ViewOrViews>);
11
+ onAdd(): this;
12
+ onRemove(_map: L.Map): this;
13
+ getEvents(): {
14
+ [name: string]: L.LeafletEventHandlerFn;
15
+ };
16
+ setProps(props: DeckProps): void;
17
+ pickObject(opts: Parameters<Deck['pickObject']>[0]): ReturnType<Deck['pickObject']>;
18
+ pickMultipleObjects(opts: Parameters<Deck['pickMultipleObjects']>[0]): ReturnType<Deck['pickMultipleObjects']>;
19
+ pickObjects(opts: Parameters<Deck['pickObjects']>[0]): ReturnType<Deck['pickObjects']>;
20
+ }
21
+ //# sourceMappingURL=deck-layer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deck-layer.d.ts","sourceRoot":"","sources":["../src/deck-layer.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAC;AAC7B,OAAO,KAAK,EAAC,IAAI,EAAE,SAAS,EAAC,MAAM,eAAe,CAAC;AAEnD,OAAO,KAAK,EAAC,WAAW,EAAC,wBAAqB;AAE9C,qBAAa,SAAU,SAAQ,CAAC,CAAC,KAAK;;IACpC,KAAK,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC;IAC9B,UAAU,EAAE,cAAc,GAAG,SAAS,CAAa;IACnD,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,GAAG,SAAS,CAAa;IACjD,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAa;gBAE9B,KAAK,EAAE,SAAS,CAAC,WAAW,CAAC;IAMzC,KAAK,IAAI,IAAI;IAmBb,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,GAAG,IAAI;IAc3B,SAAS,IAAI;QAAC,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC,qBAAqB,CAAA;KAAC;IActD,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAQhC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAQnF,mBAAmB,CACjB,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,GAC/C,UAAU,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAQ1C,WAAW,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;CAkHvF"}
@@ -0,0 +1,166 @@
1
+ // deck.gl-community
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+ import * as L from 'leaflet';
5
+ import { createDeckInstance, updateDeckView } from "./deck-utils.js";
6
+ export class DeckLayer extends L.Layer {
7
+ props;
8
+ _container = undefined;
9
+ _deck = undefined;
10
+ _animate = undefined;
11
+ constructor(props) {
12
+ super();
13
+ this.props = props;
14
+ }
15
+ onAdd() {
16
+ const pane = this.getPane();
17
+ if (!pane) {
18
+ return this;
19
+ }
20
+ this._container = L.DomUtil.create('div');
21
+ this._container.className = 'leaflet-layer';
22
+ if (this.#getZoomAnimated()) {
23
+ L.DomUtil.addClass(this._container, 'leaflet-zoom-animated');
24
+ }
25
+ pane.appendChild(this._container);
26
+ this._deck = createDeckInstance(this._map, this._container, this._deck, this.props);
27
+ this.#update();
28
+ return this;
29
+ }
30
+ onRemove(_map) {
31
+ if (!this._container || !this._deck) {
32
+ return this;
33
+ }
34
+ L.DomUtil.remove(this._container);
35
+ this._container = undefined;
36
+ this._deck.finalize();
37
+ this._deck = undefined;
38
+ return this;
39
+ }
40
+ getEvents() {
41
+ return {
42
+ viewreset: this.#reset.bind(this),
43
+ movestart: this.#onMoveStart.bind(this),
44
+ moveend: this.#onMoveEnd.bind(this),
45
+ zoomstart: this.#onZoomStart.bind(this),
46
+ zoom: this.#onZoom.bind(this),
47
+ zoomend: this.#onZoomEnd.bind(this),
48
+ ...(this.#getZoomAnimated()
49
+ ? { zoomanim: this.#onAnimZoom.bind(this) }
50
+ : {})
51
+ };
52
+ }
53
+ setProps(props) {
54
+ Object.assign(this.props, props);
55
+ if (this._deck) {
56
+ this._deck.setProps(props);
57
+ }
58
+ }
59
+ pickObject(opts) {
60
+ if (!this._deck) {
61
+ return null;
62
+ }
63
+ return this._deck.pickObject(opts);
64
+ }
65
+ pickMultipleObjects(opts) {
66
+ if (!this._deck) {
67
+ return [];
68
+ }
69
+ return this._deck.pickMultipleObjects(opts);
70
+ }
71
+ pickObjects(opts) {
72
+ if (!this._deck) {
73
+ return [];
74
+ }
75
+ return this._deck.pickObjects(opts);
76
+ }
77
+ #getMap() {
78
+ return this._map;
79
+ }
80
+ #getZoomAnimated() {
81
+ return this._zoomAnimated;
82
+ }
83
+ #update() {
84
+ if (!this._container || !this._deck) {
85
+ return;
86
+ }
87
+ if (this.#getMap()._animatingZoom) {
88
+ return;
89
+ }
90
+ const size = this.#getMap().getSize();
91
+ this._container.style.width = `${size.x}px`;
92
+ this._container.style.height = `${size.y}px`;
93
+ // invert map position
94
+ const offset = this.#getMap()._getMapPanePos().multiplyBy(-1);
95
+ L.DomUtil.setPosition(this._container, offset);
96
+ updateDeckView(this._deck, this._map);
97
+ }
98
+ #pauseAnimation() {
99
+ if (!this._deck) {
100
+ return;
101
+ }
102
+ if (this._deck.props._animate) {
103
+ this._animate = this._deck.props._animate;
104
+ this._deck.setProps({ _animate: false });
105
+ }
106
+ }
107
+ #unpauseAnimation() {
108
+ if (!this._deck) {
109
+ return;
110
+ }
111
+ if (this._animate) {
112
+ this._deck.setProps({ _animate: this._animate });
113
+ this._animate = undefined;
114
+ }
115
+ }
116
+ #reset() {
117
+ this.#updateTransform(this.#getMap().getCenter(), this.#getMap().getZoom());
118
+ this.#update();
119
+ }
120
+ #onMoveStart() {
121
+ this.#pauseAnimation();
122
+ }
123
+ #onMoveEnd() {
124
+ this.#update();
125
+ this.#unpauseAnimation();
126
+ }
127
+ #onZoomStart() {
128
+ this.#pauseAnimation();
129
+ }
130
+ #onAnimZoom(event) {
131
+ this.#updateTransform(event.center, event.zoom);
132
+ }
133
+ #onZoom() {
134
+ this.#updateTransform(this.#getMap().getCenter(), this.#getMap().getZoom());
135
+ }
136
+ #onZoomEnd() {
137
+ this.#unpauseAnimation();
138
+ }
139
+ /**
140
+ * see https://stackoverflow.com/a/67107000/1823988
141
+ * see L.Renderer._updateTransform https://github.com/Leaflet/Leaflet/blob/master/src/layer/vector/Renderer.js#L90-L105
142
+ */
143
+ #updateTransform(center, zoom) {
144
+ if (!this._container) {
145
+ return;
146
+ }
147
+ const scale = this.#getMap().getZoomScale(zoom, this.#getMap().getZoom());
148
+ const position = L.DomUtil.getPosition(this._container);
149
+ const viewHalf = this.#getMap().getSize().multiplyBy(0.5);
150
+ const currentCenterPoint = this.#getMap().project(this.#getMap().getCenter(), zoom);
151
+ const destCenterPoint = this.#getMap().project(center, zoom);
152
+ const centerOffset = destCenterPoint.subtract(currentCenterPoint);
153
+ const topLeftOffset = viewHalf
154
+ .multiplyBy(-scale)
155
+ .add(position)
156
+ .add(viewHalf)
157
+ .subtract(centerOffset);
158
+ if (L.Browser.any3d) {
159
+ L.DomUtil.setTransform(this._container, topLeftOffset, scale);
160
+ }
161
+ else {
162
+ L.DomUtil.setPosition(this._container, topLeftOffset);
163
+ }
164
+ }
165
+ }
166
+ //# sourceMappingURL=deck-layer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deck-layer.js","sourceRoot":"","sources":["../src/deck-layer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import * as L from 'leaflet';
2
+ import { Deck } from '@deck.gl/core';
3
+ import type { DeckProps, View } from '@deck.gl/core';
4
+ export type ViewOrViews = View | View[] | null;
5
+ export declare function createDeckInstance(map: L.Map, container: HTMLDivElement, deck: Deck<ViewOrViews> | undefined, props: DeckProps<ViewOrViews>): Deck<ViewOrViews>;
6
+ export declare function updateDeckView(deck: Deck<ViewOrViews>, map: L.Map): void;
7
+ //# sourceMappingURL=deck-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deck-utils.d.ts","sourceRoot":"","sources":["../src/deck-utils.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAC,IAAI,EAAC,MAAM,eAAe,CAAC;AACnC,OAAO,KAAK,EAAC,SAAS,EAAE,IAAI,EAAwB,MAAM,eAAe,CAAC;AAE1E,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;AAY/C,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,CAAC,CAAC,GAAG,EACV,SAAS,EAAE,cAAc,EACzB,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,GAAG,SAAS,EACnC,KAAK,EAAE,SAAS,CAAC,WAAW,CAAC,GAC5B,IAAI,CAAC,WAAW,CAAC,CAYnB;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,GAAG,IAAI,CAMxE"}
@@ -0,0 +1,33 @@
1
+ // deck.gl-community
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+ import { Deck } from '@deck.gl/core';
5
+ function getViewState(map) {
6
+ return {
7
+ longitude: map.getCenter().lng,
8
+ latitude: map.getCenter().lat,
9
+ zoom: map.getZoom() - 1,
10
+ pitch: 0,
11
+ bearing: 0
12
+ };
13
+ }
14
+ export function createDeckInstance(map, container, deck, props) {
15
+ if (!deck) {
16
+ const viewState = getViewState(map);
17
+ deck = new Deck({
18
+ ...props,
19
+ parent: container,
20
+ controller: false,
21
+ style: { zIndex: 'auto' },
22
+ viewState
23
+ });
24
+ }
25
+ return deck;
26
+ }
27
+ export function updateDeckView(deck, map) {
28
+ const viewState = getViewState(map);
29
+ // console.log(viewState);
30
+ deck.setProps({ viewState });
31
+ deck.redraw();
32
+ }
33
+ //# sourceMappingURL=deck-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deck-utils.js","sourceRoot":"","sources":["../src/deck-utils.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,+BAA+B;AAC/B,oCAAoC;AAGpC,OAAO,EAAC,IAAI,EAAC,MAAM,eAAe,CAAC;AAKnC,SAAS,YAAY,CAAC,GAAU;IAC9B,OAAO;QACL,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,GAAG;QAC9B,QAAQ,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,GAAG;QAC7B,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC;QACvB,KAAK,EAAE,CAAC;QACR,OAAO,EAAE,CAAC;KACX,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,GAAU,EACV,SAAyB,EACzB,IAAmC,EACnC,KAA6B;IAE7B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,GAAG,IAAI,IAAI,CAAC;YACd,GAAG,KAAK;YACR,MAAM,EAAE,SAAS;YACjB,UAAU,EAAE,KAAK;YACjB,KAAK,EAAE,EAAC,MAAM,EAAE,MAAM,EAAC;YACvB,SAAS;SACV,CAAC,CAAC;IACL,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAuB,EAAE,GAAU;IAChE,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IACpC,0BAA0B;IAE1B,IAAI,CAAC,QAAQ,CAAC,EAAC,SAAS,EAAC,CAAC,CAAC;IAC3B,IAAI,CAAC,MAAM,EAAE,CAAC;AAChB,CAAC"}
package/dist/index.cjs ADDED
@@ -0,0 +1,222 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
20
+ // If the importer is in node compatibility mode or this is not an ESM
21
+ // file that has been converted to a CommonJS file using a Babel-
22
+ // compatible transform (i.e. "__esModule" has not been set), then set
23
+ // "default" to the CommonJS "module.exports" for node compatibility.
24
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
25
+ mod
26
+ ));
27
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
28
+
29
+ // dist/index.js
30
+ var dist_exports = {};
31
+ __export(dist_exports, {
32
+ DeckLayer: () => DeckLayer
33
+ });
34
+ module.exports = __toCommonJS(dist_exports);
35
+
36
+ // dist/deck-layer.js
37
+ var L = __toESM(require("leaflet"), 1);
38
+
39
+ // dist/deck-utils.js
40
+ var import_core = require("@deck.gl/core");
41
+ function getViewState(map) {
42
+ return {
43
+ longitude: map.getCenter().lng,
44
+ latitude: map.getCenter().lat,
45
+ zoom: map.getZoom() - 1,
46
+ pitch: 0,
47
+ bearing: 0
48
+ };
49
+ }
50
+ function createDeckInstance(map, container, deck, props) {
51
+ if (!deck) {
52
+ const viewState = getViewState(map);
53
+ deck = new import_core.Deck({
54
+ ...props,
55
+ parent: container,
56
+ controller: false,
57
+ style: { zIndex: "auto" },
58
+ viewState
59
+ });
60
+ }
61
+ return deck;
62
+ }
63
+ function updateDeckView(deck, map) {
64
+ const viewState = getViewState(map);
65
+ deck.setProps({ viewState });
66
+ deck.redraw();
67
+ }
68
+
69
+ // dist/deck-layer.js
70
+ var DeckLayer = class extends L.Layer {
71
+ props;
72
+ _container = void 0;
73
+ _deck = void 0;
74
+ _animate = void 0;
75
+ constructor(props) {
76
+ super();
77
+ this.props = props;
78
+ }
79
+ onAdd() {
80
+ const pane = this.getPane();
81
+ if (!pane) {
82
+ return this;
83
+ }
84
+ this._container = L.DomUtil.create("div");
85
+ this._container.className = "leaflet-layer";
86
+ if (this.#getZoomAnimated()) {
87
+ L.DomUtil.addClass(this._container, "leaflet-zoom-animated");
88
+ }
89
+ pane.appendChild(this._container);
90
+ this._deck = createDeckInstance(this._map, this._container, this._deck, this.props);
91
+ this.#update();
92
+ return this;
93
+ }
94
+ onRemove(_map) {
95
+ if (!this._container || !this._deck) {
96
+ return this;
97
+ }
98
+ L.DomUtil.remove(this._container);
99
+ this._container = void 0;
100
+ this._deck.finalize();
101
+ this._deck = void 0;
102
+ return this;
103
+ }
104
+ getEvents() {
105
+ return {
106
+ viewreset: this.#reset.bind(this),
107
+ movestart: this.#onMoveStart.bind(this),
108
+ moveend: this.#onMoveEnd.bind(this),
109
+ zoomstart: this.#onZoomStart.bind(this),
110
+ zoom: this.#onZoom.bind(this),
111
+ zoomend: this.#onZoomEnd.bind(this),
112
+ ...this.#getZoomAnimated() ? { zoomanim: this.#onAnimZoom.bind(this) } : {}
113
+ };
114
+ }
115
+ setProps(props) {
116
+ Object.assign(this.props, props);
117
+ if (this._deck) {
118
+ this._deck.setProps(props);
119
+ }
120
+ }
121
+ pickObject(opts) {
122
+ if (!this._deck) {
123
+ return null;
124
+ }
125
+ return this._deck.pickObject(opts);
126
+ }
127
+ pickMultipleObjects(opts) {
128
+ if (!this._deck) {
129
+ return [];
130
+ }
131
+ return this._deck.pickMultipleObjects(opts);
132
+ }
133
+ pickObjects(opts) {
134
+ if (!this._deck) {
135
+ return [];
136
+ }
137
+ return this._deck.pickObjects(opts);
138
+ }
139
+ #getMap() {
140
+ return this._map;
141
+ }
142
+ #getZoomAnimated() {
143
+ return this._zoomAnimated;
144
+ }
145
+ #update() {
146
+ if (!this._container || !this._deck) {
147
+ return;
148
+ }
149
+ if (this.#getMap()._animatingZoom) {
150
+ return;
151
+ }
152
+ const size = this.#getMap().getSize();
153
+ this._container.style.width = `${size.x}px`;
154
+ this._container.style.height = `${size.y}px`;
155
+ const offset = this.#getMap()._getMapPanePos().multiplyBy(-1);
156
+ L.DomUtil.setPosition(this._container, offset);
157
+ updateDeckView(this._deck, this._map);
158
+ }
159
+ #pauseAnimation() {
160
+ if (!this._deck) {
161
+ return;
162
+ }
163
+ if (this._deck.props._animate) {
164
+ this._animate = this._deck.props._animate;
165
+ this._deck.setProps({ _animate: false });
166
+ }
167
+ }
168
+ #unpauseAnimation() {
169
+ if (!this._deck) {
170
+ return;
171
+ }
172
+ if (this._animate) {
173
+ this._deck.setProps({ _animate: this._animate });
174
+ this._animate = void 0;
175
+ }
176
+ }
177
+ #reset() {
178
+ this.#updateTransform(this.#getMap().getCenter(), this.#getMap().getZoom());
179
+ this.#update();
180
+ }
181
+ #onMoveStart() {
182
+ this.#pauseAnimation();
183
+ }
184
+ #onMoveEnd() {
185
+ this.#update();
186
+ this.#unpauseAnimation();
187
+ }
188
+ #onZoomStart() {
189
+ this.#pauseAnimation();
190
+ }
191
+ #onAnimZoom(event) {
192
+ this.#updateTransform(event.center, event.zoom);
193
+ }
194
+ #onZoom() {
195
+ this.#updateTransform(this.#getMap().getCenter(), this.#getMap().getZoom());
196
+ }
197
+ #onZoomEnd() {
198
+ this.#unpauseAnimation();
199
+ }
200
+ /**
201
+ * see https://stackoverflow.com/a/67107000/1823988
202
+ * see L.Renderer._updateTransform https://github.com/Leaflet/Leaflet/blob/master/src/layer/vector/Renderer.js#L90-L105
203
+ */
204
+ #updateTransform(center, zoom) {
205
+ if (!this._container) {
206
+ return;
207
+ }
208
+ const scale = this.#getMap().getZoomScale(zoom, this.#getMap().getZoom());
209
+ const position = L.DomUtil.getPosition(this._container);
210
+ const viewHalf = this.#getMap().getSize().multiplyBy(0.5);
211
+ const currentCenterPoint = this.#getMap().project(this.#getMap().getCenter(), zoom);
212
+ const destCenterPoint = this.#getMap().project(center, zoom);
213
+ const centerOffset = destCenterPoint.subtract(currentCenterPoint);
214
+ const topLeftOffset = viewHalf.multiplyBy(-scale).add(position).add(viewHalf).subtract(centerOffset);
215
+ if (L.Browser.any3d) {
216
+ L.DomUtil.setTransform(this._container, topLeftOffset, scale);
217
+ } else {
218
+ L.DomUtil.setPosition(this._container, topLeftOffset);
219
+ }
220
+ }
221
+ };
222
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/index.ts", "../src/deck-layer.ts", "../src/deck-utils.ts"],
4
+ "sourcesContent": ["// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nexport * from './deck-layer';\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport * as L from 'leaflet';\nimport type {Deck, DeckProps} from '@deck.gl/core';\nimport {createDeckInstance, updateDeckView} from './deck-utils';\nimport type {ViewOrViews} from './deck-utils';\n\nexport class DeckLayer extends L.Layer {\n props: DeckProps<ViewOrViews>;\n _container: HTMLDivElement | undefined = undefined;\n _deck: Deck<ViewOrViews> | undefined = undefined;\n _animate: boolean | undefined = undefined;\n\n constructor(props: DeckProps<ViewOrViews>) {\n super();\n\n this.props = props;\n }\n\n onAdd(): this {\n const pane = this.getPane();\n if (!pane) {\n return this;\n }\n\n this._container = L.DomUtil.create('div');\n this._container.className = 'leaflet-layer';\n if (this.#getZoomAnimated()) {\n L.DomUtil.addClass(this._container, 'leaflet-zoom-animated');\n }\n\n pane.appendChild(this._container);\n this._deck = createDeckInstance(this._map, this._container, this._deck, this.props);\n this.#update();\n\n return this;\n }\n\n onRemove(_map: L.Map): this {\n if (!this._container || !this._deck) {\n return this;\n }\n\n L.DomUtil.remove(this._container);\n this._container = undefined;\n\n this._deck.finalize();\n this._deck = undefined;\n\n return this;\n }\n\n getEvents(): {[name: string]: L.LeafletEventHandlerFn} {\n return {\n viewreset: this.#reset.bind(this),\n movestart: this.#onMoveStart.bind(this),\n moveend: this.#onMoveEnd.bind(this),\n zoomstart: this.#onZoomStart.bind(this),\n zoom: this.#onZoom.bind(this),\n zoomend: this.#onZoomEnd.bind(this),\n ...(this.#getZoomAnimated()\n ? {zoomanim: this.#onAnimZoom.bind(this) as L.LeafletEventHandlerFn}\n : {})\n };\n }\n\n setProps(props: DeckProps): void {\n Object.assign(this.props, props);\n\n if (this._deck) {\n this._deck.setProps(props);\n }\n }\n\n pickObject(opts: Parameters<Deck['pickObject']>[0]): ReturnType<Deck['pickObject']> {\n if (!this._deck) {\n return null;\n }\n\n return this._deck.pickObject(opts);\n }\n\n pickMultipleObjects(\n opts: Parameters<Deck['pickMultipleObjects']>[0]\n ): ReturnType<Deck['pickMultipleObjects']> {\n if (!this._deck) {\n return [];\n }\n\n return this._deck.pickMultipleObjects(opts);\n }\n\n pickObjects(opts: Parameters<Deck['pickObjects']>[0]): ReturnType<Deck['pickObjects']> {\n if (!this._deck) {\n return [];\n }\n\n return this._deck.pickObjects(opts);\n }\n\n #getMap(): L.Map & {_animatingZoom: boolean; _getMapPanePos: () => L.Point} {\n return (this as any)._map;\n }\n\n #getZoomAnimated(): boolean {\n return (this as any)._zoomAnimated;\n }\n\n #update(): void {\n if (!this._container || !this._deck) {\n return;\n }\n if (this.#getMap()._animatingZoom) {\n return;\n }\n\n const size = this.#getMap().getSize();\n this._container.style.width = `${size.x}px`;\n this._container.style.height = `${size.y}px`;\n\n // invert map position\n const offset = this.#getMap()._getMapPanePos().multiplyBy(-1);\n L.DomUtil.setPosition(this._container, offset);\n\n updateDeckView(this._deck, this._map);\n }\n\n #pauseAnimation(): void {\n if (!this._deck) {\n return;\n }\n\n if (this._deck.props._animate) {\n this._animate = this._deck.props._animate;\n this._deck.setProps({_animate: false});\n }\n }\n\n #unpauseAnimation(): void {\n if (!this._deck) {\n return;\n }\n\n if (this._animate) {\n this._deck.setProps({_animate: this._animate});\n this._animate = undefined;\n }\n }\n\n #reset(): void {\n this.#updateTransform(this.#getMap().getCenter(), this.#getMap().getZoom());\n this.#update();\n }\n\n #onMoveStart(): void {\n this.#pauseAnimation();\n }\n\n #onMoveEnd(): void {\n this.#update();\n this.#unpauseAnimation();\n }\n\n #onZoomStart(): void {\n this.#pauseAnimation();\n }\n\n #onAnimZoom(event: L.ZoomAnimEvent): void {\n this.#updateTransform(event.center, event.zoom);\n }\n\n #onZoom(): void {\n this.#updateTransform(this.#getMap().getCenter(), this.#getMap().getZoom());\n }\n\n #onZoomEnd(): void {\n this.#unpauseAnimation();\n }\n\n /**\n * see https://stackoverflow.com/a/67107000/1823988\n * see L.Renderer._updateTransform https://github.com/Leaflet/Leaflet/blob/master/src/layer/vector/Renderer.js#L90-L105\n */\n #updateTransform(center: L.LatLng, zoom: number): void {\n if (!this._container) {\n return;\n }\n\n const scale = this.#getMap().getZoomScale(zoom, this.#getMap().getZoom());\n const position = L.DomUtil.getPosition(this._container);\n const viewHalf = this.#getMap().getSize().multiplyBy(0.5);\n const currentCenterPoint = this.#getMap().project(this.#getMap().getCenter(), zoom);\n const destCenterPoint = this.#getMap().project(center, zoom);\n const centerOffset = destCenterPoint.subtract(currentCenterPoint);\n const topLeftOffset = viewHalf\n .multiplyBy(-scale)\n .add(position)\n .add(viewHalf)\n .subtract(centerOffset);\n\n if (L.Browser.any3d) {\n L.DomUtil.setTransform(this._container, topLeftOffset, scale);\n } else {\n L.DomUtil.setPosition(this._container, topLeftOffset);\n }\n }\n}\n", "// deck.gl-community\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport * as L from 'leaflet';\nimport {Deck} from '@deck.gl/core';\nimport type {DeckProps, View, ViewStateMap, MapView} from '@deck.gl/core';\n\nexport type ViewOrViews = View | View[] | null;\n\nfunction getViewState(map: L.Map): ViewStateMap<MapView> {\n return {\n longitude: map.getCenter().lng,\n latitude: map.getCenter().lat,\n zoom: map.getZoom() - 1,\n pitch: 0,\n bearing: 0\n };\n}\n\nexport function createDeckInstance(\n map: L.Map,\n container: HTMLDivElement,\n deck: Deck<ViewOrViews> | undefined,\n props: DeckProps<ViewOrViews>\n): Deck<ViewOrViews> {\n if (!deck) {\n const viewState = getViewState(map);\n deck = new Deck({\n ...props,\n parent: container,\n controller: false,\n style: {zIndex: 'auto'},\n viewState\n });\n }\n return deck;\n}\n\nexport function updateDeckView(deck: Deck<ViewOrViews>, map: L.Map): void {\n const viewState = getViewState(map);\n // console.log(viewState);\n\n deck.setProps({viewState});\n deck.redraw();\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,2 @@
1
+ export * from "./deck-layer.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,gCAA6B"}
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ // deck.gl-community
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+ export * from "./deck-layer.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,+BAA+B;AAC/B,oCAAoC;AAEpC,gCAA6B"}
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "@deck.gl-community/leaflet",
3
+ "description": "deck.gl integration with Leaflet",
4
+ "license": "MIT",
5
+ "version": "9.2.0-beta.3",
6
+ "publishConfig": {
7
+ "access": "public"
8
+ },
9
+ "keywords": [
10
+ "webgl",
11
+ "visualization",
12
+ "leaflet"
13
+ ],
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "https://github.com/visgl/deck.gl-community"
17
+ },
18
+ "type": "module",
19
+ "sideEffects": false,
20
+ "types": "./dist/index.d.ts",
21
+ "main": "./dist/index.cjs",
22
+ "module": "./dist/index.js",
23
+ "exports": {
24
+ ".": {
25
+ "types": "./dist/index.d.ts",
26
+ "require": "./dist/index.cjs",
27
+ "import": "./dist/index.js"
28
+ }
29
+ },
30
+ "files": [
31
+ "dist",
32
+ "src"
33
+ ],
34
+ "scripts": {
35
+ "test": "vitest run",
36
+ "test-watch": "vitest"
37
+ },
38
+ "dependencies": {
39
+ "@deck.gl/core": "~9.2.1"
40
+ },
41
+ "devDependencies": {
42
+ "@types/leaflet": "^1.9.18",
43
+ "leaflet": "^1.9.4"
44
+ },
45
+ "peerDependencies": {
46
+ "leaflet": "^1.9.4"
47
+ },
48
+ "gitHead": "6110b774c8be16f199ecdf67723851a2e34901e5"
49
+ }
@@ -0,0 +1,209 @@
1
+ // deck.gl-community
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ import * as L from 'leaflet';
6
+ import type {Deck, DeckProps} from '@deck.gl/core';
7
+ import {createDeckInstance, updateDeckView} from './deck-utils';
8
+ import type {ViewOrViews} from './deck-utils';
9
+
10
+ export class DeckLayer extends L.Layer {
11
+ props: DeckProps<ViewOrViews>;
12
+ _container: HTMLDivElement | undefined = undefined;
13
+ _deck: Deck<ViewOrViews> | undefined = undefined;
14
+ _animate: boolean | undefined = undefined;
15
+
16
+ constructor(props: DeckProps<ViewOrViews>) {
17
+ super();
18
+
19
+ this.props = props;
20
+ }
21
+
22
+ onAdd(): this {
23
+ const pane = this.getPane();
24
+ if (!pane) {
25
+ return this;
26
+ }
27
+
28
+ this._container = L.DomUtil.create('div');
29
+ this._container.className = 'leaflet-layer';
30
+ if (this.#getZoomAnimated()) {
31
+ L.DomUtil.addClass(this._container, 'leaflet-zoom-animated');
32
+ }
33
+
34
+ pane.appendChild(this._container);
35
+ this._deck = createDeckInstance(this._map, this._container, this._deck, this.props);
36
+ this.#update();
37
+
38
+ return this;
39
+ }
40
+
41
+ onRemove(_map: L.Map): this {
42
+ if (!this._container || !this._deck) {
43
+ return this;
44
+ }
45
+
46
+ L.DomUtil.remove(this._container);
47
+ this._container = undefined;
48
+
49
+ this._deck.finalize();
50
+ this._deck = undefined;
51
+
52
+ return this;
53
+ }
54
+
55
+ getEvents(): {[name: string]: L.LeafletEventHandlerFn} {
56
+ return {
57
+ viewreset: this.#reset.bind(this),
58
+ movestart: this.#onMoveStart.bind(this),
59
+ moveend: this.#onMoveEnd.bind(this),
60
+ zoomstart: this.#onZoomStart.bind(this),
61
+ zoom: this.#onZoom.bind(this),
62
+ zoomend: this.#onZoomEnd.bind(this),
63
+ ...(this.#getZoomAnimated()
64
+ ? {zoomanim: this.#onAnimZoom.bind(this) as L.LeafletEventHandlerFn}
65
+ : {})
66
+ };
67
+ }
68
+
69
+ setProps(props: DeckProps): void {
70
+ Object.assign(this.props, props);
71
+
72
+ if (this._deck) {
73
+ this._deck.setProps(props);
74
+ }
75
+ }
76
+
77
+ pickObject(opts: Parameters<Deck['pickObject']>[0]): ReturnType<Deck['pickObject']> {
78
+ if (!this._deck) {
79
+ return null;
80
+ }
81
+
82
+ return this._deck.pickObject(opts);
83
+ }
84
+
85
+ pickMultipleObjects(
86
+ opts: Parameters<Deck['pickMultipleObjects']>[0]
87
+ ): ReturnType<Deck['pickMultipleObjects']> {
88
+ if (!this._deck) {
89
+ return [];
90
+ }
91
+
92
+ return this._deck.pickMultipleObjects(opts);
93
+ }
94
+
95
+ pickObjects(opts: Parameters<Deck['pickObjects']>[0]): ReturnType<Deck['pickObjects']> {
96
+ if (!this._deck) {
97
+ return [];
98
+ }
99
+
100
+ return this._deck.pickObjects(opts);
101
+ }
102
+
103
+ #getMap(): L.Map & {_animatingZoom: boolean; _getMapPanePos: () => L.Point} {
104
+ return (this as any)._map;
105
+ }
106
+
107
+ #getZoomAnimated(): boolean {
108
+ return (this as any)._zoomAnimated;
109
+ }
110
+
111
+ #update(): void {
112
+ if (!this._container || !this._deck) {
113
+ return;
114
+ }
115
+ if (this.#getMap()._animatingZoom) {
116
+ return;
117
+ }
118
+
119
+ const size = this.#getMap().getSize();
120
+ this._container.style.width = `${size.x}px`;
121
+ this._container.style.height = `${size.y}px`;
122
+
123
+ // invert map position
124
+ const offset = this.#getMap()._getMapPanePos().multiplyBy(-1);
125
+ L.DomUtil.setPosition(this._container, offset);
126
+
127
+ updateDeckView(this._deck, this._map);
128
+ }
129
+
130
+ #pauseAnimation(): void {
131
+ if (!this._deck) {
132
+ return;
133
+ }
134
+
135
+ if (this._deck.props._animate) {
136
+ this._animate = this._deck.props._animate;
137
+ this._deck.setProps({_animate: false});
138
+ }
139
+ }
140
+
141
+ #unpauseAnimation(): void {
142
+ if (!this._deck) {
143
+ return;
144
+ }
145
+
146
+ if (this._animate) {
147
+ this._deck.setProps({_animate: this._animate});
148
+ this._animate = undefined;
149
+ }
150
+ }
151
+
152
+ #reset(): void {
153
+ this.#updateTransform(this.#getMap().getCenter(), this.#getMap().getZoom());
154
+ this.#update();
155
+ }
156
+
157
+ #onMoveStart(): void {
158
+ this.#pauseAnimation();
159
+ }
160
+
161
+ #onMoveEnd(): void {
162
+ this.#update();
163
+ this.#unpauseAnimation();
164
+ }
165
+
166
+ #onZoomStart(): void {
167
+ this.#pauseAnimation();
168
+ }
169
+
170
+ #onAnimZoom(event: L.ZoomAnimEvent): void {
171
+ this.#updateTransform(event.center, event.zoom);
172
+ }
173
+
174
+ #onZoom(): void {
175
+ this.#updateTransform(this.#getMap().getCenter(), this.#getMap().getZoom());
176
+ }
177
+
178
+ #onZoomEnd(): void {
179
+ this.#unpauseAnimation();
180
+ }
181
+
182
+ /**
183
+ * see https://stackoverflow.com/a/67107000/1823988
184
+ * see L.Renderer._updateTransform https://github.com/Leaflet/Leaflet/blob/master/src/layer/vector/Renderer.js#L90-L105
185
+ */
186
+ #updateTransform(center: L.LatLng, zoom: number): void {
187
+ if (!this._container) {
188
+ return;
189
+ }
190
+
191
+ const scale = this.#getMap().getZoomScale(zoom, this.#getMap().getZoom());
192
+ const position = L.DomUtil.getPosition(this._container);
193
+ const viewHalf = this.#getMap().getSize().multiplyBy(0.5);
194
+ const currentCenterPoint = this.#getMap().project(this.#getMap().getCenter(), zoom);
195
+ const destCenterPoint = this.#getMap().project(center, zoom);
196
+ const centerOffset = destCenterPoint.subtract(currentCenterPoint);
197
+ const topLeftOffset = viewHalf
198
+ .multiplyBy(-scale)
199
+ .add(position)
200
+ .add(viewHalf)
201
+ .subtract(centerOffset);
202
+
203
+ if (L.Browser.any3d) {
204
+ L.DomUtil.setTransform(this._container, topLeftOffset, scale);
205
+ } else {
206
+ L.DomUtil.setPosition(this._container, topLeftOffset);
207
+ }
208
+ }
209
+ }
@@ -0,0 +1,46 @@
1
+ // deck.gl-community
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ import * as L from 'leaflet';
6
+ import {Deck} from '@deck.gl/core';
7
+ import type {DeckProps, View, ViewStateMap, MapView} from '@deck.gl/core';
8
+
9
+ export type ViewOrViews = View | View[] | null;
10
+
11
+ function getViewState(map: L.Map): ViewStateMap<MapView> {
12
+ return {
13
+ longitude: map.getCenter().lng,
14
+ latitude: map.getCenter().lat,
15
+ zoom: map.getZoom() - 1,
16
+ pitch: 0,
17
+ bearing: 0
18
+ };
19
+ }
20
+
21
+ export function createDeckInstance(
22
+ map: L.Map,
23
+ container: HTMLDivElement,
24
+ deck: Deck<ViewOrViews> | undefined,
25
+ props: DeckProps<ViewOrViews>
26
+ ): Deck<ViewOrViews> {
27
+ if (!deck) {
28
+ const viewState = getViewState(map);
29
+ deck = new Deck({
30
+ ...props,
31
+ parent: container,
32
+ controller: false,
33
+ style: {zIndex: 'auto'},
34
+ viewState
35
+ });
36
+ }
37
+ return deck;
38
+ }
39
+
40
+ export function updateDeckView(deck: Deck<ViewOrViews>, map: L.Map): void {
41
+ const viewState = getViewState(map);
42
+ // console.log(viewState);
43
+
44
+ deck.setProps({viewState});
45
+ deck.redraw();
46
+ }
package/src/index.ts ADDED
@@ -0,0 +1,5 @@
1
+ // deck.gl-community
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ export * from './deck-layer';