@deck.gl-community/basemap-layers 9.3.0-beta.2
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 +19 -0
- package/README.md +14 -0
- package/dist/atmosphere-layer.d.ts +11 -0
- package/dist/atmosphere-layer.d.ts.map +1 -0
- package/dist/atmosphere-layer.js +15 -0
- package/dist/atmosphere-layer.js.map +1 -0
- package/dist/basemap-layer.d.ts +67 -0
- package/dist/basemap-layer.d.ts.map +1 -0
- package/dist/basemap-layer.js +115 -0
- package/dist/basemap-layer.js.map +1 -0
- package/dist/globe-layers.d.ts +22 -0
- package/dist/globe-layers.d.ts.map +1 -0
- package/dist/globe-layers.js +451 -0
- package/dist/globe-layers.js.map +1 -0
- package/dist/index.cjs +947 -0
- package/dist/index.cjs.map +7 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/map-style-loader.d.ts +49 -0
- package/dist/map-style-loader.d.ts.map +1 -0
- package/dist/map-style-loader.js +35 -0
- package/dist/map-style-loader.js.map +1 -0
- package/dist/map-style-schema.d.ts +71 -0
- package/dist/map-style-schema.d.ts.map +1 -0
- package/dist/map-style-schema.js +45 -0
- package/dist/map-style-schema.js.map +1 -0
- package/dist/map-style.cjs +250 -0
- package/dist/map-style.cjs.map +7 -0
- package/dist/map-style.d.ts +7 -0
- package/dist/map-style.d.ts.map +1 -0
- package/dist/map-style.js +6 -0
- package/dist/map-style.js.map +1 -0
- package/dist/mapbox-style.d.ts +41 -0
- package/dist/mapbox-style.d.ts.map +1 -0
- package/dist/mapbox-style.js +113 -0
- package/dist/mapbox-style.js.map +1 -0
- package/dist/mvt-label-layer.d.ts +8142 -0
- package/dist/mvt-label-layer.d.ts.map +1 -0
- package/dist/mvt-label-layer.js +175 -0
- package/dist/mvt-label-layer.js.map +1 -0
- package/dist/style-resolver.d.ts +88 -0
- package/dist/style-resolver.d.ts.map +1 -0
- package/dist/style-resolver.js +63 -0
- package/dist/style-resolver.js.map +1 -0
- package/dist/util.d.ts +21 -0
- package/dist/util.d.ts.map +1 -0
- package/dist/util.js +18 -0
- package/dist/util.js.map +1 -0
- package/package.json +60 -0
- package/src/atmosphere-layer.ts +15 -0
- package/src/basemap-layer.ts +183 -0
- package/src/globe-layers.ts +780 -0
- package/src/index.ts +3 -0
- package/src/map-style-loader.ts +52 -0
- package/src/map-style-schema.ts +54 -0
- package/src/map-style.ts +18 -0
- package/src/mapbox-style.ts +196 -0
- package/src/mvt-label-layer.ts +269 -0
- package/src/style-resolver.ts +173 -0
- package/src/util.ts +38 -0
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import {CompositeLayer, log, type DefaultProps, type UpdateParameters} from '@deck.gl/core';
|
|
2
|
+
import {load} from '@loaders.gl/core';
|
|
3
|
+
import {getBasemapLayers} from './globe-layers';
|
|
4
|
+
import {MapStyleLoader, type MapStyleLoaderOptions} from './map-style-loader';
|
|
5
|
+
import type {BasemapStyle, ResolvedBasemapStyle} from './style-resolver';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Logs a non-error basemap-layer runtime event to deck.gl logging.
|
|
9
|
+
*/
|
|
10
|
+
function logBasemapLayerEvent(message: string, details?: unknown): void {
|
|
11
|
+
log.info(message, details ?? '')();
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Logs a basemap-layer runtime error to deck.gl logging.
|
|
16
|
+
*/
|
|
17
|
+
function logBasemapLayerError(message: string, error: Error): void {
|
|
18
|
+
log.error(`${message}: ${error.message}`)();
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function getMapStyleLoaderOptions(
|
|
22
|
+
loadOptions: BasemapLayerProps['loadOptions']
|
|
23
|
+
): MapStyleLoaderOptions {
|
|
24
|
+
return {
|
|
25
|
+
mapStyle: (loadOptions || undefined) as NonNullable<MapStyleLoaderOptions['mapStyle']>
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Globe-related runtime toggles used by {@link BasemapLayer}.
|
|
31
|
+
*/
|
|
32
|
+
export type BasemapGlobeConfig = {
|
|
33
|
+
/** Renders the atmosphere overlays returned by the globe helpers when available. */
|
|
34
|
+
atmosphere?: boolean;
|
|
35
|
+
/** Renders the main globe basemap content when `true`. */
|
|
36
|
+
basemap?: boolean;
|
|
37
|
+
/** Enables symbol-label rendering on the globe path when `true`. */
|
|
38
|
+
labels?: boolean;
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Props accepted by {@link BasemapLayer}.
|
|
43
|
+
*/
|
|
44
|
+
export type BasemapLayerProps = {
|
|
45
|
+
/** Optional deck.gl layer identifier. */
|
|
46
|
+
id?: string;
|
|
47
|
+
/** MapLibre or Mapbox style JSON, or a URL that resolves to one. */
|
|
48
|
+
style: string | BasemapStyle | null;
|
|
49
|
+
/** Load options forwarded to {@link resolveBasemapStyle}. */
|
|
50
|
+
loadOptions?: Record<string, unknown> | null;
|
|
51
|
+
/** Selects whether deck layers are generated for a flat map or a globe. */
|
|
52
|
+
mode?: 'map' | 'globe';
|
|
53
|
+
/** Optional globe-specific configuration used when `mode` is `'globe'`. */
|
|
54
|
+
globe?: {
|
|
55
|
+
/** Rendering toggles for globe-specific basemap behavior. */
|
|
56
|
+
config?: BasemapGlobeConfig;
|
|
57
|
+
};
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Internal state tracked by {@link BasemapLayer}.
|
|
62
|
+
*/
|
|
63
|
+
type BasemapLayerState = {
|
|
64
|
+
/** The fully resolved style definition currently backing the generated sublayers. */
|
|
65
|
+
resolvedStyle: ResolvedBasemapStyle | null;
|
|
66
|
+
/** The most recent style-resolution error, if one occurred. */
|
|
67
|
+
loadError: Error | null;
|
|
68
|
+
/** Monotonic token used to discard stale async style loads. */
|
|
69
|
+
loadToken: number;
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* A deck.gl {@link CompositeLayer} that loads a style document and renders the
|
|
74
|
+
* corresponding basemap sublayers.
|
|
75
|
+
*/
|
|
76
|
+
export class BasemapLayer extends CompositeLayer<Required<BasemapLayerProps>> {
|
|
77
|
+
/** Deck.gl layer name. */
|
|
78
|
+
static layerName = 'BasemapLayer';
|
|
79
|
+
|
|
80
|
+
/** Default props for {@link BasemapLayer}. */
|
|
81
|
+
static defaultProps: DefaultProps<BasemapLayerProps> = {
|
|
82
|
+
mode: 'map',
|
|
83
|
+
globe: {
|
|
84
|
+
type: 'object',
|
|
85
|
+
value: {
|
|
86
|
+
config: {
|
|
87
|
+
atmosphere: false,
|
|
88
|
+
basemap: true,
|
|
89
|
+
labels: true
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
style: null,
|
|
94
|
+
loadOptions: null
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
/** Current layer state. */
|
|
98
|
+
state: BasemapLayerState = undefined!;
|
|
99
|
+
|
|
100
|
+
/** Initializes the asynchronous style-loading state. */
|
|
101
|
+
initializeState(): void {
|
|
102
|
+
this.state = {
|
|
103
|
+
resolvedStyle: null,
|
|
104
|
+
loadError: null,
|
|
105
|
+
loadToken: 0
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/** Reacts to changes in the input style definition. */
|
|
110
|
+
updateState({props, oldProps, changeFlags}: UpdateParameters<this>): void {
|
|
111
|
+
if (
|
|
112
|
+
changeFlags.dataChanged ||
|
|
113
|
+
props.style !== oldProps.style ||
|
|
114
|
+
props.loadOptions !== oldProps.loadOptions
|
|
115
|
+
) {
|
|
116
|
+
this.loadStyle(props.style, props.loadOptions);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Resolves the configured style input and stores the latest successful result
|
|
122
|
+
* in layer state.
|
|
123
|
+
*/
|
|
124
|
+
loadStyle(
|
|
125
|
+
style: BasemapLayerProps['style'],
|
|
126
|
+
loadOptions: BasemapLayerProps['loadOptions']
|
|
127
|
+
): void {
|
|
128
|
+
if (!style) {
|
|
129
|
+
const loadToken = this.state.loadToken + 1;
|
|
130
|
+
logBasemapLayerEvent('Clearing basemap style');
|
|
131
|
+
this.setState({resolvedStyle: null, loadError: null, loadToken});
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
const loadToken = this.state.loadToken + 1;
|
|
136
|
+
this.setState({loadToken});
|
|
137
|
+
logBasemapLayerEvent('Resolving basemap style', {
|
|
138
|
+
style: typeof style === 'string' ? style : 'inline-style-object',
|
|
139
|
+
loadToken
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
Promise.resolve(
|
|
143
|
+
typeof style === 'string'
|
|
144
|
+
? load(style, MapStyleLoader, getMapStyleLoaderOptions(loadOptions))
|
|
145
|
+
: MapStyleLoader.parse(
|
|
146
|
+
new TextEncoder().encode(JSON.stringify(style)).buffer,
|
|
147
|
+
getMapStyleLoaderOptions(loadOptions)
|
|
148
|
+
)
|
|
149
|
+
)
|
|
150
|
+
.then((resolvedStyle) => {
|
|
151
|
+
if (this.state.loadToken === loadToken) {
|
|
152
|
+
logBasemapLayerEvent('Resolved basemap style', {
|
|
153
|
+
loadToken,
|
|
154
|
+
sources: Object.keys(resolvedStyle.sources || {}),
|
|
155
|
+
layers: resolvedStyle.layers?.length || 0
|
|
156
|
+
});
|
|
157
|
+
this.setState({resolvedStyle, loadError: null});
|
|
158
|
+
}
|
|
159
|
+
})
|
|
160
|
+
.catch((error: Error) => {
|
|
161
|
+
if (this.state.loadToken === loadToken) {
|
|
162
|
+
logBasemapLayerError('Failed to resolve basemap style', error);
|
|
163
|
+
this.setState({resolvedStyle: null, loadError: error});
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/** Renders the sublayers generated from the resolved style definition. */
|
|
169
|
+
renderLayers() {
|
|
170
|
+
if (!this.state.resolvedStyle) {
|
|
171
|
+
return [];
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
return getBasemapLayers({
|
|
175
|
+
idPrefix: this.props.id,
|
|
176
|
+
mode: this.props.mode,
|
|
177
|
+
globe: this.props.globe,
|
|
178
|
+
styleDefinition: this.state.resolvedStyle,
|
|
179
|
+
zoom: this.context.viewport?.zoom || 0,
|
|
180
|
+
loadOptions: this.props.loadOptions
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
}
|