@deck.gl/geo-layers 8.10.0-alpha.7 → 9.0.0-alpha.4

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 (115) hide show
  1. package/dist/dist.dev.js +2374 -19037
  2. package/dist/es5/geo-cell-layer/GeoCellLayer.js.map +1 -1
  3. package/dist/es5/geohash-layer/geohash-layer.js.map +1 -1
  4. package/dist/es5/great-circle-layer/great-circle-layer.js.map +1 -1
  5. package/dist/es5/h3-layers/h3-cluster-layer.js +10 -1
  6. package/dist/es5/h3-layers/h3-cluster-layer.js.map +1 -1
  7. package/dist/es5/h3-layers/h3-hexagon-layer.js.map +1 -1
  8. package/dist/es5/index.js +0 -8
  9. package/dist/es5/index.js.map +1 -1
  10. package/{src/mesh-layer/mesh-layer.ts → dist/es5/mesh-layer/mesh-layer.ts.disabled} +8 -7
  11. package/dist/es5/mvt-layer/mvt-layer.js +15 -6
  12. package/dist/es5/mvt-layer/mvt-layer.js.map +1 -1
  13. package/dist/es5/quadkey-layer/quadkey-layer.js.map +1 -1
  14. package/dist/es5/s2-layer/s2-layer.js.map +1 -1
  15. package/dist/es5/terrain-layer/terrain-layer.js.map +1 -1
  16. package/{src/tile-3d-layer/tile-3d-layer.ts → dist/es5/tile-3d-layer/tile-3d-layer.ts.disabled} +10 -11
  17. package/dist/es5/tile-layer/tile-layer.js +19 -9
  18. package/dist/es5/tile-layer/tile-layer.js.map +1 -1
  19. package/dist/es5/tileset-2d/tile-2d-traversal.js.map +1 -1
  20. package/dist/es5/tileset-2d/tileset-2d.js +1 -1
  21. package/dist/es5/tileset-2d/tileset-2d.js.map +1 -1
  22. package/dist/es5/tileset-2d/utils.js +2 -3
  23. package/dist/es5/tileset-2d/utils.js.map +1 -1
  24. package/dist/es5/trips-layer/trips-layer.js.map +1 -1
  25. package/dist/es5/wms-layer/wms-layer.js +6 -8
  26. package/dist/es5/wms-layer/wms-layer.js.map +1 -1
  27. package/dist/esm/geo-cell-layer/GeoCellLayer.js.map +1 -1
  28. package/dist/esm/geohash-layer/geohash-layer.js.map +1 -1
  29. package/dist/esm/great-circle-layer/great-circle-layer.js.map +1 -1
  30. package/dist/esm/h3-layers/h3-cluster-layer.js +5 -0
  31. package/dist/esm/h3-layers/h3-cluster-layer.js.map +1 -1
  32. package/dist/esm/h3-layers/h3-hexagon-layer.js.map +1 -1
  33. package/dist/esm/index.js +0 -1
  34. package/dist/esm/index.js.map +1 -1
  35. package/dist/esm/mesh-layer/mesh-layer.ts.disabled +176 -0
  36. package/dist/esm/mvt-layer/mvt-layer.js +6 -1
  37. package/dist/esm/mvt-layer/mvt-layer.js.map +1 -1
  38. package/dist/esm/quadkey-layer/quadkey-layer.js.map +1 -1
  39. package/dist/esm/s2-layer/s2-layer.js.map +1 -1
  40. package/dist/esm/terrain-layer/terrain-layer.js.map +1 -1
  41. package/dist/esm/tile-3d-layer/tile-3d-layer.ts.disabled +435 -0
  42. package/dist/esm/tile-layer/tile-layer.js +10 -6
  43. package/dist/esm/tile-layer/tile-layer.js.map +1 -1
  44. package/dist/esm/tileset-2d/tile-2d-traversal.js.map +1 -1
  45. package/dist/esm/tileset-2d/tileset-2d.js +1 -1
  46. package/dist/esm/tileset-2d/tileset-2d.js.map +1 -1
  47. package/dist/esm/tileset-2d/utils.js +2 -2
  48. package/dist/esm/tileset-2d/utils.js.map +1 -1
  49. package/dist/esm/trips-layer/trips-layer.js.map +1 -1
  50. package/dist/esm/wms-layer/wms-layer.js +5 -5
  51. package/dist/esm/wms-layer/wms-layer.js.map +1 -1
  52. package/dist.min.js +29 -161
  53. package/package.json +14 -14
  54. package/src/geo-cell-layer/GeoCellLayer.ts +1 -1
  55. package/src/geohash-layer/geohash-layer.ts +2 -2
  56. package/src/great-circle-layer/great-circle-layer.ts +1 -1
  57. package/src/h3-layers/h3-cluster-layer.ts +6 -2
  58. package/src/h3-layers/h3-hexagon-layer.ts +2 -2
  59. package/src/index.ts +4 -2
  60. package/src/mesh-layer/mesh-layer.ts.disabled +176 -0
  61. package/src/mvt-layer/mvt-layer.ts +16 -6
  62. package/src/quadkey-layer/quadkey-layer.ts +3 -2
  63. package/src/s2-layer/s2-layer.ts +2 -2
  64. package/src/terrain-layer/terrain-layer.ts +2 -2
  65. package/src/tile-3d-layer/tile-3d-layer.ts.disabled +435 -0
  66. package/src/tile-layer/tile-layer.ts +20 -10
  67. package/src/tileset-2d/tile-2d-traversal.ts +1 -1
  68. package/src/tileset-2d/tileset-2d.ts +6 -7
  69. package/src/tileset-2d/utils.ts +4 -4
  70. package/src/trips-layer/trips-layer.ts +3 -3
  71. package/src/wms-layer/wms-layer.ts +10 -8
  72. package/typed/geo-cell-layer/GeoCellLayer.d.ts +1 -1
  73. package/typed/geo-cell-layer/GeoCellLayer.d.ts.map +1 -1
  74. package/typed/geohash-layer/geohash-layer.d.ts +2 -2
  75. package/typed/geohash-layer/geohash-layer.d.ts.map +1 -1
  76. package/typed/great-circle-layer/great-circle-layer.d.ts +2 -2
  77. package/typed/great-circle-layer/great-circle-layer.d.ts.map +1 -1
  78. package/typed/h3-layers/h3-cluster-layer.d.ts +7 -2
  79. package/typed/h3-layers/h3-cluster-layer.d.ts.map +1 -1
  80. package/typed/h3-layers/h3-hexagon-layer.d.ts +2 -2
  81. package/typed/h3-layers/h3-hexagon-layer.d.ts.map +1 -1
  82. package/typed/index.d.ts +0 -2
  83. package/typed/index.d.ts.map +1 -1
  84. package/typed/mvt-layer/mvt-layer.d.ts +9 -1
  85. package/typed/mvt-layer/mvt-layer.d.ts.map +1 -1
  86. package/typed/quadkey-layer/quadkey-layer.d.ts +2 -2
  87. package/typed/quadkey-layer/quadkey-layer.d.ts.map +1 -1
  88. package/typed/s2-layer/s2-layer.d.ts +2 -2
  89. package/typed/s2-layer/s2-layer.d.ts.map +1 -1
  90. package/typed/terrain-layer/terrain-layer.d.ts +2 -2
  91. package/typed/terrain-layer/terrain-layer.d.ts.map +1 -1
  92. package/typed/tile-layer/tile-layer.d.ts +7 -2
  93. package/typed/tile-layer/tile-layer.d.ts.map +1 -1
  94. package/typed/tileset-2d/tile-2d-traversal.d.ts +1 -1
  95. package/typed/tileset-2d/tile-2d-traversal.d.ts.map +1 -1
  96. package/typed/tileset-2d/tileset-2d.d.ts +4 -4
  97. package/typed/tileset-2d/tileset-2d.d.ts.map +1 -1
  98. package/typed/tileset-2d/utils.d.ts +2 -2
  99. package/typed/tileset-2d/utils.d.ts.map +1 -1
  100. package/typed/trips-layer/trips-layer.d.ts +3 -3
  101. package/typed/trips-layer/trips-layer.d.ts.map +1 -1
  102. package/typed/wms-layer/wms-layer.d.ts.map +1 -1
  103. package/LICENSE +0 -19
  104. package/dist/es5/mesh-layer/mesh-layer.js +0 -212
  105. package/dist/es5/mesh-layer/mesh-layer.js.map +0 -1
  106. package/dist/es5/tile-3d-layer/tile-3d-layer.js +0 -512
  107. package/dist/es5/tile-3d-layer/tile-3d-layer.js.map +0 -1
  108. package/dist/esm/mesh-layer/mesh-layer.js +0 -177
  109. package/dist/esm/mesh-layer/mesh-layer.js.map +0 -1
  110. package/dist/esm/tile-3d-layer/tile-3d-layer.js +0 -443
  111. package/dist/esm/tile-3d-layer/tile-3d-layer.js.map +0 -1
  112. package/typed/mesh-layer/mesh-layer.d.ts +0 -38
  113. package/typed/mesh-layer/mesh-layer.d.ts.map +0 -1
  114. package/typed/tile-3d-layer/tile-3d-layer.d.ts +0 -62
  115. package/typed/tile-3d-layer/tile-3d-layer.d.ts.map +0 -1
@@ -0,0 +1,435 @@
1
+ import {GL} from '@luma.gl/constants';
2
+ import {Geometry} from '@luma.gl/engine';
3
+
4
+ import {
5
+ Accessor,
6
+ Color,
7
+ CompositeLayer,
8
+ CompositeLayerProps,
9
+ COORDINATE_SYSTEM,
10
+ FilterContext,
11
+ GetPickingInfoParams,
12
+ Layer,
13
+ LayersList,
14
+ log,
15
+ PickingInfo,
16
+ UpdateParameters,
17
+ Viewport,
18
+ DefaultProps
19
+ } from '@deck.gl/core';
20
+ import {PointCloudLayer} from '@deck.gl/layers';
21
+ import {ScenegraphLayer} from '@deck.gl/mesh-layers';
22
+ import {default as MeshLayer} from '../mesh-layer/mesh-layer';
23
+
24
+ import {load} from '@loaders.gl/core';
25
+ import {MeshAttributes} from '@loaders.gl/schema';
26
+ import {Tileset3D, Tile3D, TILE_TYPE} from '@loaders.gl/tiles';
27
+ import {Tiles3DLoader} from '@loaders.gl/3d-tiles';
28
+
29
+ const SINGLE_DATA = [0];
30
+
31
+ const defaultProps: DefaultProps<Tile3DLayerProps> = {
32
+ getPointColor: {type: 'accessor', value: [0, 0, 0, 255]},
33
+ pointSize: 1.0,
34
+
35
+ // Disable async data loading (handling it in _loadTileSet)
36
+ data: '',
37
+ loader: Tiles3DLoader,
38
+
39
+ onTilesetLoad: {type: 'function', value: tileset3d => {}},
40
+ onTileLoad: {type: 'function', value: tileHeader => {}},
41
+ onTileUnload: {type: 'function', value: tileHeader => {}},
42
+ onTileError: {type: 'function', value: (tile, message, url) => {}},
43
+ _getMeshColor: {type: 'function', value: tileHeader => [255, 255, 255]}
44
+ };
45
+
46
+ /** All properties supported by Tile3DLayer */
47
+ export type Tile3DLayerProps<DataT = unknown> = _Tile3DLayerProps<DataT> & CompositeLayerProps;
48
+
49
+ /** Props added by the Tile3DLayer */
50
+ type _Tile3DLayerProps<DataT> = {
51
+ data: string;
52
+ /** Color Accessor for point clouds. **/
53
+ getPointColor?: Accessor<DataT, Color>;
54
+
55
+ /** Global radius of all points in pixels. **/
56
+ pointSize?: number;
57
+
58
+ /** A loader which is used to decode the fetched tiles.
59
+ * @deprecated Use `loaders` instead
60
+ */
61
+ loader?: typeof Tiles3DLoader;
62
+
63
+ /** Called when Tileset JSON file is loaded. **/
64
+ onTilesetLoad?: (tile: Tileset3D) => void;
65
+
66
+ /** Called when a tile in the tileset hierarchy is loaded. **/
67
+ onTileLoad?: (tile: Tile3D) => void;
68
+
69
+ /** Called when a tile is unloaded. **/
70
+ onTileUnload?: (tile: Tile3D) => void;
71
+
72
+ /** Called when a tile fails to load. **/
73
+ onTileError?: (tile: Tile3D, url: string, message: string) => void;
74
+
75
+ /** (Experimental) Accessor to change color of mesh based on properties. **/
76
+ _getMeshColor?: (tile: Tile3D) => Color;
77
+ };
78
+
79
+ /** Render 3d tiles data formatted according to the [3D Tiles Specification](https://www.opengeospatial.org/standards/3DTiles) and [`ESRI I3S`](https://github.com/Esri/i3s-spec) */
80
+ export default class Tile3DLayer<DataT = any, ExtraPropsT extends {} = {}> extends CompositeLayer<
81
+ ExtraPropsT & Required<_Tile3DLayerProps<DataT>>
82
+ > {
83
+ static defaultProps = defaultProps;
84
+ static layerName = 'Tile3DLayer';
85
+
86
+ state!: {
87
+ activeViewports: {};
88
+ frameNumber?: number;
89
+ lastUpdatedViewports: {[viewportId: string]: Viewport} | null;
90
+ layerMap: {[layerId: string]: any};
91
+ tileset3d: Tileset3D | null;
92
+ };
93
+
94
+ initializeState() {
95
+ if ('onTileLoadFail' in this.props) {
96
+ log.removed('onTileLoadFail', 'onTileError')();
97
+ }
98
+ // prop verification
99
+ this.state = {
100
+ layerMap: {},
101
+ tileset3d: null,
102
+ activeViewports: {},
103
+ lastUpdatedViewports: null
104
+ };
105
+ }
106
+
107
+ get isLoaded(): boolean {
108
+ return Boolean(this.state?.tileset3d?.isLoaded() && super.isLoaded);
109
+ }
110
+
111
+ shouldUpdateState({changeFlags}: UpdateParameters<this>): boolean {
112
+ return changeFlags.somethingChanged;
113
+ }
114
+
115
+ updateState({props, oldProps, changeFlags}: UpdateParameters<this>): void {
116
+ if (props.data && props.data !== oldProps.data) {
117
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
118
+ this._loadTileset(props.data);
119
+ }
120
+
121
+ if (changeFlags.viewportChanged) {
122
+ const {activeViewports} = this.state;
123
+ const viewportsNumber = Object.keys(activeViewports).length;
124
+ if (viewportsNumber) {
125
+ this._updateTileset(activeViewports);
126
+ this.state.lastUpdatedViewports = activeViewports;
127
+ this.state.activeViewports = {};
128
+ }
129
+ }
130
+ if (changeFlags.propsChanged) {
131
+ const {layerMap} = this.state;
132
+ for (const key in layerMap) {
133
+ layerMap[key].needsUpdate = true;
134
+ }
135
+ }
136
+ }
137
+
138
+ activateViewport(viewport: Viewport): void {
139
+ const {activeViewports, lastUpdatedViewports} = this.state;
140
+ this.internalState.viewport = viewport;
141
+
142
+ activeViewports[viewport.id] = viewport;
143
+ const lastViewport = lastUpdatedViewports?.[viewport.id];
144
+ if (!lastViewport || !viewport.equals(lastViewport)) {
145
+ this.setChangeFlags({viewportChanged: true});
146
+ this.setNeedsUpdate();
147
+ }
148
+ }
149
+
150
+ getPickingInfo({info, sourceLayer}: GetPickingInfoParams) {
151
+ const sourceTile = sourceLayer && (sourceLayer.props as any).tile;
152
+ if (info.picked) {
153
+ info.object = sourceTile;
154
+ }
155
+ (info as any).sourceTile = sourceTile;
156
+
157
+ return info;
158
+ }
159
+
160
+ filterSubLayer({layer, viewport}: FilterContext): boolean {
161
+ // All sublayers will have a tile prop
162
+ const {tile} = layer.props as unknown as {tile: Tile3D};
163
+ const {id: viewportId} = viewport;
164
+ return tile.selected && tile.viewportIds.includes(viewportId);
165
+ }
166
+
167
+ protected _updateAutoHighlight(info: PickingInfo): void {
168
+ const sourceTile = (info as any).sourceTile;
169
+ const layerCache = this.state.layerMap[sourceTile?.id];
170
+ if (layerCache && layerCache.layer) {
171
+ layerCache.layer.updateAutoHighlight(info);
172
+ }
173
+ }
174
+
175
+ private async _loadTileset(tilesetUrl) {
176
+ const {loadOptions = {}} = this.props;
177
+
178
+ // TODO: deprecate `loader` in v9.0
179
+ // @ts-ignore
180
+ const loaders = this.props.loader || this.props.loaders;
181
+ const loader = Array.isArray(loaders) ? loaders[0] : loaders;
182
+
183
+ const options = {loadOptions: {...loadOptions}};
184
+ let actualTilesetUrl = tilesetUrl;
185
+ // @ts-expect-error preload
186
+ if (loader.preload) {
187
+ // @ts-expect-error preload
188
+ const preloadOptions = await loader.preload(tilesetUrl, loadOptions);
189
+ if (preloadOptions.url) {
190
+ actualTilesetUrl = preloadOptions.url;
191
+ }
192
+
193
+ if (preloadOptions.headers) {
194
+ options.loadOptions.fetch = {
195
+ ...options.loadOptions.fetch,
196
+ headers: preloadOptions.headers
197
+ };
198
+ }
199
+ Object.assign(options, preloadOptions);
200
+ }
201
+ const tilesetJson = await load(actualTilesetUrl, loader, options.loadOptions);
202
+
203
+ const tileset3d = new Tileset3D(tilesetJson, {
204
+ onTileLoad: this._onTileLoad.bind(this),
205
+ onTileUnload: this._onTileUnload.bind(this),
206
+ onTileError: this.props.onTileError,
207
+ ...options
208
+ });
209
+
210
+ this.setState({
211
+ tileset3d,
212
+ layerMap: {}
213
+ });
214
+
215
+ this._updateTileset(this.state.activeViewports);
216
+ this.props.onTilesetLoad(tileset3d);
217
+ }
218
+
219
+ private _onTileLoad(tileHeader: Tile3D): void {
220
+ const {lastUpdatedViewports} = this.state;
221
+ this.props.onTileLoad(tileHeader);
222
+ this._updateTileset(lastUpdatedViewports);
223
+ this.setNeedsUpdate();
224
+ }
225
+
226
+ private _onTileUnload(tileHeader: Tile3D): void {
227
+ // Was cleaned up from tileset cache. We no longer need to track it.
228
+ delete this.state.layerMap[tileHeader.id];
229
+ this.props.onTileUnload(tileHeader);
230
+ }
231
+
232
+ private _updateTileset(viewports: {[viewportId: string]: Viewport} | null): void {
233
+ if (!viewports) {
234
+ return;
235
+ }
236
+ const {tileset3d} = this.state;
237
+ const {timeline} = this.context;
238
+ const viewportsNumber = Object.keys(viewports).length;
239
+ if (!timeline || !viewportsNumber || !tileset3d) {
240
+ return;
241
+ }
242
+
243
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
244
+ tileset3d.selectTiles(Object.values(viewports)).then(frameNumber => {
245
+ const tilesetChanged = this.state.frameNumber !== frameNumber;
246
+ if (tilesetChanged) {
247
+ this.setState({frameNumber});
248
+ }
249
+ });
250
+ }
251
+
252
+ private _getSubLayer(
253
+ tileHeader: Tile3D,
254
+ oldLayer?: Layer
255
+ ): MeshLayer<DataT> | PointCloudLayer<DataT> | ScenegraphLayer<DataT> | null {
256
+ if (!tileHeader.content) {
257
+ return null;
258
+ }
259
+
260
+ switch (tileHeader.type) {
261
+ case TILE_TYPE.POINTCLOUD:
262
+ return this._makePointCloudLayer(tileHeader, oldLayer as PointCloudLayer<DataT>);
263
+ case TILE_TYPE.SCENEGRAPH:
264
+ return this._make3DModelLayer(tileHeader);
265
+ case TILE_TYPE.MESH:
266
+ return this._makeSimpleMeshLayer(tileHeader, oldLayer as MeshLayer<DataT>);
267
+ default:
268
+ throw new Error(`Tile3DLayer: Failed to render layer of type ${tileHeader.content.type}`);
269
+ }
270
+ }
271
+
272
+ private _makePointCloudLayer(
273
+ tileHeader: Tile3D,
274
+ oldLayer?: PointCloudLayer<DataT>
275
+ ): PointCloudLayer<DataT> | null {
276
+ const {attributes, pointCount, constantRGBA, cartographicOrigin, modelMatrix} =
277
+ tileHeader.content;
278
+ const {positions, normals, colors} = attributes;
279
+
280
+ if (!positions) {
281
+ return null;
282
+ }
283
+ const data = (oldLayer && oldLayer.props.data) || {
284
+ header: {
285
+ vertexCount: pointCount
286
+ },
287
+ attributes: {
288
+ POSITION: positions,
289
+ NORMAL: normals,
290
+ COLOR_0: colors
291
+ }
292
+ };
293
+
294
+ const {pointSize, getPointColor} = this.props;
295
+ const SubLayerClass = this.getSubLayerClass('pointcloud', PointCloudLayer);
296
+ return new SubLayerClass(
297
+ {
298
+ pointSize
299
+ },
300
+ this.getSubLayerProps({
301
+ id: 'pointcloud'
302
+ }),
303
+ {
304
+ id: `${this.id}-pointcloud-${tileHeader.id}`,
305
+ tile: tileHeader,
306
+ data,
307
+ coordinateSystem: COORDINATE_SYSTEM.METER_OFFSETS,
308
+ coordinateOrigin: cartographicOrigin,
309
+ modelMatrix,
310
+ getColor: constantRGBA || getPointColor,
311
+ _offset: 0
312
+ }
313
+ );
314
+ }
315
+
316
+ private _make3DModelLayer(tileHeader: Tile3D): ScenegraphLayer<DataT> {
317
+ const {gltf, instances, cartographicOrigin, modelMatrix} = tileHeader.content;
318
+
319
+ const SubLayerClass = this.getSubLayerClass('scenegraph', ScenegraphLayer);
320
+
321
+ return new SubLayerClass(
322
+ {
323
+ _lighting: 'pbr'
324
+ },
325
+ this.getSubLayerProps({
326
+ id: 'scenegraph'
327
+ }),
328
+ {
329
+ id: `${this.id}-scenegraph-${tileHeader.id}`,
330
+ tile: tileHeader,
331
+ data: instances || SINGLE_DATA,
332
+ scenegraph: gltf,
333
+
334
+ coordinateSystem: COORDINATE_SYSTEM.METER_OFFSETS,
335
+ coordinateOrigin: cartographicOrigin,
336
+ modelMatrix,
337
+ getTransformMatrix: instance => instance.modelMatrix,
338
+ getPosition: [0, 0, 0],
339
+ _offset: 0
340
+ }
341
+ );
342
+ }
343
+
344
+ private _makeSimpleMeshLayer(tileHeader: Tile3D, oldLayer?: MeshLayer<DataT>): MeshLayer<DataT> {
345
+ const content = tileHeader.content;
346
+ const {
347
+ attributes,
348
+ indices,
349
+ modelMatrix,
350
+ cartographicOrigin,
351
+ coordinateSystem = COORDINATE_SYSTEM.METER_OFFSETS,
352
+ material,
353
+ featureIds
354
+ } = content;
355
+ const {_getMeshColor} = this.props;
356
+
357
+ const geometry =
358
+ (oldLayer && oldLayer.props.mesh) ||
359
+ new Geometry({
360
+ topology: 'triangle-list',
361
+ attributes: getMeshGeometry(attributes),
362
+ indices
363
+ });
364
+
365
+ const SubLayerClass = this.getSubLayerClass('mesh', MeshLayer);
366
+
367
+ return new SubLayerClass(
368
+ this.getSubLayerProps({
369
+ id: 'mesh'
370
+ }),
371
+ {
372
+ id: `${this.id}-mesh-${tileHeader.id}`,
373
+ tile: tileHeader,
374
+ mesh: geometry,
375
+ data: SINGLE_DATA,
376
+ getColor: _getMeshColor(tileHeader),
377
+ pbrMaterial: material,
378
+ modelMatrix,
379
+ coordinateOrigin: cartographicOrigin,
380
+ coordinateSystem,
381
+ featureIds,
382
+ _offset: 0
383
+ }
384
+ );
385
+ }
386
+
387
+ renderLayers(): Layer | null | LayersList {
388
+ const {tileset3d, layerMap} = this.state;
389
+ if (!tileset3d) {
390
+ return null;
391
+ }
392
+
393
+ // loaders.gl doesn't provide a type for tileset3d.tiles
394
+ return (tileset3d.tiles as Tile3D[])
395
+ .map(tile => {
396
+ const layerCache = (layerMap[tile.id] = layerMap[tile.id] || {tile});
397
+ let {layer} = layerCache;
398
+ if (tile.selected) {
399
+ // render selected tiles
400
+ if (!layer) {
401
+ // create layer
402
+ layer = this._getSubLayer(tile);
403
+ } else if (layerCache.needsUpdate) {
404
+ // props have changed, rerender layer
405
+ layer = this._getSubLayer(tile, layer);
406
+ layerCache.needsUpdate = false;
407
+ }
408
+ }
409
+ layerCache.layer = layer;
410
+ return layer;
411
+ })
412
+ .filter(Boolean);
413
+ }
414
+ }
415
+
416
+ function getMeshGeometry(contentAttributes: MeshAttributes): MeshAttributes {
417
+ const attributes: MeshAttributes = {};
418
+ attributes.positions = {
419
+ ...contentAttributes.positions,
420
+ value: new Float32Array(contentAttributes.positions.value)
421
+ };
422
+ if (contentAttributes.normals) {
423
+ attributes.normals = contentAttributes.normals;
424
+ }
425
+ if (contentAttributes.texCoords) {
426
+ attributes.texCoords = contentAttributes.texCoords;
427
+ }
428
+ if (contentAttributes.colors) {
429
+ attributes.colors = contentAttributes.colors;
430
+ }
431
+ if (contentAttributes.uvRegions) {
432
+ attributes.uvRegions = contentAttributes.uvRegions;
433
+ }
434
+ return attributes;
435
+ }
@@ -27,7 +27,7 @@ const defaultProps: DefaultProps<TileLayerProps> = {
27
27
  TilesetClass: Tileset2D,
28
28
  data: {type: 'data', value: []},
29
29
  dataComparator: urlType.equal,
30
- renderSubLayers: {type: 'function', value: props => new GeoJsonLayer(props)},
30
+ renderSubLayers: {type: 'function', value: (props: any) => new GeoJsonLayer(props)},
31
31
  getTileData: {type: 'function', optional: true, value: null},
32
32
  // TODO - change to onViewportLoad to align with Tile3DLayer
33
33
  onViewportLoad: {type: 'function', optional: true, value: null},
@@ -48,7 +48,7 @@ const defaultProps: DefaultProps<TileLayerProps> = {
48
48
  };
49
49
 
50
50
  /** All props supported by the TileLayer */
51
- export type TileLayerProps<DataT = any> = CompositeLayerProps & _TileLayerProps<DataT>;
51
+ export type TileLayerProps<DataT = unknown> = CompositeLayerProps & _TileLayerProps<DataT>;
52
52
 
53
53
  /** Props added by the TileLayer */
54
54
  type _TileLayerProps<DataT> = {
@@ -153,6 +153,12 @@ export default class TileLayer<DataT = any, ExtraPropsT extends {} = {}> extends
153
153
  static defaultProps: DefaultProps = defaultProps;
154
154
  static layerName = 'TileLayer';
155
155
 
156
+ state!: {
157
+ tileset: Tileset2D | null;
158
+ isLoaded: boolean;
159
+ frameNumber?: number;
160
+ };
161
+
156
162
  initializeState() {
157
163
  this.state = {
158
164
  tileset: null,
@@ -165,9 +171,12 @@ export default class TileLayer<DataT = any, ExtraPropsT extends {} = {}> extends
165
171
  }
166
172
 
167
173
  get isLoaded(): boolean {
168
- return this.state?.tileset?.selectedTiles?.every(
169
- tile => tile.isLoaded && tile.layers && tile.layers.every(layer => layer.isLoaded)
170
- );
174
+ const selectedTiles = this.state?.tileset?.selectedTiles;
175
+ return selectedTiles
176
+ ? selectedTiles.every(
177
+ tile => tile.isLoaded && tile.layers && tile.layers.every(layer => layer.isLoaded)
178
+ )
179
+ : false;
171
180
  }
172
181
 
173
182
  shouldUpdateState({changeFlags}): boolean {
@@ -194,7 +203,7 @@ export default class TileLayer<DataT = any, ExtraPropsT extends {} = {}> extends
194
203
  tileset.reloadAll();
195
204
  } else {
196
205
  // some render options changed, regenerate sub layers now
197
- this.state.tileset.tiles.forEach(tile => {
206
+ tileset.tiles.forEach(tile => {
198
207
  tile.layers = null;
199
208
  });
200
209
  }
@@ -235,7 +244,7 @@ export default class TileLayer<DataT = any, ExtraPropsT extends {} = {}> extends
235
244
  }
236
245
 
237
246
  private _updateTileset(): void {
238
- const {tileset} = this.state;
247
+ const tileset = this.state.tileset!;
239
248
  const {zRange, modelMatrix} = this.props;
240
249
  const frameNumber = tileset.update(this.context.viewport, {zRange, modelMatrix});
241
250
  const {isLoaded} = tileset;
@@ -260,7 +269,8 @@ export default class TileLayer<DataT = any, ExtraPropsT extends {} = {}> extends
260
269
  const {onViewportLoad} = this.props;
261
270
 
262
271
  if (onViewportLoad) {
263
- onViewportLoad(tileset.selectedTiles);
272
+ // This method can only be called when tileset is defined and updated
273
+ onViewportLoad(tileset!.selectedTiles!);
264
274
  }
265
275
  }
266
276
 
@@ -334,7 +344,7 @@ export default class TileLayer<DataT = any, ExtraPropsT extends {} = {}> extends
334
344
  }
335
345
 
336
346
  renderLayers(): Layer | null | LayersList {
337
- return this.state.tileset.tiles.map((tile: Tile2DHeader) => {
347
+ return this.state.tileset!.tiles.map((tile: Tile2DHeader) => {
338
348
  const subLayerProps = this.getSubLayerPropsByTile(tile);
339
349
  // cache the rendered layer in the tile
340
350
  if (!tile.isLoaded && !tile.content) {
@@ -371,6 +381,6 @@ export default class TileLayer<DataT = any, ExtraPropsT extends {} = {}> extends
371
381
 
372
382
  filterSubLayer({layer, cullRect}: FilterContext) {
373
383
  const {tile} = (layer as Layer<{tile: Tile2DHeader}>).props;
374
- return this.state.tileset.isTileVisible(tile, cullRect);
384
+ return this.state.tileset!.isTileVisible(tile, cullRect);
375
385
  }
376
386
  }
@@ -183,7 +183,7 @@ class OSMNode {
183
183
  export function getOSMTileIndices(
184
184
  viewport: Viewport,
185
185
  maxZ: number,
186
- zRange: ZRange | undefined,
186
+ zRange?: ZRange | null,
187
187
  bounds?: Bounds
188
188
  ): TileIndex[] {
189
189
  const project: ((xyz: number[]) => number[]) | null =
@@ -1,7 +1,7 @@
1
1
  import {Viewport} from '@deck.gl/core';
2
2
 
3
3
  import {RequestScheduler} from '@loaders.gl/loader-utils';
4
- import {Matrix4, equals} from '@math.gl/core';
4
+ import {Matrix4, equals, NumericArray} from '@math.gl/core';
5
5
 
6
6
  import {Tile2DHeader} from './tile-2d-header';
7
7
 
@@ -123,7 +123,7 @@ export class Tileset2D {
123
123
 
124
124
  private _cacheByteSize: number;
125
125
  private _viewport: Viewport | null;
126
- private _zRange?: ZRange;
126
+ private _zRange?: ZRange | null;
127
127
  private _selectedTiles: Tile2DHeader[] | null;
128
128
  private _frameNumber: number;
129
129
  private _modelMatrix: Matrix4;
@@ -226,9 +226,9 @@ export class Tileset2D {
226
226
  */
227
227
  update(
228
228
  viewport: Viewport,
229
- {zRange, modelMatrix}: {zRange?: ZRange; modelMatrix?: Matrix4} = {}
229
+ {zRange, modelMatrix}: {zRange?: ZRange | null; modelMatrix?: NumericArray | null} = {}
230
230
  ): number {
231
- const modelMatrixAsMatrix4 = new Matrix4(modelMatrix);
231
+ const modelMatrixAsMatrix4 = modelMatrix ? new Matrix4(modelMatrix) : new Matrix4();
232
232
  const isModelMatrixNew = !modelMatrixAsMatrix4.equals(this._modelMatrix);
233
233
  if (
234
234
  !this._viewport ||
@@ -326,7 +326,7 @@ export class Tileset2D {
326
326
  viewport: Viewport;
327
327
  maxZoom?: number;
328
328
  minZoom?: number;
329
- zRange: ZRange | undefined;
329
+ zRange?: ZRange | null;
330
330
  tileSize?: number;
331
331
  modelMatrix?: Matrix4;
332
332
  modelMatrixInverse?: Matrix4;
@@ -359,8 +359,7 @@ export class Tileset2D {
359
359
  /** Returns additional metadata to add to tile, bbox by default */
360
360
  getTileMetadata(index: TileIndex): Record<string, any> {
361
361
  const {tileSize} = this.opts;
362
- // @ts-expect-error
363
- return {bbox: tileToBoundingBox(this._viewport, index.x, index.y, index.z, tileSize)};
362
+ return {bbox: tileToBoundingBox(this._viewport!, index.x, index.y, index.z, tileSize)};
364
363
  }
365
364
 
366
365
  /** Returns index of the parent tile */
@@ -132,18 +132,18 @@ function getBoundingBox(viewport: Viewport, zRange: number[] | null, extent: Bou
132
132
  /** Get culling bounds in world space */
133
133
  export function getCullBounds({
134
134
  viewport,
135
- z = 0,
135
+ z,
136
136
  cullRect
137
137
  }: {
138
138
  /** Current viewport */
139
139
  viewport: Viewport;
140
140
  /** Current z range */
141
- z: ZRange | number | undefined;
141
+ z?: ZRange | number | null;
142
142
  /** Culling rectangle in screen space */
143
143
  cullRect: {x: number; y: number; width: number; height: number};
144
144
  }): [number, number, number, number][] {
145
145
  const subViewports = viewport.subViewports || [viewport];
146
- return subViewports.map(v => getCullBoundsInViewport(v, z, cullRect));
146
+ return subViewports.map(v => getCullBoundsInViewport(v, z || 0, cullRect));
147
147
  }
148
148
 
149
149
  function getCullBoundsInViewport(
@@ -273,7 +273,7 @@ export function getTileIndices({
273
273
  viewport: Viewport;
274
274
  maxZoom?: number;
275
275
  minZoom?: number;
276
- zRange: ZRange | undefined;
276
+ zRange?: ZRange | null;
277
277
  extent?: Bounds;
278
278
  tileSize?: number;
279
279
  modelMatrix?: Matrix4;
@@ -26,14 +26,14 @@ const defaultProps: DefaultProps<TripsLayerProps> = {
26
26
  fadeTrail: true,
27
27
  trailLength: {type: 'number', value: 120, min: 0},
28
28
  currentTime: {type: 'number', value: 0, min: 0},
29
- getTimestamps: {type: 'accessor', value: d => d.timestamps}
29
+ getTimestamps: {type: 'accessor', value: (d: any) => d.timestamps}
30
30
  };
31
31
 
32
32
  /** All properties supported by TripsLayer. */
33
- export type TripsLayerProps<DataT = any> = _TripsLayerProps<DataT> & PathLayerProps<DataT>;
33
+ export type TripsLayerProps<DataT = unknown> = _TripsLayerProps<DataT> & PathLayerProps<DataT>;
34
34
 
35
35
  /** Properties added by TripsLayer. */
36
- type _TripsLayerProps<DataT = any> = {
36
+ type _TripsLayerProps<DataT = unknown> = {
37
37
  /**
38
38
  * Whether or not the path fades out.
39
39
  * @default true
@@ -16,7 +16,7 @@ import {
16
16
  _deepEqual as deepEqual
17
17
  } from '@deck.gl/core';
18
18
  import {BitmapLayer} from '@deck.gl/layers';
19
- import type {ImageSourceMetadata, ImageType} from '@loaders.gl/loader-utils';
19
+ import type {GetImageParameters, ImageSourceMetadata, ImageType} from '@loaders.gl/loader-utils';
20
20
  import type {ImageServiceType} from '@loaders.gl/wms';
21
21
  import {ImageSource, createImageSource} from '@loaders.gl/wms';
22
22
  import {WGS84ToPseudoMercator} from './utils';
@@ -207,24 +207,26 @@ export class WMSLayer<ExtraPropsT extends {} = {}> extends CompositeLayer<
207
207
  // BitmapLayer only supports LNGLAT or CARTESIAN (Web-Mercator)
208
208
  srs = viewport.resolution ? 'EPSG:4326' : 'EPSG:3857';
209
209
  }
210
- const requestParams = {
210
+ const requestParams: GetImageParameters = {
211
211
  width,
212
212
  height,
213
- bbox: bounds,
213
+ boundingBox: [
214
+ [bounds[0], bounds[1]],
215
+ [bounds[2], bounds[3]]
216
+ ],
214
217
  layers,
215
- srs
218
+ crs: srs
216
219
  };
217
220
  if (srs === 'EPSG:3857') {
218
- const [minX, minY] = WGS84ToPseudoMercator([bounds[0], bounds[1]]);
219
- const [maxX, maxY] = WGS84ToPseudoMercator([bounds[2], bounds[3]]);
220
- requestParams.bbox = [minX, minY, maxX, maxY];
221
+ const min = WGS84ToPseudoMercator([bounds[0], bounds[1]]);
222
+ const max = WGS84ToPseudoMercator([bounds[2], bounds[3]]);
223
+ requestParams.boundingBox = [min, max];
221
224
  }
222
225
 
223
226
  try {
224
227
  this.state.loadCounter++;
225
228
  this.props.onImageLoadStart(requestId);
226
229
 
227
- // @ts-expect-error Check type changes
228
230
  const image = await this.state.imageSource.getImage(requestParams);
229
231
 
230
232
  // If a request takes a long time, later requests may have already loaded.
@@ -1,7 +1,7 @@
1
1
  import { CompositeLayer, Layer, LayersList, DefaultProps } from '@deck.gl/core/typed';
2
2
  import { PolygonLayerProps } from '@deck.gl/layers/typed';
3
3
  /** All properties supported by GeoCellLayer. */
4
- export declare type GeoCellLayerProps<DataT = any> = PolygonLayerProps<DataT>;
4
+ export declare type GeoCellLayerProps<DataT = unknown> = PolygonLayerProps<DataT>;
5
5
  export default class GeoCellLayer<DataT = any, ExtraProps extends {} = {}> extends CompositeLayer<Required<GeoCellLayerProps<DataT>> & ExtraProps> {
6
6
  static layerName: string;
7
7
  static defaultProps: DefaultProps;
@@ -1 +1 @@
1
- {"version":3,"file":"GeoCellLayer.d.ts","sourceRoot":"","sources":["../../src/geo-cell-layer/GeoCellLayer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAC,MAAM,eAAe,CAAC;AAC9E,OAAO,EAAe,iBAAiB,EAAC,MAAM,iBAAiB,CAAC;AAMhE,gDAAgD;AAChD,oBAAY,iBAAiB,CAAC,KAAK,GAAG,GAAG,IAAI,iBAAiB,CAAC,KAAK,CAAC,CAAC;AAEtE,MAAM,CAAC,OAAO,OAAO,YAAY,CAAC,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,EAAE,GAAG,EAAE,CAAE,SAAQ,cAAc,CAC/F,QAAQ,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,GAAG,UAAU,CAChD;IACC,MAAM,CAAC,SAAS,SAAkB;IAClC,MAAM,CAAC,YAAY,EAAE,YAAY,CAAgB;IAEjD,sDAAsD;IACtD,aAAa,IAAI,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI;IAItD,YAAY,IAAI,KAAK,GAAG,IAAI,GAAG,UAAU;CAiE1C"}
1
+ {"version":3,"file":"GeoCellLayer.d.ts","sourceRoot":"","sources":["../../src/geo-cell-layer/GeoCellLayer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAC,MAAM,eAAe,CAAC;AAC9E,OAAO,EAAe,iBAAiB,EAAC,MAAM,iBAAiB,CAAC;AAMhE,gDAAgD;AAChD,oBAAY,iBAAiB,CAAC,KAAK,GAAG,OAAO,IAAI,iBAAiB,CAAC,KAAK,CAAC,CAAC;AAE1E,MAAM,CAAC,OAAO,OAAO,YAAY,CAAC,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,EAAE,GAAG,EAAE,CAAE,SAAQ,cAAc,CAC/F,QAAQ,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,GAAG,UAAU,CAChD;IACC,MAAM,CAAC,SAAS,SAAkB;IAClC,MAAM,CAAC,YAAY,EAAE,YAAY,CAAgB;IAEjD,sDAAsD;IACtD,aAAa,IAAI,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI;IAItD,YAAY,IAAI,KAAK,GAAG,IAAI,GAAG,UAAU;CAiE1C"}