@deck.gl/geo-layers 8.7.10 → 8.8.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 (62) hide show
  1. package/dist/dist.dev.js +62999 -30700
  2. package/dist/es5/geo-cell-layer/GeoCellLayer.js +3 -3
  3. package/dist/es5/geo-cell-layer/GeoCellLayer.js.map +1 -1
  4. package/dist/es5/index.js +8 -0
  5. package/dist/es5/index.js.map +1 -1
  6. package/dist/es5/mvt-layer/mvt-layer.js +19 -19
  7. package/dist/es5/mvt-layer/mvt-layer.js.map +1 -1
  8. package/dist/es5/quadkey-layer/quadkey-layer.js +4 -2
  9. package/dist/es5/quadkey-layer/quadkey-layer.js.map +1 -1
  10. package/dist/es5/quadkey-layer/quadkey-utils.js.map +1 -1
  11. package/dist/es5/tile-3d-layer/tile-3d-layer.js +13 -10
  12. package/dist/es5/tile-3d-layer/tile-3d-layer.js.map +1 -1
  13. package/dist/es5/tile-layer/tile-2d-header.js +36 -17
  14. package/dist/es5/tile-layer/tile-2d-header.js.map +1 -1
  15. package/dist/es5/tile-layer/tile-2d-traversal.js +13 -3
  16. package/dist/es5/tile-layer/tile-2d-traversal.js.map +1 -1
  17. package/dist/es5/tile-layer/tile-layer.js +38 -32
  18. package/dist/es5/tile-layer/tile-layer.js.map +1 -1
  19. package/dist/es5/tile-layer/tileset-2d.js +122 -96
  20. package/dist/es5/tile-layer/tileset-2d.js.map +1 -1
  21. package/dist/es5/tile-layer/types.js +2 -0
  22. package/dist/es5/tile-layer/types.js.map +1 -0
  23. package/dist/es5/tile-layer/utils.js +27 -9
  24. package/dist/es5/tile-layer/utils.js.map +1 -1
  25. package/dist/esm/geo-cell-layer/GeoCellLayer.js +6 -3
  26. package/dist/esm/geo-cell-layer/GeoCellLayer.js.map +1 -1
  27. package/dist/esm/index.js +1 -0
  28. package/dist/esm/index.js.map +1 -1
  29. package/dist/esm/mvt-layer/mvt-layer.js +17 -17
  30. package/dist/esm/mvt-layer/mvt-layer.js.map +1 -1
  31. package/dist/esm/quadkey-layer/quadkey-layer.js +5 -2
  32. package/dist/esm/quadkey-layer/quadkey-layer.js.map +1 -1
  33. package/dist/esm/quadkey-layer/quadkey-utils.js.map +1 -1
  34. package/dist/esm/tile-3d-layer/tile-3d-layer.js +8 -7
  35. package/dist/esm/tile-3d-layer/tile-3d-layer.js.map +1 -1
  36. package/dist/esm/tile-layer/tile-2d-header.js +54 -18
  37. package/dist/esm/tile-layer/tile-2d-header.js.map +1 -1
  38. package/dist/esm/tile-layer/tile-2d-traversal.js +17 -3
  39. package/dist/esm/tile-layer/tile-2d-traversal.js.map +1 -1
  40. package/dist/esm/tile-layer/tile-layer.js +23 -17
  41. package/dist/esm/tile-layer/tile-layer.js.map +1 -1
  42. package/dist/esm/tile-layer/tileset-2d.js +88 -54
  43. package/dist/esm/tile-layer/tileset-2d.js.map +1 -1
  44. package/dist/esm/tile-layer/types.js +2 -0
  45. package/dist/esm/tile-layer/types.js.map +1 -0
  46. package/dist/esm/tile-layer/utils.js +26 -11
  47. package/dist/esm/tile-layer/utils.js.map +1 -1
  48. package/dist.min.js +2 -2
  49. package/package.json +11 -11
  50. package/src/geo-cell-layer/{GeoCellLayer.js → GeoCellLayer.ts} +14 -10
  51. package/src/index.ts +6 -0
  52. package/src/mvt-layer/mvt-layer.js +11 -10
  53. package/src/quadkey-layer/quadkey-layer.ts +39 -0
  54. package/src/quadkey-layer/{quadkey-utils.js → quadkey-utils.ts} +2 -2
  55. package/src/tile-3d-layer/tile-3d-layer.js +6 -5
  56. package/src/tile-layer/{tile-2d-header.js → tile-2d-header.ts} +50 -16
  57. package/src/tile-layer/{tile-2d-traversal.js → tile-2d-traversal.ts} +49 -12
  58. package/src/tile-layer/{tile-layer.js → tile-layer.ts} +153 -31
  59. package/src/tile-layer/{tileset-2d.js → tileset-2d.ts} +143 -66
  60. package/src/tile-layer/types.ts +17 -0
  61. package/src/tile-layer/{utils.js → utils.ts} +67 -25
  62. package/src/quadkey-layer/quadkey-layer.js +0 -22
@@ -1,10 +1,22 @@
1
- import {CompositeLayer, _flatten as flatten} from '@deck.gl/core';
1
+ import {
2
+ assert,
3
+ CompositeLayer,
4
+ CompositeLayerProps,
5
+ Layer,
6
+ LayerProps,
7
+ UpdateParameters,
8
+ _flatten as flatten
9
+ } from '@deck.gl/core';
2
10
  import {GeoJsonLayer} from '@deck.gl/layers';
11
+ import {LayersList} from 'modules/core/src/lib/layer-manager';
12
+ import Tile2DHeader from './tile-2d-header';
3
13
 
4
- import Tileset2D, {STRATEGY_DEFAULT} from './tileset-2d';
14
+ import Tileset2D, {RefinementStrategy, STRATEGY_DEFAULT, Tileset2DProps} from './tileset-2d';
15
+ import {TileLoadProps, ZRange} from './types';
5
16
  import {urlType, getURLFromTemplate} from './utils';
6
17
 
7
18
  const defaultProps = {
19
+ TilesetClass: Tileset2D,
8
20
  data: [],
9
21
  dataComparator: urlType.equals,
10
22
  renderSubLayers: {type: 'function', value: props => new GeoJsonLayer(props), compare: false},
@@ -27,7 +39,107 @@ const defaultProps = {
27
39
  zoomOffset: 0
28
40
  };
29
41
 
30
- export default class TileLayer extends CompositeLayer {
42
+ /** All props supported by the TileLayer */
43
+ export type TileLayerProps<DataT> = _TileLayerProps<DataT> & CompositeLayerProps<DataT>;
44
+
45
+ /** Props added by the TileLayer */
46
+ type _TileLayerProps<DataT> = {
47
+ /**
48
+ * Optionally implement a custom indexing scheme.
49
+ */
50
+ TilesetClass: typeof Tileset2D;
51
+ /**
52
+ * Renders one or an array of Layer instances.
53
+ */
54
+ renderSubLayers?: (
55
+ props: TileLayerProps<DataT> & {
56
+ id: string;
57
+ data: any;
58
+ _offset: number;
59
+ tile: Tile2DHeader;
60
+ }
61
+ ) => LayersList;
62
+ /**
63
+ * If supplied, `getTileData` is called to retrieve the data of each tile.
64
+ */
65
+ getTileData?: (props: TileLoadProps) => Promise<DataT> | DataT;
66
+
67
+ /** Called when all tiles in the current viewport are loaded. */
68
+ onViewportLoad?: (tiles: Tile2DHeader[]) => void;
69
+
70
+ /** Called when a tile successfully loads. */
71
+ onTileLoad?: (tile: Tile2DHeader) => void;
72
+
73
+ /** Called when a tile is cleared from cache. */
74
+ onTileUnload?: (tile: Tile2DHeader) => void;
75
+
76
+ /** Called when a tile failed to load. */
77
+ onTileError?: (err: any) => void;
78
+
79
+ /** The bounding box of the layer's data. */
80
+ extent?: number[] | null;
81
+
82
+ /** The pixel dimension of the tiles, usually a power of 2. */
83
+ tileSize?: number;
84
+
85
+ /** The max zoom level of the layer's data.
86
+ * @default null
87
+ */
88
+ maxZoom?: number | null;
89
+
90
+ /** The min zoom level of the layer's data.
91
+ * @default 0
92
+ */
93
+ minZoom?: number | null;
94
+
95
+ /** The maximum number of tiles that can be cached. */
96
+ maxCacheSize?: number | null;
97
+
98
+ /**
99
+ * The maximum memory used for caching tiles.
100
+ *
101
+ * @default null
102
+ */
103
+ maxCacheByteSize?: number | null;
104
+
105
+ /**
106
+ * How the tile layer refines the visibility of tiles.
107
+ *
108
+ * @default 'best-available'
109
+ */
110
+ refinementStrategy?: RefinementStrategy;
111
+
112
+ /** Range of minimum and maximum heights in the tile. */
113
+ zRange?: ZRange | null;
114
+
115
+ /**
116
+ * The maximum number of concurrent getTileData calls.
117
+ *
118
+ * @default 6
119
+ */
120
+ maxRequests?: number;
121
+
122
+ /**
123
+ * This offset changes the zoom level at which the tiles are fetched.
124
+ *
125
+ * Needs to be an integer.
126
+ *
127
+ * @default 0
128
+ */
129
+ zoomOffset?: number;
130
+ };
131
+
132
+ /**
133
+ * The TileLayer is a composite layer that makes it possible to visualize very large datasets.
134
+ *
135
+ * Instead of fetching the entire dataset, it only loads and renders what's visible in the current viewport.
136
+ */
137
+ export default class TileLayer<DataT = any, ExtraPropsT = {}> extends CompositeLayer<
138
+ ExtraPropsT & Required<_TileLayerProps<DataT>>
139
+ > {
140
+ static defaultProps = defaultProps as any;
141
+ static layerName = 'TileLayer';
142
+
31
143
  initializeState() {
32
144
  this.state = {
33
145
  tileset: null,
@@ -36,21 +148,22 @@ export default class TileLayer extends CompositeLayer {
36
148
  }
37
149
 
38
150
  finalizeState() {
39
- this.state.tileset?.finalize();
151
+ this.state?.tileset?.finalize();
40
152
  }
41
153
 
42
- get isLoaded() {
43
- const {tileset} = this.state;
44
- return tileset.selectedTiles.every(
154
+ get isLoaded(): boolean {
155
+ return this.state?.tileset?.selectedTiles.every(
45
156
  tile => tile.isLoaded && tile.layers && tile.layers.every(layer => layer.isLoaded)
46
157
  );
47
158
  }
48
159
 
49
- shouldUpdateState({changeFlags}) {
160
+ shouldUpdateState({changeFlags}): boolean {
50
161
  return changeFlags.somethingChanged;
51
162
  }
52
163
 
53
- updateState({props, changeFlags}) {
164
+ updateState({changeFlags}: UpdateParameters<TileLayer>) {
165
+ assert(this.state);
166
+
54
167
  let {tileset} = this.state;
55
168
  const propsChanged = changeFlags.propsOrDataChanged || changeFlags.updateTriggersChanged;
56
169
  const dataChanged =
@@ -59,10 +172,10 @@ export default class TileLayer extends CompositeLayer {
59
172
  (changeFlags.updateTriggersChanged.all || changeFlags.updateTriggersChanged.getTileData));
60
173
 
61
174
  if (!tileset) {
62
- tileset = new Tileset2D(this._getTilesetOptions(props));
175
+ tileset = new this.props.TilesetClass(this._getTilesetOptions());
63
176
  this.setState({tileset});
64
177
  } else if (propsChanged) {
65
- tileset.setOptions(this._getTilesetOptions(props));
178
+ tileset.setOptions(this._getTilesetOptions());
66
179
 
67
180
  if (dataChanged) {
68
181
  // reload all tiles
@@ -79,7 +192,7 @@ export default class TileLayer extends CompositeLayer {
79
192
  this._updateTileset();
80
193
  }
81
194
 
82
- _getTilesetOptions(props) {
195
+ _getTilesetOptions(): Tileset2DProps {
83
196
  const {
84
197
  tileSize,
85
198
  maxCacheSize,
@@ -90,7 +203,7 @@ export default class TileLayer extends CompositeLayer {
90
203
  minZoom,
91
204
  maxRequests,
92
205
  zoomOffset
93
- } = props;
206
+ } = this.props;
94
207
 
95
208
  return {
96
209
  maxCacheSize,
@@ -110,7 +223,8 @@ export default class TileLayer extends CompositeLayer {
110
223
  };
111
224
  }
112
225
 
113
- _updateTileset() {
226
+ _updateTileset(): void {
227
+ assert(this.state && this.context);
114
228
  const {tileset} = this.state;
115
229
  const {zRange, modelMatrix} = this.props;
116
230
  const frameNumber = tileset.update(this.context.viewport, {zRange, modelMatrix});
@@ -131,7 +245,9 @@ export default class TileLayer extends CompositeLayer {
131
245
  this.state.isLoaded = isLoaded;
132
246
  }
133
247
 
134
- _onViewportLoad() {
248
+ _onViewportLoad(): void {
249
+ assert(this.state);
250
+
135
251
  const {tileset} = this.state;
136
252
  const {onViewportLoad} = this.props;
137
253
 
@@ -140,46 +256,54 @@ export default class TileLayer extends CompositeLayer {
140
256
  }
141
257
  }
142
258
 
143
- _onTileLoad(tile) {
259
+ _onTileLoad(tile: Tile2DHeader): void {
144
260
  this.props.onTileLoad(tile);
145
261
  tile.layers = null;
146
262
 
147
263
  this.setNeedsUpdate();
148
264
  }
149
265
 
150
- _onTileError(error, tile) {
266
+ _onTileError(error: any, tile: Tile2DHeader) {
151
267
  this.props.onTileError(error);
152
268
  tile.layers = null;
153
269
 
154
270
  this.setNeedsUpdate();
155
271
  }
156
272
 
157
- _onTileUnload(tile) {
273
+ _onTileUnload(tile: Tile2DHeader) {
158
274
  this.props.onTileUnload(tile);
159
275
  }
160
276
 
161
277
  // Methods for subclass to override
162
278
 
163
- getTileData(tile) {
279
+ getTileData(tile: TileLoadProps) {
164
280
  const {data, getTileData, fetch} = this.props;
165
281
  const {signal} = tile;
166
282
 
167
- tile.url = getURLFromTemplate(data, tile);
283
+ tile.url =
284
+ typeof data === 'string' || Array.isArray(data) ? getURLFromTemplate(data, tile) : null;
168
285
 
169
286
  if (getTileData) {
170
287
  return getTileData(tile);
171
288
  }
172
- if (tile.url) {
289
+ if (fetch && tile.url) {
173
290
  return fetch(tile.url, {propName: 'data', layer: this, signal});
174
291
  }
175
292
  return null;
176
293
  }
177
294
 
178
- renderSubLayers(props) {
295
+ renderSubLayers(
296
+ props: _TileLayerProps<DataT> & {
297
+ id: string;
298
+ data: any;
299
+ _offset: number;
300
+ tile: Tile2DHeader;
301
+ }
302
+ ): LayersList {
179
303
  return this.props.renderSubLayers(props);
180
304
  }
181
305
 
182
- getSubLayerPropsByTile(tile) {
306
+ getSubLayerPropsByTile(tile: Tile2DHeader): LayerProps | null {
183
307
  return null;
184
308
  }
185
309
 
@@ -194,8 +318,9 @@ export default class TileLayer extends CompositeLayer {
194
318
  }
195
319
  }
196
320
 
197
- renderLayers() {
198
- return this.state.tileset.tiles.map(tile => {
321
+ renderLayers(): Layer[] {
322
+ assert(this.state);
323
+ return this.state.tileset.tiles.map((tile: Tile2DHeader) => {
199
324
  const subLayerProps = this.getSubLayerPropsByTile(tile);
200
325
  // cache the rendered layer in the tile
201
326
  if (!tile.isLoaded && !tile.content) {
@@ -203,12 +328,12 @@ export default class TileLayer extends CompositeLayer {
203
328
  } else if (!tile.layers) {
204
329
  const layers = this.renderSubLayers({
205
330
  ...this.props,
206
- id: `${this.id}-${tile.x}-${tile.y}-${tile.z}`,
331
+ id: `${this.id}-${tile.id}`,
207
332
  data: tile.content,
208
333
  _offset: 0,
209
334
  tile
210
335
  });
211
- tile.layers = flatten(layers, Boolean).map(layer =>
336
+ tile.layers = (flatten(layers, Boolean) as Layer[]).map(layer =>
212
337
  layer.clone({
213
338
  tile,
214
339
  ...subLayerProps
@@ -218,7 +343,7 @@ export default class TileLayer extends CompositeLayer {
218
343
  subLayerProps &&
219
344
  tile.layers[0] &&
220
345
  Object.keys(subLayerProps).some(
221
- propName => tile.layers[0].props[propName] !== subLayerProps[propName]
346
+ propName => tile.layers![0].props[propName] !== subLayerProps[propName]
222
347
  )
223
348
  ) {
224
349
  tile.layers = tile.layers.map(layer => layer.clone(subLayerProps));
@@ -231,6 +356,3 @@ export default class TileLayer extends CompositeLayer {
231
356
  return layer.props.tile.isVisible;
232
357
  }
233
358
  }
234
-
235
- TileLayer.layerName = 'TileLayer';
236
- TileLayer.defaultProps = defaultProps;