@deck.gl/geo-layers 8.8.0-alpha.2 → 8.8.0-alpha.5

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 (54) hide show
  1. package/dist/dist.dev.js +2286 -2542
  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/coordinate-transform.js.map +1 -1
  7. package/dist/es5/mvt-layer/find-index-binary.js +7 -5
  8. package/dist/es5/mvt-layer/find-index-binary.js.map +1 -1
  9. package/dist/es5/mvt-layer/mvt-layer.js +45 -32
  10. package/dist/es5/mvt-layer/mvt-layer.js.map +1 -1
  11. package/dist/es5/quadkey-layer/quadkey-layer.js +4 -2
  12. package/dist/es5/quadkey-layer/quadkey-layer.js.map +1 -1
  13. package/dist/es5/quadkey-layer/quadkey-utils.js.map +1 -1
  14. package/dist/es5/tile-layer/tile-2d-header.js.map +1 -1
  15. package/dist/es5/tile-layer/tile-layer.js +21 -25
  16. package/dist/es5/tile-layer/tile-layer.js.map +1 -1
  17. package/dist/es5/tile-layer/tileset-2d.js +1 -6
  18. package/dist/es5/tile-layer/tileset-2d.js.map +1 -1
  19. package/dist/es5/tile-layer/utils.js +5 -0
  20. package/dist/es5/tile-layer/utils.js.map +1 -1
  21. package/dist/esm/geo-cell-layer/GeoCellLayer.js +6 -3
  22. package/dist/esm/geo-cell-layer/GeoCellLayer.js.map +1 -1
  23. package/dist/esm/index.js +1 -0
  24. package/dist/esm/index.js.map +1 -1
  25. package/dist/esm/mvt-layer/coordinate-transform.js.map +1 -1
  26. package/dist/esm/mvt-layer/find-index-binary.js +1 -1
  27. package/dist/esm/mvt-layer/find-index-binary.js.map +1 -1
  28. package/dist/esm/mvt-layer/mvt-layer.js +47 -36
  29. package/dist/esm/mvt-layer/mvt-layer.js.map +1 -1
  30. package/dist/esm/quadkey-layer/quadkey-layer.js +5 -2
  31. package/dist/esm/quadkey-layer/quadkey-layer.js.map +1 -1
  32. package/dist/esm/quadkey-layer/quadkey-utils.js.map +1 -1
  33. package/dist/esm/tile-layer/tile-2d-header.js.map +1 -1
  34. package/dist/esm/tile-layer/tile-layer.js +5 -10
  35. package/dist/esm/tile-layer/tile-layer.js.map +1 -1
  36. package/dist/esm/tile-layer/tileset-2d.js +1 -5
  37. package/dist/esm/tile-layer/tileset-2d.js.map +1 -1
  38. package/dist/esm/tile-layer/utils.js +3 -0
  39. package/dist/esm/tile-layer/utils.js.map +1 -1
  40. package/dist.min.js +2 -2
  41. package/package.json +6 -3
  42. package/src/geo-cell-layer/{GeoCellLayer.js → GeoCellLayer.ts} +14 -10
  43. package/src/index.ts +4 -1
  44. package/src/mvt-layer/{coordinate-transform.js → coordinate-transform.ts} +10 -8
  45. package/src/mvt-layer/{find-index-binary.js → find-index-binary.ts} +41 -10
  46. package/src/mvt-layer/{mvt-layer.js → mvt-layer.ts} +145 -59
  47. package/src/quadkey-layer/quadkey-layer.ts +39 -0
  48. package/src/quadkey-layer/{quadkey-utils.js → quadkey-utils.ts} +2 -2
  49. package/src/tile-layer/tile-2d-header.ts +15 -14
  50. package/src/tile-layer/tile-layer.ts +64 -62
  51. package/src/tile-layer/tileset-2d.ts +13 -13
  52. package/src/tile-layer/types.ts +5 -1
  53. package/src/tile-layer/utils.ts +17 -3
  54. package/src/quadkey-layer/quadkey-layer.js +0 -22
@@ -2,7 +2,7 @@ import {worldToLngLat} from '@math.gl/web-mercator';
2
2
 
3
3
  const TILE_SIZE = 512;
4
4
 
5
- export function quadkeyToWorldBounds(quadkey) {
5
+ export function quadkeyToWorldBounds(quadkey: string): [number[], number[]] {
6
6
  let x = 0;
7
7
  let y = 0;
8
8
  let mask = 1 << quadkey.length;
@@ -20,7 +20,7 @@ export function quadkeyToWorldBounds(quadkey) {
20
20
  ];
21
21
  }
22
22
 
23
- export function getQuadkeyPolygon(quadkey) {
23
+ export function getQuadkeyPolygon(quadkey: string): number[] {
24
24
  const [topLeft, bottomRight] = quadkeyToWorldBounds(quadkey);
25
25
  const [w, n] = worldToLngLat(topLeft);
26
26
  const [e, s] = worldToLngLat(bottomRight);
@@ -3,19 +3,20 @@ import {Layer, log} from '@deck.gl/core';
3
3
  import {RequestScheduler} from '@loaders.gl/loader-utils';
4
4
  import {TileBoundingBox, TileIndex, TileLoadProps} from './types';
5
5
 
6
- export type TileLoadDataProps = {
6
+ export type TileLoadDataProps<DataT = any> = {
7
7
  requestScheduler: RequestScheduler;
8
- getData: (props: TileLoadProps) => Promise<any>;
9
- onLoad: (tile: Tile2DHeader) => void;
10
- onError: (error: any, tile: Tile2DHeader) => void;
8
+ getData: (props: TileLoadProps) => Promise<DataT>;
9
+ onLoad: (tile: Tile2DHeader<DataT>) => void;
10
+ onError: (error: any, tile: Tile2DHeader<DataT>) => void;
11
11
  };
12
- export default class Tile2DHeader {
12
+
13
+ export default class Tile2DHeader<DataT = any> {
13
14
  index: TileIndex;
14
15
  isVisible: boolean;
15
16
  isSelected: boolean;
16
17
  parent: Tile2DHeader | null;
17
18
  children: Tile2DHeader[] | null;
18
- content: any;
19
+ content: DataT | null;
19
20
  state?: number;
20
21
  layers?: Layer[] | null;
21
22
 
@@ -48,24 +49,24 @@ export default class Tile2DHeader {
48
49
  this._needsReload = false;
49
50
  }
50
51
 
51
- get data() {
52
+ get data(): Promise<DataT | null> | DataT | null {
52
53
  return this.isLoading && this._loader ? this._loader.then(() => this.data) : this.content;
53
54
  }
54
55
 
55
- get isLoaded() {
56
+ get isLoaded(): boolean {
56
57
  return this._isLoaded && !this._needsReload;
57
58
  }
58
59
 
59
- get isLoading() {
60
+ get isLoading(): boolean {
60
61
  return Boolean(this._loader) && !this._isCancelled;
61
62
  }
62
63
 
63
- get needsReload() {
64
+ get needsReload(): boolean {
64
65
  return this._needsReload || this._isCancelled;
65
66
  }
66
67
 
67
- get byteLength() {
68
- const result = this.content ? this.content.byteLength : 0;
68
+ get byteLength(): number {
69
+ const result = this.content ? (this.content as any).byteLength : 0;
69
70
  if (!Number.isFinite(result)) {
70
71
  log.error('byteLength not defined in tile data')();
71
72
  }
@@ -78,7 +79,7 @@ export default class Tile2DHeader {
78
79
  requestScheduler,
79
80
  onLoad,
80
81
  onError
81
- }: TileLoadDataProps): Promise<void> {
82
+ }: TileLoadDataProps<DataT>): Promise<void> {
82
83
  const {index, id, bbox, userData, zoom} = this;
83
84
  const loaderId = this._loaderId;
84
85
 
@@ -100,7 +101,7 @@ export default class Tile2DHeader {
100
101
  return;
101
102
  }
102
103
 
103
- let tileData = null;
104
+ let tileData: DataT | null = null;
104
105
  let error;
105
106
  try {
106
107
  tileData = await getData({index, id, bbox, userData, zoom, signal});
@@ -1,10 +1,11 @@
1
1
  import {
2
- assert,
3
- ChangeFlags,
4
2
  CompositeLayer,
5
3
  CompositeLayerProps,
6
4
  Layer,
7
5
  LayerProps,
6
+ UpdateParameters,
7
+ PickingInfo,
8
+ GetPickingInfoParams,
8
9
  _flatten as flatten
9
10
  } from '@deck.gl/core';
10
11
  import {GeoJsonLayer} from '@deck.gl/layers';
@@ -39,73 +40,85 @@ const defaultProps = {
39
40
  zoomOffset: 0
40
41
  };
41
42
 
42
- export type TileLayerProps<DataT = any> = CompositeLayerProps<DataT> & {
43
+ /** All props supported by the TileLayer */
44
+ export type TileLayerProps<DataT = any> = _TileLayerProps<DataT> & CompositeLayerProps<DataT>;
45
+
46
+ /** Props added by the TileLayer */
47
+ type _TileLayerProps<DataT> = {
48
+ /**
49
+ * Optionally implement a custom indexing scheme.
50
+ */
51
+ TilesetClass: typeof Tileset2D;
43
52
  /**
44
53
  * Renders one or an array of Layer instances.
45
54
  */
46
- renderSubLayers: (
47
- props: TileLayerProps & {
55
+ renderSubLayers?: (
56
+ props: TileLayerProps<DataT> & {
48
57
  id: string;
49
- data: any;
58
+ data: DataT;
50
59
  _offset: number;
51
- tile: Tile2DHeader;
60
+ tile: Tile2DHeader<DataT>;
52
61
  }
53
62
  ) => LayersList;
54
63
  /**
55
64
  * If supplied, `getTileData` is called to retrieve the data of each tile.
56
65
  */
57
- getTileData: (props: TileLoadProps) => Promise<any> | any;
66
+ getTileData?: (props: TileLoadProps) => Promise<DataT> | DataT;
58
67
 
59
68
  /** Called when all tiles in the current viewport are loaded. */
60
- onViewportLoad?: (tiles: Tile2DHeader[]) => void;
69
+ onViewportLoad?: (tiles: Tile2DHeader<DataT>[]) => void;
61
70
 
62
71
  /** Called when a tile successfully loads. */
63
- onTileLoad: (tile: Tile2DHeader) => void;
72
+ onTileLoad?: (tile: Tile2DHeader<DataT>) => void;
64
73
 
65
74
  /** Called when a tile is cleared from cache. */
66
- onTileUnload: (tile: Tile2DHeader) => void;
75
+ onTileUnload?: (tile: Tile2DHeader<DataT>) => void;
67
76
 
68
77
  /** Called when a tile failed to load. */
69
- onTileError: (err: any) => void;
78
+ onTileError?: (err: any) => void;
70
79
 
71
80
  /** The bounding box of the layer's data. */
72
- extent: number[] | undefined | null;
81
+ extent?: number[] | null;
73
82
 
74
83
  /** The pixel dimension of the tiles, usually a power of 2. */
75
- tileSize: number;
84
+ tileSize?: number;
76
85
 
77
- /** The max zoom level of the layer's data. */
78
- maxZoom: number;
86
+ /** The max zoom level of the layer's data.
87
+ * @default null
88
+ */
89
+ maxZoom?: number | null;
79
90
 
80
- /** The min zoom level of the layer's data. */
81
- minZoom: number;
91
+ /** The min zoom level of the layer's data.
92
+ * @default 0
93
+ */
94
+ minZoom?: number | null;
82
95
 
83
96
  /** The maximum number of tiles that can be cached. */
84
- maxCacheSize: number | undefined | null;
97
+ maxCacheSize?: number | null;
85
98
 
86
99
  /**
87
100
  * The maximum memory used for caching tiles.
88
101
  *
89
102
  * @default null
90
103
  */
91
- maxCacheByteSize: number | undefined;
104
+ maxCacheByteSize?: number | null;
92
105
 
93
106
  /**
94
107
  * How the tile layer refines the visibility of tiles.
95
108
  *
96
109
  * @default 'best-available'
97
110
  */
98
- refinementStrategy: RefinementStrategy;
111
+ refinementStrategy?: RefinementStrategy;
99
112
 
100
113
  /** Range of minimum and maximum heights in the tile. */
101
- zRange: ZRange | null;
114
+ zRange?: ZRange | null;
102
115
 
103
116
  /**
104
117
  * The maximum number of concurrent getTileData calls.
105
118
  *
106
119
  * @default 6
107
120
  */
108
- maxRequests: number;
121
+ maxRequests?: number;
109
122
 
110
123
  /**
111
124
  * This offset changes the zoom level at which the tiles are fetched.
@@ -114,7 +127,11 @@ export type TileLayerProps<DataT = any> = CompositeLayerProps<DataT> & {
114
127
  *
115
128
  * @default 0
116
129
  */
117
- zoomOffset: number;
130
+ zoomOffset?: number;
131
+ };
132
+
133
+ export type TiledPickingInfo<DataT = any> = PickingInfo & {
134
+ tile?: Tile2DHeader<DataT>;
118
135
  };
119
136
 
120
137
  /**
@@ -122,10 +139,9 @@ export type TileLayerProps<DataT = any> = CompositeLayerProps<DataT> & {
122
139
  *
123
140
  * Instead of fetching the entire dataset, it only loads and renders what's visible in the current viewport.
124
141
  */
125
- export default class TileLayer<
126
- DataT = any,
127
- PropsT extends TileLayerProps<DataT> = TileLayerProps<DataT>
128
- > extends CompositeLayer<PropsT> {
142
+ export default class TileLayer<DataT = any, ExtraPropsT = {}> extends CompositeLayer<
143
+ ExtraPropsT & Required<_TileLayerProps<DataT>>
144
+ > {
129
145
  static defaultProps = defaultProps as any;
130
146
  static layerName = 'TileLayer';
131
147
 
@@ -150,17 +166,7 @@ export default class TileLayer<
150
166
  return changeFlags.somethingChanged;
151
167
  }
152
168
 
153
- updateState({
154
- props,
155
- changeFlags
156
- }: {
157
- props: TileLayerProps;
158
- oldProps: TileLayerProps;
159
- context: any;
160
- changeFlags: ChangeFlags;
161
- }) {
162
- assert(this.state);
163
-
169
+ updateState({changeFlags}: UpdateParameters<this>) {
164
170
  let {tileset} = this.state;
165
171
  const propsChanged = changeFlags.propsOrDataChanged || changeFlags.updateTriggersChanged;
166
172
  const dataChanged =
@@ -169,10 +175,10 @@ export default class TileLayer<
169
175
  (changeFlags.updateTriggersChanged.all || changeFlags.updateTriggersChanged.getTileData));
170
176
 
171
177
  if (!tileset) {
172
- tileset = new this.props.TilesetClass(this._getTilesetOptions(props));
178
+ tileset = new this.props.TilesetClass(this._getTilesetOptions());
173
179
  this.setState({tileset});
174
180
  } else if (propsChanged) {
175
- tileset.setOptions(this._getTilesetOptions(props));
181
+ tileset.setOptions(this._getTilesetOptions());
176
182
 
177
183
  if (dataChanged) {
178
184
  // reload all tiles
@@ -189,7 +195,7 @@ export default class TileLayer<
189
195
  this._updateTileset();
190
196
  }
191
197
 
192
- _getTilesetOptions(props: TileLayerProps): Tileset2DProps {
198
+ _getTilesetOptions(): Tileset2DProps {
193
199
  const {
194
200
  tileSize,
195
201
  maxCacheSize,
@@ -200,7 +206,7 @@ export default class TileLayer<
200
206
  minZoom,
201
207
  maxRequests,
202
208
  zoomOffset
203
- } = props;
209
+ } = this.props;
204
210
 
205
211
  return {
206
212
  maxCacheSize,
@@ -220,8 +226,7 @@ export default class TileLayer<
220
226
  };
221
227
  }
222
228
 
223
- _updateTileset(): void {
224
- assert(this.state && this.context);
229
+ private _updateTileset(): void {
225
230
  const {tileset} = this.state;
226
231
  const {zRange, modelMatrix} = this.props;
227
232
  const frameNumber = tileset.update(this.context.viewport, {zRange, modelMatrix});
@@ -243,8 +248,6 @@ export default class TileLayer<
243
248
  }
244
249
 
245
250
  _onViewportLoad(): void {
246
- assert(this.state);
247
-
248
251
  const {tileset} = this.state;
249
252
  const {onViewportLoad} = this.props;
250
253
 
@@ -253,27 +256,27 @@ export default class TileLayer<
253
256
  }
254
257
  }
255
258
 
256
- _onTileLoad(tile: Tile2DHeader): void {
259
+ _onTileLoad(tile: Tile2DHeader<DataT>): void {
257
260
  this.props.onTileLoad(tile);
258
261
  tile.layers = null;
259
262
 
260
263
  this.setNeedsUpdate();
261
264
  }
262
265
 
263
- _onTileError(error: any, tile: Tile2DHeader) {
266
+ _onTileError(error: any, tile: Tile2DHeader<DataT>) {
264
267
  this.props.onTileError(error);
265
268
  tile.layers = null;
266
269
 
267
270
  this.setNeedsUpdate();
268
271
  }
269
272
 
270
- _onTileUnload(tile: Tile2DHeader) {
273
+ _onTileUnload(tile: Tile2DHeader<DataT>) {
271
274
  this.props.onTileUnload(tile);
272
275
  }
273
276
 
274
277
  // Methods for subclass to override
275
278
 
276
- getTileData(tile: TileLoadProps) {
279
+ getTileData(tile: TileLoadProps): Promise<DataT> | DataT | null {
277
280
  const {data, getTileData, fetch} = this.props;
278
281
  const {signal} = tile;
279
282
 
@@ -290,33 +293,32 @@ export default class TileLayer<
290
293
  }
291
294
 
292
295
  renderSubLayers(
293
- props: TileLayerProps & {
296
+ props: TileLayer['props'] & {
294
297
  id: string;
295
- data: any;
298
+ data: DataT;
296
299
  _offset: number;
297
- tile: Tile2DHeader;
300
+ tile: Tile2DHeader<DataT>;
298
301
  }
299
- ): LayersList {
302
+ ): Layer | null | LayersList {
300
303
  return this.props.renderSubLayers(props);
301
304
  }
302
305
 
303
- getSubLayerPropsByTile(tile: Tile2DHeader): LayerProps | null {
306
+ getSubLayerPropsByTile(tile: Tile2DHeader): Partial<LayerProps> | null {
304
307
  return null;
305
308
  }
306
309
 
307
- getPickingInfo({info, sourceLayer}) {
308
- info.tile = sourceLayer.props.tile;
310
+ getPickingInfo({info, sourceLayer}: GetPickingInfoParams): TiledPickingInfo<DataT> {
311
+ (info as any).tile = (sourceLayer as any).props.tile;
309
312
  return info;
310
313
  }
311
314
 
312
- _updateAutoHighlight(info) {
315
+ protected _updateAutoHighlight(info: PickingInfo): void {
313
316
  if (info.sourceLayer) {
314
317
  info.sourceLayer.updateAutoHighlight(info);
315
318
  }
316
319
  }
317
320
 
318
- renderLayers(): Layer[] {
319
- assert(this.state);
321
+ renderLayers(): Layer | null | LayersList {
320
322
  return this.state.tileset.tiles.map((tile: Tile2DHeader) => {
321
323
  const subLayerProps = this.getSubLayerPropsByTile(tile);
322
324
  // cache the rendered layer in the tile
@@ -330,7 +332,7 @@ export default class TileLayer<
330
332
  _offset: 0,
331
333
  tile
332
334
  });
333
- tile.layers = flatten(layers, Boolean).map(layer =>
335
+ tile.layers = (flatten(layers, Boolean) as Layer[]).map(layer =>
334
336
  layer.clone({
335
337
  tile,
336
338
  ...subLayerProps
@@ -2,7 +2,7 @@ import Tile2DHeader from './tile-2d-header';
2
2
  import {getTileIndices, tileToBoundingBox} from './utils';
3
3
  import {RequestScheduler} from '@loaders.gl/loader-utils';
4
4
  import {Matrix4} from '@math.gl/core';
5
- import {assert, Viewport} from '@deck.gl/core';
5
+ import {Viewport} from '@deck.gl/core';
6
6
  import {Bounds, TileIndex, ZRange} from './types';
7
7
  import {TileLayerProps} from './tile-layer';
8
8
 
@@ -48,7 +48,7 @@ const STRATEGIES = {
48
48
  };
49
49
 
50
50
  export type Tileset2DProps = Pick<
51
- TileLayerProps,
51
+ Required<TileLayerProps>,
52
52
  | 'getTileData'
53
53
  | 'tileSize'
54
54
  | 'maxCacheSize'
@@ -145,10 +145,10 @@ export default class Tileset2D {
145
145
  setOptions(opts: Tileset2DProps): void {
146
146
  Object.assign(this.opts, opts);
147
147
  if (Number.isFinite(opts.maxZoom)) {
148
- this._maxZoom = Math.floor(opts.maxZoom);
148
+ this._maxZoom = Math.floor(opts.maxZoom as number);
149
149
  }
150
150
  if (Number.isFinite(opts.minZoom)) {
151
- this._minZoom = Math.ceil(opts.minZoom);
151
+ this._minZoom = Math.ceil(opts.minZoom as number);
152
152
  }
153
153
  }
154
154
 
@@ -206,7 +206,7 @@ export default class Tileset2D {
206
206
  }
207
207
  // Check for needed reloads explicitly even if the view/matrix has not changed.
208
208
  } else if (this.needsReload) {
209
- this._selectedTiles = this._selectedTiles!.map(tile => this._getTile(tile.index));
209
+ this._selectedTiles = this._selectedTiles!.map(tile => this._getTile(tile.index, true));
210
210
  }
211
211
 
212
212
  // Update tile states
@@ -271,8 +271,8 @@ export default class Tileset2D {
271
271
 
272
272
  /** Returns additional metadata to add to tile, bbox by default */
273
273
  getTileMetadata(index: TileIndex) {
274
- assert(this._viewport);
275
274
  const {tileSize} = this.opts;
275
+ // @ts-expect-error
276
276
  return {bbox: tileToBoundingBox(this._viewport, index.x, index.y, index.z, tileSize)};
277
277
  }
278
278
 
@@ -285,8 +285,7 @@ export default class Tileset2D {
285
285
  }
286
286
 
287
287
  // Returns true if any tile's visibility changed
288
- updateTileStates() {
289
- assert(this._selectedTiles);
288
+ private updateTileStates() {
290
289
  const refinementStrategy = this.opts.refinementStrategy || STRATEGY_DEFAULT;
291
290
 
292
291
  const visibilities = new Array(this._cache.size);
@@ -298,6 +297,7 @@ export default class Tileset2D {
298
297
  tile.isSelected = false;
299
298
  tile.isVisible = false;
300
299
  }
300
+ // @ts-expect-error called only when _selectedTiles is already defined
301
301
  for (const tile of this._selectedTiles) {
302
302
  tile.isSelected = true;
303
303
  tile.isVisible = true;
@@ -370,12 +370,12 @@ export default class Tileset2D {
370
370
  * Clear tiles that are not visible when the cache is full
371
371
  */
372
372
  /* eslint-disable complexity */
373
- _resizeCache() {
374
- assert(this.selectedTiles);
373
+ private _resizeCache() {
375
374
  const {_cache, opts} = this;
376
375
 
377
376
  const maxCacheSize =
378
377
  opts.maxCacheSize ||
378
+ // @ts-expect-error called only when selectedTiles is initialized
379
379
  (opts.maxCacheByteSize ? Infinity : DEFAULT_CACHE_SCALE * this.selectedTiles.length);
380
380
  const maxCacheByteSize = opts.maxCacheByteSize || Infinity;
381
381
 
@@ -405,9 +405,9 @@ export default class Tileset2D {
405
405
  }
406
406
  /* eslint-enable complexity */
407
407
 
408
- _getTile(index: TileIndex, create: true): Tile2DHeader;
409
- _getTile(index: TileIndex, create?: false): Tile2DHeader | undefined;
410
- _getTile(index: TileIndex, create?: boolean): Tile2DHeader | undefined {
408
+ private _getTile(index: TileIndex, create: true): Tile2DHeader;
409
+ private _getTile(index: TileIndex, create?: false): Tile2DHeader | undefined;
410
+ private _getTile(index: TileIndex, create?: boolean): Tile2DHeader | undefined {
411
411
  const id = this.getTileId(index);
412
412
  let tile = this._cache.get(id);
413
413
  let needsReload = false;
@@ -2,9 +2,11 @@ export type ZRange = [minZ: number, maxZ: number];
2
2
 
3
3
  export type Bounds = [minX: number, minY: number, maxX: number, maxY: number];
4
4
 
5
+ export type GeoBoundingBox = {west: number; north: number; east: number; south: number};
6
+
5
7
  export type TileBoundingBox =
6
8
  | {left: number; top: number; right: number; bottom: number}
7
- | {west: number; north: number; east: number; south: number};
9
+ | GeoBoundingBox;
8
10
 
9
11
  export type TileIndex = {x: number; y: number; z: number};
10
12
 
@@ -14,4 +16,6 @@ export type TileLoadProps = {
14
16
  bbox: TileBoundingBox;
15
17
  url?: string | null;
16
18
  signal?: AbortSignal;
19
+ userData?: Record<string, any>;
20
+ zoom?: number;
17
21
  };
@@ -1,8 +1,7 @@
1
1
  import {Viewport} from '@deck.gl/core';
2
2
  import {Matrix4} from '@math.gl/core';
3
- import Tile2DHeader from './tile-2d-header';
4
3
  import {getOSMTileIndices} from './tile-2d-traversal';
5
- import {Bounds, TileBoundingBox, TileIndex, ZRange} from './types';
4
+ import {Bounds, GeoBoundingBox, TileBoundingBox, TileIndex, ZRange} from './types';
6
5
 
7
6
  const TILE_SIZE = 512;
8
7
  const DEFAULT_EXTENT: Bounds = [-Infinity, -Infinity, Infinity, Infinity];
@@ -62,7 +61,13 @@ function stringHash(s: string): number {
62
61
  return Math.abs(s.split('').reduce((a, b) => ((a << 5) - a + b.charCodeAt(0)) | 0, 0));
63
62
  }
64
63
 
65
- export function getURLFromTemplate(template: string | string[], tile: Tile2DHeader): string | null {
64
+ export function getURLFromTemplate(
65
+ template: string | string[],
66
+ tile: {
67
+ index: TileIndex;
68
+ id: string;
69
+ }
70
+ ): string | null {
66
71
  if (!template || !template.length) {
67
72
  return null;
68
73
  }
@@ -250,3 +255,12 @@ export function getTileIndices({
250
255
  export function isURLTemplate(s: string): boolean {
251
256
  return /(?=.*{z})(?=.*{x})(?=.*({y}|{-y}))/.test(s);
252
257
  }
258
+
259
+ export function isGeoBoundingBox(v: any): v is GeoBoundingBox {
260
+ return (
261
+ Number.isFinite(v.west) &&
262
+ Number.isFinite(v.north) &&
263
+ Number.isFinite(v.east) &&
264
+ Number.isFinite(v.south)
265
+ );
266
+ }
@@ -1,22 +0,0 @@
1
- import GeoCellLayer from '../geo-cell-layer/GeoCellLayer';
2
- import {getQuadkeyPolygon} from './quadkey-utils';
3
-
4
- const defaultProps = {
5
- getQuadkey: {type: 'accessor', value: d => d.quadkey}
6
- };
7
-
8
- export default class QuadkeyLayer extends GeoCellLayer {
9
- indexToBounds() {
10
- const {data, getQuadkey} = this.props;
11
-
12
- return {
13
- data,
14
- _normalize: false,
15
- positionFormat: 'XY',
16
- getPolygon: (x, objectInfo) => getQuadkeyPolygon(getQuadkey(x, objectInfo))
17
- };
18
- }
19
- }
20
-
21
- QuadkeyLayer.layerName = 'QuadkeyLayer';
22
- QuadkeyLayer.defaultProps = defaultProps;