@mapcomponents/deck-gl 1.7.6 → 1.8.0

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.
Files changed (79) hide show
  1. package/dist/assets/3D/WhereGroupLogo.glb +0 -0
  2. package/dist/assets/tiles/points/r.pnts +0 -0
  3. package/dist/assets/tiles/points/r0.pnts +0 -0
  4. package/dist/assets/tiles/points/r00.pnts +0 -0
  5. package/dist/assets/tiles/points/r01.pnts +0 -0
  6. package/dist/assets/tiles/points/r02.pnts +0 -0
  7. package/dist/assets/tiles/points/r03.pnts +0 -0
  8. package/dist/assets/tiles/points/r04.pnts +0 -0
  9. package/dist/assets/tiles/points/r05.pnts +0 -0
  10. package/dist/assets/tiles/points/r06.pnts +0 -0
  11. package/dist/assets/tiles/points/r07.pnts +0 -0
  12. package/dist/assets/tiles/points/r2.pnts +0 -0
  13. package/dist/assets/tiles/points/r20.pnts +0 -0
  14. package/dist/assets/tiles/points/r21.pnts +0 -0
  15. package/dist/assets/tiles/points/r22.pnts +0 -0
  16. package/dist/assets/tiles/points/r23.pnts +0 -0
  17. package/dist/assets/tiles/points/r24.pnts +0 -0
  18. package/dist/assets/tiles/points/r25.pnts +0 -0
  19. package/dist/assets/tiles/points/r26.pnts +0 -0
  20. package/dist/assets/tiles/points/r27.pnts +0 -0
  21. package/dist/assets/tiles/points/r3.pnts +0 -0
  22. package/dist/assets/tiles/points/r4.pnts +0 -0
  23. package/dist/assets/tiles/points/r40.pnts +0 -0
  24. package/dist/assets/tiles/points/r41.pnts +0 -0
  25. package/dist/assets/tiles/points/r42.pnts +0 -0
  26. package/dist/assets/tiles/points/r43.pnts +0 -0
  27. package/dist/assets/tiles/points/r44.pnts +0 -0
  28. package/dist/assets/tiles/points/r45.pnts +0 -0
  29. package/dist/assets/tiles/points/r46.pnts +0 -0
  30. package/dist/assets/tiles/points/r47.pnts +0 -0
  31. package/dist/assets/tiles/points/r6.pnts +0 -0
  32. package/dist/assets/tiles/points/r60.pnts +0 -0
  33. package/dist/assets/tiles/points/r61.pnts +0 -0
  34. package/dist/assets/tiles/points/r63.pnts +0 -0
  35. package/dist/assets/tiles/points/r64.pnts +0 -0
  36. package/dist/assets/tiles/points/r65.pnts +0 -0
  37. package/dist/assets/tiles/preview.pnts +0 -0
  38. package/dist/assets/tiles/tileset.json +460 -0
  39. package/dist/assets/wg_locations.json +53 -0
  40. package/dist/components/Ml3DTileLayer/Ml3DTileLayer.d.ts +15 -0
  41. package/dist/components/Ml3DTileLayer/Ml3DTileLayer.d.ts.map +1 -0
  42. package/dist/components/MlHexagonLayer/MlHexagonLayer.d.ts +15 -0
  43. package/dist/components/MlHexagonLayer/MlHexagonLayer.d.ts.map +1 -0
  44. package/dist/components/MlSceneGraphLayer/MlScenegraphLayer.d.ts +15 -0
  45. package/dist/components/MlSceneGraphLayer/MlScenegraphLayer.d.ts.map +1 -0
  46. package/dist/contexts/DeckGlContext.d.ts +3 -1
  47. package/dist/contexts/DeckGlContext.d.ts.map +1 -1
  48. package/dist/decorators/MapContextDecorator.d.ts.map +1 -1
  49. package/dist/hooks/useDeckGl.d.ts +3 -2
  50. package/dist/hooks/useDeckGl.d.ts.map +1 -1
  51. package/dist/html2canvas.esm-CUkZERmf.js +22 -0
  52. package/dist/index-2pRp38DS.js +4712 -0
  53. package/dist/{index-FSZB5YUB.mjs → index-XOA5TV-e.mjs} +52670 -40284
  54. package/dist/index.d.ts +3 -1
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.es-BNHgyHB_.js +18 -0
  57. package/dist/{index.es-BiYLqoqF.mjs → index.es-nMmjT7oh.mjs} +1 -1
  58. package/dist/index.js +1 -0
  59. package/dist/index.mjs +7 -5
  60. package/dist/package.json +8 -5
  61. package/dist/purify.es-D1I7B1hP.js +2 -0
  62. package/package.json +8 -5
  63. package/src/components/Ml3DTileLayer/Ml3DTileLayer.stories.tsx +43 -0
  64. package/src/components/Ml3DTileLayer/Ml3DTileLayer.tsx +57 -0
  65. package/src/components/{MlHexagonMap/MlHexagonMap.cy.tsx → MlHexagonLayer/MlHexagonLayer.cy.tsx} +4 -4
  66. package/src/components/MlHexagonLayer/MlHexagonLayer.stories.tsx +129 -0
  67. package/src/components/MlHexagonLayer/MlHexagonLayer.tsx +90 -0
  68. package/src/components/MlSceneGraphLayer/MlScenegraphLayer.stories.tsx +118 -0
  69. package/src/components/MlSceneGraphLayer/MlScenegraphLayer.tsx +47 -0
  70. package/src/contexts/DeckGlContext.tsx +9 -2
  71. package/src/decorators/MapContextDecorator.tsx +18 -13
  72. package/src/hooks/useDeckGl.tsx +11 -8
  73. package/src/index.ts +3 -1
  74. package/vite.config.ts +1 -1
  75. package/dist/components/MlHexagonMap/MlHexagonMap.d.ts +0 -14
  76. package/dist/components/MlHexagonMap/MlHexagonMap.d.ts.map +0 -1
  77. package/src/components/MlHexagonMap/MlHexagonMap.stories.tsx +0 -28
  78. package/src/components/MlHexagonMap/MlHexagonMap.tsx +0 -141
  79. /package/src/components/{MlHexagonMap/MlHexagonMap.meta_.json → MlHexagonLayer/MlHexagonLayer.meta_.json} +0 -0
package/package.json CHANGED
@@ -1,18 +1,21 @@
1
1
  {
2
2
  "name": "@mapcomponents/deck-gl",
3
- "version": "1.7.6",
3
+ "version": "1.8.0",
4
4
  "description": "",
5
5
  "main": "src/index.ts",
6
6
  "module": "dist/index.mjs",
7
7
  "dependencies": {
8
- "@deck.gl/aggregation-layers": "^9.1.14",
9
- "@deck.gl/core": "^9.1.14",
10
- "@deck.gl/mapbox": "^9.1.14",
8
+ "@deck.gl/aggregation-layers": "^9.2.6",
9
+ "@deck.gl/core": "^9.2.6",
10
+ "@deck.gl/geo-layers": "^9.2.6",
11
+ "@deck.gl/mapbox": "^9.2.6",
12
+ "@deck.gl/mesh-layers": "^9.2.6",
11
13
  "@mui/icons-material": "^7.3.2",
12
14
  "@mui/material": "^7.3.2",
13
15
  "@storybook/react": "^9.1.4",
14
16
  "maplibre-gl": "^5.16.0",
15
- "@mapcomponents/react-maplibre": "1.7.6"
17
+ "uuid": "^11.1.0",
18
+ "@mapcomponents/react-maplibre": "1.8.0"
16
19
  },
17
20
  "devDependencies": {
18
21
  "@types/geojson": "^7946.0.16"
@@ -0,0 +1,43 @@
1
+ import mapContextDecorator from '../../decorators/MapContextDecorator';
2
+ import Ml3DTileLayer from './Ml3DTileLayer';
3
+
4
+ const storyoptions = {
5
+ title: 'MapComponents/Ml3DTileLayer',
6
+ component: Ml3DTileLayer,
7
+ argTypes: {},
8
+ decorators: mapContextDecorator,
9
+ };
10
+ export default storyoptions;
11
+
12
+ const Template = (context: any) => {
13
+ return <Ml3DTileLayer {...context} />;
14
+ };
15
+
16
+ export const PointCloudExample: { [key: string]: any } = Template.bind({});
17
+ PointCloudExample.parameters = {
18
+ mapOptions: {
19
+ center: [7.842650747974176, 47.98896351950512],
20
+ pitch: 43.5,
21
+ zoom: 22,
22
+ bearing: -8.151137833252392,
23
+ },
24
+ };
25
+ PointCloudExample.args = {
26
+ mapId: 'map_1',
27
+ id: 'PointCould',
28
+ data: 'assets/tiles/tileset.json',
29
+ pointSize: 2,
30
+ };
31
+ export const HamburgExample: { [key: string]: any } = Template.bind({});
32
+ HamburgExample.parameters = {
33
+ mapOptions: {
34
+ center: [9.993682, 53.551086],
35
+ pitch: 58,
36
+ zoom: 14.788260082345504,
37
+ bearing: 0,
38
+ },
39
+ };
40
+ HamburgExample.args = {
41
+ mapId: 'map_1',
42
+ data: 'https://3dtiles.wheregroup.com/tileset.json',
43
+ };
@@ -0,0 +1,57 @@
1
+ import { useEffect, useMemo } from 'react';
2
+ import { useMap } from '@mapcomponents/react-maplibre';
3
+ import { Tile3DLayer, Tile3DLayerProps } from '@deck.gl/geo-layers';
4
+ import useDeckGl from '../../hooks/useDeckGl';
5
+
6
+ export interface Ml3DTileLayerProps extends Tile3DLayerProps {
7
+ /**
8
+ * Id of the target MapLibre instance in mapContext
9
+ */
10
+ mapId?: string;
11
+ /**
12
+ * Id of an existing layer in the mapLibre instance to help specify the layer order
13
+ * This layer will be visually beneath the layer with the "beforeId" id.
14
+ */
15
+ beforeId?: string;
16
+ }
17
+
18
+ const Ml3DTileLayer = (props: Ml3DTileLayerProps) => {
19
+ const { mapId, ...Ml3DTileProps } = props;
20
+ const mapHook = useMap({ mapId: mapId });
21
+ const deckGlHook = useDeckGl();
22
+
23
+ const tile3dLayer = useMemo(() => {
24
+ if (!Ml3DTileProps.data) return null;
25
+ else
26
+ return new Tile3DLayer({
27
+ ...Ml3DTileProps,
28
+ });
29
+ }, [
30
+ Ml3DTileProps.data,
31
+ Ml3DTileProps.id,
32
+ Ml3DTileProps.pickable,
33
+ Ml3DTileProps.onTileLoad,
34
+ Ml3DTileProps.onTileUnload,
35
+ Ml3DTileProps.loadOptions,
36
+ Ml3DTileProps.loaders,
37
+ Ml3DTileProps.visible,
38
+ Ml3DTileProps.opacity,
39
+ Ml3DTileProps.pointSize,
40
+ Ml3DTileProps.beforeId,
41
+ ]);
42
+
43
+ useEffect(() => {
44
+ if (!mapHook.map || !tile3dLayer) return;
45
+
46
+ deckGlHook.addLayer(tile3dLayer);
47
+
48
+ return () => {
49
+ // eslint-disable-next-line @typescript-eslint/no-unused-expressions
50
+ tile3dLayer && deckGlHook.removeLayer(tile3dLayer);
51
+ };
52
+ }, [mapHook.map, tile3dLayer]);
53
+
54
+ return <></>;
55
+ };
56
+
57
+ export default Ml3DTileLayer;
@@ -1,12 +1,12 @@
1
+ // MlHexagonLayer.cy.tsx
1
2
  import { composeStories } from '@storybook/react';
2
- import * as stories from './MlHexagonMap.stories';
3
+ import * as stories from './MlHexagonLayer.stories';
3
4
 
4
- const { NoiseMap }: any = composeStories(stories);
5
+ const { DefaultSettings }: any = composeStories(stories);
5
6
 
6
7
  describe('MlHexagonMap Test', () => {
7
8
  it('Should display Maplibre map with MlHexagonMap', () => {
8
- // see: https://on.cypress.io/mounting-react
9
- cy.mount(<NoiseMap />);
9
+ cy.mount(<DefaultSettings />);
10
10
  cy.window()
11
11
  .should((win) => expect((win as any)._map).to.exist)
12
12
  .then((win) => {
@@ -0,0 +1,129 @@
1
+ import mapContextDecorator from '../../decorators/MapContextDecorator';
2
+ import MlHexagonLayer from './MlHexagonLayer';
3
+ import { useEffect, useState } from 'react';
4
+ import { useMap } from '@mapcomponents/react-maplibre';
5
+ import { HexagonLayer } from '@deck.gl/aggregation-layers';
6
+
7
+ const storyoptions = {
8
+ title: 'MapComponents/MlHexagonMap',
9
+ component: MlHexagonLayer,
10
+ argTypes: {},
11
+ decorators: mapContextDecorator,
12
+ };
13
+ export default storyoptions;
14
+
15
+ const Template = (context: any) => {
16
+ const [noiseData, setNoiseData] = useState<{ type: string; features: any[] }>({
17
+ type: '',
18
+ features: [],
19
+ });
20
+ const mapHook = useMap({ mapId: 'map_1' });
21
+
22
+ useEffect(() => {
23
+ let cancelled = false;
24
+ const load = async () => {
25
+ try {
26
+ const res = await fetch('/assets/3D/laerm_points.json', {
27
+ headers: {
28
+ 'Content-Type': 'application/json',
29
+ Accept: 'application/json',
30
+ },
31
+ });
32
+ if (!res.ok) throw new Error(`HTTP ${res.status}`);
33
+ const json = await res.json();
34
+ const features = Array.isArray(json?.features) ? json.features : [];
35
+ if (!cancelled) {
36
+ setNoiseData({ type: json?.type ?? 'FeatureCollection', features });
37
+ }
38
+ } catch (e) {
39
+ console.error(e);
40
+ if (!cancelled) {
41
+ setNoiseData({ type: '', features: [] });
42
+ }
43
+ }
44
+ };
45
+ load();
46
+ return () => {
47
+ cancelled = true;
48
+ };
49
+ }, []);
50
+
51
+ mapHook.map?.setPitch(60);
52
+ mapHook.map?.setZoom(13.5);
53
+
54
+ return (
55
+ <>
56
+ <MlHexagonLayer
57
+ data={noiseData.features}
58
+ getPosition={(d: any) => d.geometry.coordinates}
59
+ {...context}
60
+ />
61
+ </>
62
+ );
63
+ };
64
+
65
+ export const DefaultSettings: { [key: string]: any } = Template.bind({});
66
+ DefaultSettings.parameters = {};
67
+ DefaultSettings.args = {
68
+ mapId: 'map_1',
69
+ type: HexagonLayer,
70
+ layerOpacity: 0.8,
71
+ elevationRange: [30, 75],
72
+ elevationScale: 1,
73
+ extruded: true,
74
+ coverage: 0.9,
75
+ autoHighlight: false,
76
+ material: { ambient: 0.6, diffuse: 0.5, shininess: 10 },
77
+ radius: 16,
78
+ transitions: { elevationScale: 1500 },
79
+ _filterData: null,
80
+ colorRange: [
81
+ [1, 152, 189, 125],
82
+ [73, 227, 206, 150],
83
+ [216, 254, 181, 175],
84
+ [254, 237, 177, 200],
85
+ [254, 173, 84, 225],
86
+ [209, 55, 78, 255],
87
+ ],
88
+ };
89
+ export const CustomColorAndHeightProfile: { [key: string]: any } = Template.bind({});
90
+ CustomColorAndHeightProfile.parameters = {};
91
+ CustomColorAndHeightProfile.args = {
92
+ mapId: 'map_1',
93
+ type: HexagonLayer,
94
+ layerOpacity: 0.8,
95
+ specularColor: [51, 51, 51],
96
+ elevationRange: [30, 75],
97
+ elevationScale: 1,
98
+ extruded: true,
99
+ coverage: 0.9,
100
+ autoHighlight: false,
101
+ material: { ambient: 0.8, diffuse: 0.5, shininess: 10 },
102
+ radius: 16,
103
+ transitions: { elevationScale: 1500 },
104
+ _filterData: null,
105
+ colorRange: [
106
+ [1, 152, 189, Math.round(80 * 0.8)],
107
+ [73, 227, 206, Math.round(90 * 0.8)],
108
+ [216, 254, 181, Math.round(100 * 0.8)],
109
+ [254, 237, 177, Math.round(110 * 0.8)],
110
+ [254, 173, 84, Math.round(120 * 0.8)],
111
+ [209, 55, 78, Math.round(150 * 0.8)],
112
+ ],
113
+ getColorValue: (points: any[]) => {
114
+ const elVal = points.reduce((acc, point) => {
115
+ const src = point?.properties ? point.properties : point?.source?.properties;
116
+ if (!src?.dba && acc === -Infinity) return acc;
117
+ return acc < src.dba ? src.dba : acc;
118
+ }, -Infinity);
119
+ return Number.isFinite(elVal) ? Math.round(elVal) : 0;
120
+ },
121
+ getElevationValue: (points: any[]) => {
122
+ const elVal = points.reduce((acc, point) => {
123
+ const src = point?.properties ? point.properties : point?.source?.properties;
124
+ if (!src?.dba && acc === -Infinity) return acc;
125
+ return acc < src.dba ? src.dba : acc;
126
+ }, -Infinity);
127
+ return Number.isFinite(elVal) ? Math.round(elVal) : 0;
128
+ },
129
+ };
@@ -0,0 +1,90 @@
1
+ import { useEffect, useMemo } from 'react';
2
+ import { HexagonLayer, HexagonLayerProps } from '@deck.gl/aggregation-layers';
3
+ import { useMap } from '@mapcomponents/react-maplibre';
4
+ import useDeckGl from '../../hooks/useDeckGl';
5
+
6
+ export interface MlHexagonMapProps extends HexagonLayerProps {
7
+ /**
8
+ * Id of the target MapLibre instance in mapContext
9
+ */
10
+ mapId?: string;
11
+ /**
12
+ * Id of an existing layer in the mapLibre instance to help specify the layer order
13
+ * This layer will be visually beneath the layer with the "beforeId" id.
14
+ */
15
+ beforeId?: string;
16
+ }
17
+
18
+ const defaultProps = {
19
+ type: HexagonLayer,
20
+ layerOpacity: 0.8,
21
+ elevationRange: [30, 75],
22
+ elevationScale: 1,
23
+ extruded: true,
24
+ coverage: 0.9,
25
+ autoHighlight: false,
26
+ material: { ambient: 0.6, diffuse: 0.5, shininess: 10 },
27
+ radius: 16,
28
+ transitions: { elevationScale: 1500 },
29
+ _filterData: null,
30
+ colorRange: [
31
+ [1, 152, 189, 125],
32
+ [73, 227, 206, 150],
33
+ [216, 254, 181, 175],
34
+ [254, 237, 177, 200],
35
+ [254, 173, 84, 225],
36
+ [209, 55, 78, 255],
37
+ ],
38
+ };
39
+
40
+ const MlHexagonLayer = (props: MlHexagonMapProps) => {
41
+ const deckGlHook = useDeckGl();
42
+
43
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
44
+ // @ts-expect-error
45
+ props = {
46
+ ...defaultProps,
47
+ ...props,
48
+ };
49
+
50
+ const { mapId, ...HexagonLayerProps } = props;
51
+
52
+ const mapHook = useMap({
53
+ mapId: mapId,
54
+ waitForLayer: HexagonLayerProps.beforeId,
55
+ });
56
+
57
+ // create deck.gl HexagonLayer once when its props change
58
+ const hexagonLayer = useMemo(() => {
59
+ if (!HexagonLayerProps.data) return null;
60
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
61
+ // @ts-ignore
62
+ return new HexagonLayer({
63
+ ...HexagonLayerProps,
64
+ } as unknown as HexagonLayerProps);
65
+ }, [
66
+ HexagonLayerProps.beforeId,
67
+ HexagonLayerProps.data,
68
+ HexagonLayerProps.elevationScale,
69
+ HexagonLayerProps.extruded,
70
+ HexagonLayerProps.coverage,
71
+ HexagonLayerProps.autoHighlight,
72
+ HexagonLayerProps.material,
73
+ HexagonLayerProps.radius,
74
+ HexagonLayerProps.transitions,
75
+ ]);
76
+
77
+ // add/remove the memoized layer
78
+ useEffect(() => {
79
+ if (!mapHook.map || !hexagonLayer) return;
80
+ deckGlHook.addLayer(hexagonLayer);
81
+
82
+ return () => {
83
+ deckGlHook.removeLayer(hexagonLayer);
84
+ };
85
+ }, [mapHook.map, hexagonLayer]);
86
+
87
+ return <></>;
88
+ };
89
+
90
+ export default MlHexagonLayer;
@@ -0,0 +1,118 @@
1
+ import mapContextDecorator from '../../decorators/MapContextDecorator';
2
+ import MlScenegraphLayer from './MlScenegraphLayer';
3
+
4
+ type BartStation = {
5
+ name: string;
6
+ coordinates: [longitude: number, latitude: number];
7
+ };
8
+
9
+ const wgLocations = [
10
+ {
11
+ id: '1',
12
+ type: 'Feature',
13
+ properties: {
14
+ Standort: 'Bonn',
15
+ Mitarbeitende: 26,
16
+ },
17
+ geometry: {
18
+ coordinates: [7.085121767634178, 50.738628929850876],
19
+ type: 'Point',
20
+ },
21
+ },
22
+ {
23
+ id: '2',
24
+ type: 'Feature',
25
+ properties: {
26
+ Standort: 'Freiburg',
27
+ Mitarbeitende: 10,
28
+ },
29
+ geometry: {
30
+ coordinates: [7.842759788570362, 47.98905444717667],
31
+ type: 'Point',
32
+ },
33
+ },
34
+ {
35
+ id: '3',
36
+ type: 'Feature',
37
+ properties: {
38
+ Standort: 'Berlin',
39
+ Mitarbeitende: 13,
40
+ },
41
+ geometry: {
42
+ coordinates: [13.330420447460796, 52.492768290796676],
43
+ type: 'Point',
44
+ },
45
+ },
46
+ {
47
+ id: '4',
48
+ type: 'Feature',
49
+ properties: {
50
+ Standort: 'Hamburg',
51
+ Mitarbeitende: 3,
52
+ },
53
+ geometry: {
54
+ coordinates: [10.041789021808029, 53.5511363175323],
55
+ type: 'Point',
56
+ },
57
+ },
58
+ ];
59
+
60
+ const storyoptions = {
61
+ title: 'MapComponents/MlScenegraphLayer',
62
+ component: MlScenegraphLayer,
63
+ argTypes: {},
64
+ decorators: mapContextDecorator,
65
+ };
66
+ export default storyoptions;
67
+
68
+ const Template = (context: any) => {
69
+ return <MlScenegraphLayer {...context} />;
70
+ };
71
+
72
+ export const DeckglExample: { [key: string]: any } = Template.bind({});
73
+ DeckglExample.parameters = {
74
+ mapOptions: {
75
+ zoom: 10,
76
+ center: [-122.2, 37.773972],
77
+ pitch: 60,
78
+ },
79
+ };
80
+ DeckglExample.args = {
81
+ mapId: 'map_1',
82
+ id: 'ScenegraphLayer',
83
+ data: 'https://raw.githubusercontent.com/visgl/deck.gl-data/master/website/bart-stations.json',
84
+ getPosition: (d: BartStation) => d.coordinates,
85
+ getOrientation: () => [0, Math.random() * 180, 90],
86
+ scenegraph:
87
+ 'https://raw.githubusercontent.com/KhronosGroup/glTF-Sample-Models/master/2.0/BoxAnimated/glTF-Binary/BoxAnimated.glb',
88
+ sizeScale: 500,
89
+ _animations: {
90
+ '*': { speed: 5 },
91
+ },
92
+ _lighting: 'pbr',
93
+ pickable: true,
94
+ };
95
+
96
+ export const WhereGroupLocationExample: { [key: string]: any } = Template.bind({});
97
+ WhereGroupLocationExample.parameters = {
98
+ mapOptions: {
99
+ center: [10.4, 50],
100
+ pitch: 56,
101
+ zoom: 6,
102
+ },
103
+ };
104
+ WhereGroupLocationExample.args = {
105
+ mapId: 'map_1',
106
+ id: 'ScenegraphLayer',
107
+ data: wgLocations,
108
+ getPosition: (d: any) => d.geometry.coordinates,
109
+ getOrientation: () => [0, 0, 90],
110
+ getColor: () => [255, 255, 255],
111
+ scenegraph: '/assets/3D/WhereGroupLogo.glb',
112
+ sizeScale: 100,
113
+ _animations: {
114
+ '*': { speed: 5 },
115
+ },
116
+ _lighting: 'pbr',
117
+ pickable: true,
118
+ };
@@ -0,0 +1,47 @@
1
+ import { ScenegraphLayer, ScenegraphLayerProps } from '@deck.gl/mesh-layers';
2
+ import { useEffect, useMemo } from 'react';
3
+ import { useMap } from '@mapcomponents/react-maplibre';
4
+ import useDeckGl from '../../hooks/useDeckGl';
5
+
6
+ export interface MlScenegraphLayerProps extends ScenegraphLayerProps {
7
+ /**
8
+ * Id of the target MapLibre instance in mapContext
9
+ */
10
+ mapId?: string;
11
+ /**
12
+ * Id of an existing layer in the mapLibre instance to help specify the layer order
13
+ * This layer will be visually beneath the layer with the "beforeId" id.
14
+ */
15
+ beforeId?: string;
16
+ }
17
+
18
+ const MlScenegraphLayer = (props: MlScenegraphLayerProps) => {
19
+ const { mapId, ...ScenegraphLayerProps } = props;
20
+
21
+ const mapHook = useMap({
22
+ mapId: mapId,
23
+ waitForLayer: ScenegraphLayerProps.beforeId,
24
+ });
25
+ const deckGlHook = useDeckGl();
26
+ const scenegraphLayer = useMemo(
27
+ () =>
28
+ new ScenegraphLayer({
29
+ ...ScenegraphLayerProps,
30
+ }),
31
+ [ScenegraphLayerProps]
32
+ );
33
+
34
+ useEffect(() => {
35
+ if (!mapHook.map || !scenegraphLayer) return;
36
+
37
+ deckGlHook.addLayer(scenegraphLayer);
38
+
39
+ return () => {
40
+ // eslint-disable-next-line @typescript-eslint/no-unused-expressions
41
+ scenegraphLayer && deckGlHook.removeLayer(scenegraphLayer);
42
+ };
43
+ }, [mapHook.map, scenegraphLayer]);
44
+ return <></>;
45
+ };
46
+
47
+ export default MlScenegraphLayer;
@@ -1,11 +1,13 @@
1
1
  import React, { ReactNode, useEffect, useRef, useState } from 'react';
2
2
  import { useMap } from '@mapcomponents/react-maplibre';
3
- import { Layer } from '@deck.gl/core';
3
+ import { Effect, Layer } from '@deck.gl/core';
4
4
  import { MapboxOverlay } from '@deck.gl/mapbox';
5
5
 
6
6
  export interface DeckGlContextType {
7
7
  deckGlLayerArray: Layer[];
8
8
  setDeckGlLayerArray: React.Dispatch<React.SetStateAction<Layer[]>>;
9
+ deckGlEffectArray: Effect[];
10
+ setDeckGlEffectArray: React.Dispatch<React.SetStateAction<Effect[]>>;
9
11
  }
10
12
 
11
13
  interface DeckGlContextProviderProps {
@@ -21,12 +23,14 @@ const DeckGlContextProvider = ({ mapId, children }: DeckGlContextProviderProps)
21
23
 
22
24
  const overlayRef = useRef<MapboxOverlay | undefined>(undefined);
23
25
  const [deckGlLayerArray, setDeckGlLayerArray] = useState<Layer[]>([]);
26
+ const [deckGlEffectArray, setDeckGlEffectArray] = useState<Effect[]>([]);
24
27
 
25
28
  useEffect(() => {
26
29
  if (!mapHook.map) return;
27
30
 
28
31
  overlayRef.current = new MapboxOverlay({
29
32
  id: overlayId,
33
+ interleaved: true,
30
34
  });
31
35
 
32
36
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
@@ -44,12 +48,15 @@ const DeckGlContextProvider = ({ mapId, children }: DeckGlContextProviderProps)
44
48
  if (!overlayRef.current) return;
45
49
  overlayRef.current.setProps({
46
50
  layers: [...deckGlLayerArray],
51
+ effects: [...deckGlEffectArray],
47
52
  });
48
- }, [deckGlLayerArray]);
53
+ }, [deckGlLayerArray, deckGlEffectArray]);
49
54
 
50
55
  const value = {
51
56
  deckGlLayerArray,
52
57
  setDeckGlLayerArray,
58
+ deckGlEffectArray,
59
+ setDeckGlEffectArray,
53
60
  };
54
61
  return <DeckGlContext.Provider value={value}>{children}</DeckGlContext.Provider>;
55
62
  };
@@ -1,16 +1,16 @@
1
1
  import { useMemo } from 'react';
2
2
 
3
3
  import {
4
+ getTheme,
4
5
  MapComponentsProvider,
5
6
  MapLibreMap,
6
7
  MlNavigationTools,
7
- getTheme,
8
8
  } from '@mapcomponents/react-maplibre';
9
9
  import './style.css';
10
10
  import { ThemeProvider as MUIThemeProvider } from '@mui/material/styles';
11
+ import { DeckGlContextProvider } from '../contexts/DeckGlContext';
11
12
 
12
13
  const decorators = [
13
- // eslint-disable-next-line
14
14
  (Story: any, context: any) => {
15
15
  const theme = useMemo(() => getTheme(context?.globals?.theme), [context?.globals?.theme]);
16
16
 
@@ -18,20 +18,25 @@ const decorators = [
18
18
  <div className="fullscreen_map">
19
19
  <MapComponentsProvider>
20
20
  <MUIThemeProvider theme={theme}>
21
- <Story />
21
+ <DeckGlContextProvider mapId={context.mapId}>
22
+ <Story />
23
+ </DeckGlContextProvider>
22
24
  <MapLibreMap
23
- options={{
24
- zoom: 14.5,
25
- style: 'https://wms.wheregroup.com/tileserver/style/osm-bright.json',
26
- center: [7.0851268, 50.73884],
27
- }}
28
- mapId="map_1"
29
- />
30
- <MlNavigationTools
31
- sx={{ bottom: '25px', right: '5px' }}
32
- showZoomButtons={false}
25
+ options={
26
+ context?.parameters?.mapOptions
27
+ ? {
28
+ style: 'https://wms.wheregroup.com/tileserver/style/osm-bright.json',
29
+ ...context.parameters.mapOptions,
30
+ }
31
+ : {
32
+ zoom: 14.5,
33
+ style: 'https://wms.wheregroup.com/tileserver/style/osm-bright.json',
34
+ center: [7.0851268, 50.73884],
35
+ }
36
+ }
33
37
  mapId="map_1"
34
38
  />
39
+ <MlNavigationTools showZoomButtons={false} mapId="map_1" />
35
40
  </MUIThemeProvider>
36
41
  </MapComponentsProvider>
37
42
  </div>
@@ -1,24 +1,27 @@
1
1
  import DeckGlContext from '../contexts/DeckGlContext';
2
2
  import { useContext } from 'react';
3
- import { Layer } from '@deck.gl/core';
3
+ import { Effect, Layer } from '@deck.gl/core';
4
4
 
5
5
  function useDeckGl() {
6
6
  const deckGlContext = useContext(DeckGlContext);
7
- const layerArray = deckGlContext.deckGlLayerArray;
8
7
 
8
+ function addEffect(effect: Effect) {
9
+ deckGlContext.setDeckGlEffectArray((prevState) => [...prevState, effect]);
10
+ }
11
+ function removeEffect(effect: Effect) {
12
+ deckGlContext.setDeckGlEffectArray((prevState) => prevState.filter((e) => e !== effect));
13
+ }
9
14
  function addLayer(layer: Layer) {
10
- const newDeckGLLayerArray = [...layerArray];
11
- newDeckGLLayerArray.push(layer);
12
- deckGlContext.setDeckGlLayerArray(newDeckGLLayerArray);
15
+ deckGlContext.setDeckGlLayerArray((prevState) => [...prevState, layer]);
13
16
  }
14
17
  function removeLayer(layer: Layer) {
15
- const newDeckGLLayerArray = layerArray.filter((l) => l !== layer);
16
- deckGlContext.setDeckGlLayerArray(newDeckGLLayerArray);
18
+ deckGlContext.setDeckGlLayerArray((prevState) => prevState.filter((l) => l !== layer));
17
19
  }
18
20
  return {
21
+ addEffect,
22
+ removeEffect,
19
23
  addLayer,
20
24
  removeLayer,
21
- layerArray,
22
25
  };
23
26
  }
24
27
  export default useDeckGl;
package/src/index.ts CHANGED
@@ -1,3 +1,5 @@
1
1
  export { default as DeckGlContext, DeckGlContextProvider } from './contexts/DeckGlContext';
2
2
  export { default as useDeckGl } from './hooks/useDeckGl';
3
- export { default as MlHexagonLayer } from './components/MlHexagonMap/MlHexagonMap';
3
+ export { default as MlHexagonLayer } from './components/MlHexagonLayer/MlHexagonLayer';
4
+ export { default as Ml3DTileLayer } from './components/Ml3DTileLayer/Ml3DTileLayer';
5
+ export { default as MlSceneGraphLayer } from './components/MlSceneGraphLayer/MlScenegraphLayer';
package/vite.config.ts CHANGED
@@ -35,7 +35,7 @@ export default defineConfig(() => ({
35
35
  fileName: 'index',
36
36
  // Change this to the formats you want to support.
37
37
  // Don't forget to update your package.json as well.
38
- formats: ['es' as const],
38
+ formats: ['es' as const, 'cjs' as const],
39
39
  },
40
40
  rollupOptions: {
41
41
  // External packages that should not be bundled into your library.