@deck.gl/geo-layers 8.7.9 → 8.8.0-alpha.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.
Files changed (48) hide show
  1. package/dist/dist.dev.js +62897 -30614
  2. package/dist/es5/index.js +8 -0
  3. package/dist/es5/index.js.map +1 -1
  4. package/dist/es5/mvt-layer/mvt-layer.js +9 -12
  5. package/dist/es5/mvt-layer/mvt-layer.js.map +1 -1
  6. package/dist/es5/tile-3d-layer/tile-3d-layer.js +13 -10
  7. package/dist/es5/tile-3d-layer/tile-3d-layer.js.map +1 -1
  8. package/dist/es5/tile-layer/tile-2d-header.js +36 -17
  9. package/dist/es5/tile-layer/tile-2d-header.js.map +1 -1
  10. package/dist/es5/tile-layer/tile-2d-traversal.js +13 -3
  11. package/dist/es5/tile-layer/tile-2d-traversal.js.map +1 -1
  12. package/dist/es5/tile-layer/tile-layer.js +18 -12
  13. package/dist/es5/tile-layer/tile-layer.js.map +1 -1
  14. package/dist/es5/tile-layer/tileset-2d.js +122 -96
  15. package/dist/es5/tile-layer/tileset-2d.js.map +1 -1
  16. package/dist/es5/tile-layer/types.js +2 -0
  17. package/dist/es5/tile-layer/types.js.map +1 -0
  18. package/dist/es5/tile-layer/utils.js +27 -9
  19. package/dist/es5/tile-layer/utils.js.map +1 -1
  20. package/dist/esm/index.js +1 -0
  21. package/dist/esm/index.js.map +1 -1
  22. package/dist/esm/mvt-layer/mvt-layer.js +9 -13
  23. package/dist/esm/mvt-layer/mvt-layer.js.map +1 -1
  24. package/dist/esm/tile-3d-layer/tile-3d-layer.js +8 -7
  25. package/dist/esm/tile-3d-layer/tile-3d-layer.js.map +1 -1
  26. package/dist/esm/tile-layer/tile-2d-header.js +54 -18
  27. package/dist/esm/tile-layer/tile-2d-header.js.map +1 -1
  28. package/dist/esm/tile-layer/tile-2d-traversal.js +17 -3
  29. package/dist/esm/tile-layer/tile-2d-traversal.js.map +1 -1
  30. package/dist/esm/tile-layer/tile-layer.js +20 -13
  31. package/dist/esm/tile-layer/tile-layer.js.map +1 -1
  32. package/dist/esm/tile-layer/tileset-2d.js +88 -54
  33. package/dist/esm/tile-layer/tileset-2d.js.map +1 -1
  34. package/dist/esm/tile-layer/types.js +2 -0
  35. package/dist/esm/tile-layer/types.js.map +1 -0
  36. package/dist/esm/tile-layer/utils.js +26 -11
  37. package/dist/esm/tile-layer/utils.js.map +1 -1
  38. package/dist.min.js +2 -2
  39. package/package.json +11 -11
  40. package/src/index.ts +5 -0
  41. package/src/mvt-layer/mvt-layer.js +6 -6
  42. package/src/tile-3d-layer/tile-3d-layer.js +6 -5
  43. package/src/tile-layer/{tile-2d-header.js → tile-2d-header.ts} +50 -16
  44. package/src/tile-layer/{tile-2d-traversal.js → tile-2d-traversal.ts} +49 -12
  45. package/src/tile-layer/{tile-layer.js → tile-layer.ts} +147 -28
  46. package/src/tile-layer/{tileset-2d.js → tileset-2d.ts} +143 -66
  47. package/src/tile-layer/types.ts +17 -0
  48. package/src/tile-layer/{utils.js → utils.ts} +62 -25
@@ -1,7 +1,9 @@
1
+ import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
1
2
  import Tile2DHeader from './tile-2d-header';
2
3
  import { getTileIndices, tileToBoundingBox } from './utils';
3
4
  import { RequestScheduler } from '@loaders.gl/loader-utils';
4
5
  import { Matrix4 } from '@math.gl/core';
6
+ import { assert } from '@deck.gl/core';
5
7
  const TILE_STATE_VISITED = 1;
6
8
  const TILE_STATE_VISIBLE = 2;
7
9
  export const STRATEGY_NEVER = 'never';
@@ -15,6 +17,34 @@ const STRATEGIES = {
15
17
  };
16
18
  export default class Tileset2D {
17
19
  constructor(opts) {
20
+ _defineProperty(this, "opts", void 0);
21
+
22
+ _defineProperty(this, "_requestScheduler", void 0);
23
+
24
+ _defineProperty(this, "_cache", void 0);
25
+
26
+ _defineProperty(this, "_dirty", void 0);
27
+
28
+ _defineProperty(this, "_tiles", void 0);
29
+
30
+ _defineProperty(this, "_cacheByteSize", void 0);
31
+
32
+ _defineProperty(this, "_viewport", void 0);
33
+
34
+ _defineProperty(this, "_selectedTiles", void 0);
35
+
36
+ _defineProperty(this, "_frameNumber", void 0);
37
+
38
+ _defineProperty(this, "_modelMatrix", void 0);
39
+
40
+ _defineProperty(this, "_modelMatrixInverse", void 0);
41
+
42
+ _defineProperty(this, "_maxZoom", void 0);
43
+
44
+ _defineProperty(this, "_minZoom", void 0);
45
+
46
+ _defineProperty(this, "onTileLoad", void 0);
47
+
18
48
  this.opts = opts;
19
49
 
20
50
  this.onTileLoad = tile => {
@@ -52,11 +82,11 @@ export default class Tileset2D {
52
82
  }
53
83
 
54
84
  get isLoaded() {
55
- return this._selectedTiles.every(tile => tile.isLoaded);
85
+ return this._selectedTiles !== null && this._selectedTiles.every(tile => tile.isLoaded);
56
86
  }
57
87
 
58
88
  get needsReload() {
59
- return this._selectedTiles.some(tile => tile.needsReload);
89
+ return this._selectedTiles !== null && this._selectedTiles.some(tile => tile.needsReload);
60
90
  }
61
91
 
62
92
  setOptions(opts) {
@@ -85,11 +115,11 @@ export default class Tileset2D {
85
115
  }
86
116
 
87
117
  reloadAll() {
88
- for (const tileId of this._cache.keys()) {
89
- const tile = this._cache.get(tileId);
118
+ for (const id of this._cache.keys()) {
119
+ const tile = this._cache.get(id);
90
120
 
91
- if (!this._selectedTiles.includes(tile)) {
92
- this._cache.delete(tileId);
121
+ if (!this._selectedTiles || !this._selectedTiles.includes(tile)) {
122
+ this._cache.delete(id);
93
123
  } else {
94
124
  tile.setNeedsReload();
95
125
  }
@@ -103,7 +133,7 @@ export default class Tileset2D {
103
133
  const modelMatrixAsMatrix4 = new Matrix4(modelMatrix);
104
134
  const isModelMatrixNew = !modelMatrixAsMatrix4.equals(this._modelMatrix);
105
135
 
106
- if (!viewport.equals(this._viewport) || isModelMatrixNew) {
136
+ if (!this._viewport || !viewport.equals(this._viewport) || isModelMatrixNew) {
107
137
  if (isModelMatrixNew) {
108
138
  this._modelMatrixInverse = modelMatrixAsMatrix4.clone().invert();
109
139
  this._modelMatrix = modelMatrixAsMatrix4;
@@ -124,11 +154,7 @@ export default class Tileset2D {
124
154
  this._rebuildTree();
125
155
  }
126
156
  } else if (this.needsReload) {
127
- this._selectedTiles = this._selectedTiles.map(tile => this._getTile({
128
- x: tile.x,
129
- y: tile.y,
130
- z: tile.z
131
- }));
157
+ this._selectedTiles = this._selectedTiles.map(tile => this._getTile(tile.index));
132
158
  }
133
159
 
134
160
  const changed = this.updateTileStates();
@@ -165,34 +191,44 @@ export default class Tileset2D {
165
191
  minZoom,
166
192
  zRange,
167
193
  tileSize,
168
- extent,
194
+ extent: extent,
169
195
  modelMatrix,
170
196
  modelMatrixInverse,
171
197
  zoomOffset
172
198
  });
173
199
  }
174
200
 
175
- getTileMetadata({
176
- x,
177
- y,
178
- z
179
- }) {
201
+ getTileId(index) {
202
+ return "".concat(index.x, "-").concat(index.y, "-").concat(index.z);
203
+ }
204
+
205
+ getTileZoom(index) {
206
+ return index.z;
207
+ }
208
+
209
+ getTileMetadata(index) {
210
+ assert(this._viewport);
180
211
  const {
181
212
  tileSize
182
213
  } = this.opts;
183
214
  return {
184
- bbox: tileToBoundingBox(this._viewport, x, y, z, tileSize)
215
+ bbox: tileToBoundingBox(this._viewport, index.x, index.y, index.z, tileSize)
185
216
  };
186
217
  }
187
218
 
188
- getParentIndex(tileIndex) {
189
- tileIndex.x = Math.floor(tileIndex.x / 2);
190
- tileIndex.y = Math.floor(tileIndex.y / 2);
191
- tileIndex.z -= 1;
192
- return tileIndex;
219
+ getParentIndex(index) {
220
+ const x = Math.floor(index.x / 2);
221
+ const y = Math.floor(index.y / 2);
222
+ const z = index.z - 1;
223
+ return {
224
+ x,
225
+ y,
226
+ z
227
+ };
193
228
  }
194
229
 
195
230
  updateTileStates() {
231
+ assert(this._selectedTiles);
196
232
  const refinementStrategy = this.opts.refinementStrategy || STRATEGY_DEFAULT;
197
233
  const visibilities = new Array(this._cache.size);
198
234
  let i = 0;
@@ -251,21 +287,25 @@ export default class Tileset2D {
251
287
 
252
288
  for (const tile of _cache.values()) {
253
289
  tile.parent = null;
254
- tile.children.length = 0;
290
+
291
+ if (tile.children) {
292
+ tile.children.length = 0;
293
+ }
255
294
  }
256
295
 
257
296
  for (const tile of _cache.values()) {
258
- const parent = this._getNearestAncestor(tile.x, tile.y, tile.z);
297
+ const parent = this._getNearestAncestor(tile);
259
298
 
260
299
  tile.parent = parent;
261
300
 
262
- if (parent) {
301
+ if (parent !== null && parent !== void 0 && parent.children) {
263
302
  parent.children.push(tile);
264
303
  }
265
304
  }
266
305
  }
267
306
 
268
307
  _resizeCache() {
308
+ assert(this.selectedTiles);
269
309
  const {
270
310
  _cache,
271
311
  opts
@@ -275,11 +315,11 @@ export default class Tileset2D {
275
315
  const overflown = _cache.size > maxCacheSize || this._cacheByteSize > maxCacheByteSize;
276
316
 
277
317
  if (overflown) {
278
- for (const [tileId, tile] of _cache) {
318
+ for (const [id, tile] of _cache) {
279
319
  if (!tile.isVisible) {
280
320
  this._cacheByteSize -= opts.maxCacheByteSize ? tile.byteLength : 0;
281
321
 
282
- _cache.delete(tileId);
322
+ _cache.delete(id);
283
323
 
284
324
  this.opts.onTileUnload(tile);
285
325
  }
@@ -295,39 +335,35 @@ export default class Tileset2D {
295
335
  }
296
336
 
297
337
  if (this._dirty) {
298
- this._tiles = Array.from(this._cache.values()).sort((t1, t2) => t1.z - t2.z);
338
+ this._tiles = Array.from(this._cache.values()).sort((t1, t2) => t1.zoom - t2.zoom);
299
339
  this._dirty = false;
300
340
  }
301
341
  }
302
342
 
303
- _getTile({
304
- x,
305
- y,
306
- z
307
- }, create) {
308
- const tileId = "".concat(x, ",").concat(y, ",").concat(z);
343
+ _getTile(index, create) {
344
+ const id = this.getTileId(index);
309
345
 
310
- let tile = this._cache.get(tileId);
346
+ let tile = this._cache.get(id);
311
347
 
312
348
  let needsReload = false;
313
349
 
314
350
  if (!tile && create) {
315
- tile = new Tile2DHeader({
316
- x,
317
- y,
318
- z
351
+ tile = new Tile2DHeader(index);
352
+ Object.assign(tile, this.getTileMetadata(tile.index));
353
+ Object.assign(tile, {
354
+ id,
355
+ zoom: this.getTileZoom(tile.index)
319
356
  });
320
- Object.assign(tile, this.getTileMetadata(tile));
321
357
  needsReload = true;
322
358
 
323
- this._cache.set(tileId, tile);
359
+ this._cache.set(id, tile);
324
360
 
325
361
  this._dirty = true;
326
362
  } else if (tile && tile.needsReload) {
327
363
  needsReload = true;
328
364
  }
329
365
 
330
- if (needsReload) {
366
+ if (tile && needsReload) {
331
367
  tile.loadData({
332
368
  getData: this.opts.getTileData,
333
369
  requestScheduler: this._requestScheduler,
@@ -339,17 +375,13 @@ export default class Tileset2D {
339
375
  return tile;
340
376
  }
341
377
 
342
- _getNearestAncestor(x, y, z) {
378
+ _getNearestAncestor(tile) {
343
379
  const {
344
380
  _minZoom = 0
345
381
  } = this;
346
- let index = {
347
- x,
348
- y,
349
- z
350
- };
382
+ let index = tile.index;
351
383
 
352
- while (index.z > _minZoom) {
384
+ while (this.getTileZoom(index) > _minZoom) {
353
385
  index = this.getParentIndex(index);
354
386
 
355
387
  const parent = this._getTile(index);
@@ -391,12 +423,12 @@ function updateTileStateReplace(allTiles) {
391
423
  }
392
424
  }
393
425
 
394
- const sortedTiles = Array.from(allTiles).sort((t1, t2) => t1.z - t2.z);
426
+ const sortedTiles = Array.from(allTiles).sort((t1, t2) => t1.zoom - t2.zoom);
395
427
 
396
428
  for (const tile of sortedTiles) {
397
429
  tile.isVisible = Boolean(tile.state & TILE_STATE_VISIBLE);
398
430
 
399
- if (tile.isVisible || tile.state & TILE_STATE_VISITED) {
431
+ if (tile.children && (tile.isVisible || tile.state & TILE_STATE_VISITED)) {
400
432
  for (const child of tile.children) {
401
433
  child.state = TILE_STATE_VISITED;
402
434
  }
@@ -406,7 +438,9 @@ function updateTileStateReplace(allTiles) {
406
438
  }
407
439
  }
408
440
 
409
- function getPlaceholderInAncestors(tile) {
441
+ function getPlaceholderInAncestors(startTile) {
442
+ let tile = startTile;
443
+
410
444
  while (tile) {
411
445
  if (tile.isLoaded || tile.content) {
412
446
  tile.state |= TILE_STATE_VISIBLE;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/tile-layer/tileset-2d.js"],"names":["Tile2DHeader","getTileIndices","tileToBoundingBox","RequestScheduler","Matrix4","TILE_STATE_VISITED","TILE_STATE_VISIBLE","STRATEGY_NEVER","STRATEGY_REPLACE","STRATEGY_DEFAULT","DEFAULT_CACHE_SCALE","STRATEGIES","updateTileStateDefault","updateTileStateReplace","Tileset2D","constructor","opts","onTileLoad","tile","maxCacheByteSize","_cacheByteSize","byteLength","_resizeCache","_requestScheduler","maxRequests","throttleRequests","_cache","Map","_tiles","_dirty","_viewport","_selectedTiles","_frameNumber","_modelMatrix","_modelMatrixInverse","setOptions","tiles","selectedTiles","isLoaded","every","needsReload","some","Object","assign","Number","isFinite","maxZoom","_maxZoom","Math","floor","minZoom","_minZoom","ceil","finalize","values","isLoading","abort","clear","reloadAll","tileId","keys","get","includes","delete","setNeedsReload","update","viewport","zRange","modelMatrix","modelMatrixAsMatrix4","isModelMatrixNew","equals","clone","invert","tileIndices","modelMatrixInverse","map","index","_getTile","_rebuildTree","x","y","z","changed","updateTileStates","_pruneRequests","tileSize","extent","zoomOffset","getTileMetadata","bbox","getParentIndex","tileIndex","refinementStrategy","visibilities","Array","size","i","isVisible","isSelected","from","abortCandidates","ongoingRequestCount","push","length","shift","parent","children","_getNearestAncestor","maxCacheSize","Infinity","overflown","onTileUnload","sort","t1","t2","create","set","loadData","getData","getTileData","requestScheduler","onLoad","onError","onTileError","allTiles","state","getPlaceholderInAncestors","getPlaceholderInChildren","Boolean","sortedTiles","child","content"],"mappings":"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","sourcesContent":["import Tile2DHeader from './tile-2d-header';\nimport {getTileIndices, tileToBoundingBox} from './utils';\nimport {RequestScheduler} from '@loaders.gl/loader-utils';\nimport {Matrix4} from '@math.gl/core';\n\n// bit masks\nconst TILE_STATE_VISITED = 1;\nconst TILE_STATE_VISIBLE = 2;\n/*\n show cached parent tile if children are loading\n +-----------+ +-----+ +-----+-----+\n | | | | | | |\n | | | | | | |\n | | --> +-----+-----+ -> +-----+-----+\n | | | | | | |\n | | | | | | |\n +-----------+ +-----+ +-----+-----+\n\n show cached children tiles when parent is loading\n +-------+---- +------------\n | | |\n | | |\n | | |\n +-------+---- --> |\n | | |\n */\n\nexport const STRATEGY_NEVER = 'never';\nexport const STRATEGY_REPLACE = 'no-overlap';\nexport const STRATEGY_DEFAULT = 'best-available';\n\nconst DEFAULT_CACHE_SCALE = 5;\n\nconst STRATEGIES = {\n [STRATEGY_DEFAULT]: updateTileStateDefault,\n [STRATEGY_REPLACE]: updateTileStateReplace,\n [STRATEGY_NEVER]: () => {}\n};\n\n/**\n * Manages loading and purging of tiles data. This class caches recently visited tiles\n * and only create new tiles if they are present.\n */\n\nexport default class Tileset2D {\n /**\n * Takes in a function that returns tile data, a cache size, and a max and a min zoom level.\n * Cache size defaults to 5 * number of tiles in the current viewport\n */\n constructor(opts) {\n this.opts = opts;\n\n this.onTileLoad = tile => {\n this.opts.onTileLoad(tile);\n if (this.opts.maxCacheByteSize) {\n this._cacheByteSize += tile.byteLength;\n this._resizeCache();\n }\n };\n\n this._requestScheduler = new RequestScheduler({\n maxRequests: opts.maxRequests,\n throttleRequests: opts.maxRequests > 0\n });\n\n // Maps tile id in string {z}-{x}-{y} to a Tile object\n this._cache = new Map();\n this._tiles = [];\n this._dirty = false;\n this._cacheByteSize = 0;\n\n // Cache the last processed viewport\n this._viewport = null;\n this._selectedTiles = null;\n this._frameNumber = 0;\n\n this._modelMatrix = new Matrix4();\n this._modelMatrixInverse = new Matrix4();\n\n this.setOptions(opts);\n }\n\n /* Public API */\n get tiles() {\n return this._tiles;\n }\n\n get selectedTiles() {\n return this._selectedTiles;\n }\n\n get isLoaded() {\n return this._selectedTiles.every(tile => tile.isLoaded);\n }\n\n get needsReload() {\n return this._selectedTiles.some(tile => tile.needsReload);\n }\n\n setOptions(opts) {\n Object.assign(this.opts, opts);\n if (Number.isFinite(opts.maxZoom)) {\n this._maxZoom = Math.floor(opts.maxZoom);\n }\n if (Number.isFinite(opts.minZoom)) {\n this._minZoom = Math.ceil(opts.minZoom);\n }\n }\n\n // Clean up any outstanding tile requests.\n finalize() {\n for (const tile of this._cache.values()) {\n if (tile.isLoading) {\n tile.abort();\n }\n }\n this._cache.clear();\n this._tiles = [];\n this._selectedTiles = null;\n }\n\n reloadAll() {\n for (const tileId of this._cache.keys()) {\n const tile = this._cache.get(tileId);\n if (!this._selectedTiles.includes(tile)) {\n this._cache.delete(tileId);\n } else {\n tile.setNeedsReload();\n }\n }\n }\n\n /**\n * Update the cache with the given viewport and model matrix and triggers callback onUpdate.\n * @param {*} viewport\n * @param {*} onUpdate\n * @param {*} modelMatrix\n */\n update(viewport, {zRange, modelMatrix} = {}) {\n const modelMatrixAsMatrix4 = new Matrix4(modelMatrix);\n const isModelMatrixNew = !modelMatrixAsMatrix4.equals(this._modelMatrix);\n if (!viewport.equals(this._viewport) || isModelMatrixNew) {\n if (isModelMatrixNew) {\n this._modelMatrixInverse = modelMatrixAsMatrix4.clone().invert();\n this._modelMatrix = modelMatrixAsMatrix4;\n }\n this._viewport = viewport;\n const tileIndices = this.getTileIndices({\n viewport,\n maxZoom: this._maxZoom,\n minZoom: this._minZoom,\n zRange,\n modelMatrix: this._modelMatrix,\n modelMatrixInverse: this._modelMatrixInverse\n });\n this._selectedTiles = tileIndices.map(index => this._getTile(index, true));\n\n if (this._dirty) {\n // Some new tiles are added\n this._rebuildTree();\n }\n // Check for needed reloads explicitly even if the view/matrix has not changed.\n } else if (this.needsReload) {\n this._selectedTiles = this._selectedTiles.map(tile =>\n this._getTile({x: tile.x, y: tile.y, z: tile.z})\n );\n }\n\n // Update tile states\n const changed = this.updateTileStates();\n this._pruneRequests();\n\n if (this._dirty) {\n // cache size is either the user defined maxSize or 5 * number of current tiles in the viewport.\n this._resizeCache();\n }\n\n if (changed) {\n this._frameNumber++;\n }\n\n return this._frameNumber;\n }\n\n /* Public interface for subclassing */\n\n // Returns array of {x, y, z}\n getTileIndices({viewport, maxZoom, minZoom, zRange, modelMatrix, modelMatrixInverse}) {\n const {tileSize, extent, zoomOffset} = this.opts;\n return getTileIndices({\n viewport,\n maxZoom,\n minZoom,\n zRange,\n tileSize,\n extent,\n modelMatrix,\n modelMatrixInverse,\n zoomOffset\n });\n }\n\n // Add custom metadata to tiles\n getTileMetadata({x, y, z}) {\n const {tileSize} = this.opts;\n return {bbox: tileToBoundingBox(this._viewport, x, y, z, tileSize)};\n }\n\n // Returns {x, y, z} of the parent tile\n getParentIndex(tileIndex) {\n // Perf: mutate the input object to avoid GC\n tileIndex.x = Math.floor(tileIndex.x / 2);\n tileIndex.y = Math.floor(tileIndex.y / 2);\n tileIndex.z -= 1;\n return tileIndex;\n }\n\n // Returns true if any tile's visibility changed\n updateTileStates() {\n const refinementStrategy = this.opts.refinementStrategy || STRATEGY_DEFAULT;\n\n const visibilities = new Array(this._cache.size);\n let i = 0;\n // Reset state\n for (const tile of this._cache.values()) {\n // save previous state\n visibilities[i++] = tile.isVisible;\n tile.isSelected = false;\n tile.isVisible = false;\n }\n for (const tile of this._selectedTiles) {\n tile.isSelected = true;\n tile.isVisible = true;\n }\n\n // Strategy-specific state logic\n (typeof refinementStrategy === 'function'\n ? refinementStrategy\n : STRATEGIES[refinementStrategy])(Array.from(this._cache.values()));\n\n i = 0;\n // Check if any visibility has changed\n for (const tile of this._cache.values()) {\n if (visibilities[i++] !== tile.isVisible) {\n return true;\n }\n }\n\n return false;\n }\n\n /* Private methods */\n\n _pruneRequests() {\n const {maxRequests} = this.opts;\n\n const abortCandidates = [];\n let ongoingRequestCount = 0;\n for (const tile of this._cache.values()) {\n // Keep track of all the ongoing requests\n if (tile.isLoading) {\n ongoingRequestCount++;\n if (!tile.isSelected && !tile.isVisible) {\n abortCandidates.push(tile);\n }\n }\n }\n\n while (maxRequests > 0 && ongoingRequestCount > maxRequests && abortCandidates.length > 0) {\n // There are too many ongoing requests, so abort some that are unselected\n const tile = abortCandidates.shift();\n tile.abort();\n ongoingRequestCount--;\n }\n }\n\n // This needs to be called every time some tiles have been added/removed from cache\n _rebuildTree() {\n const {_cache} = this;\n\n // Reset states\n for (const tile of _cache.values()) {\n tile.parent = null;\n tile.children.length = 0;\n }\n\n // Rebuild tree\n for (const tile of _cache.values()) {\n const parent = this._getNearestAncestor(tile.x, tile.y, tile.z);\n tile.parent = parent;\n if (parent) {\n parent.children.push(tile);\n }\n }\n }\n\n /**\n * Clear tiles that are not visible when the cache is full\n */\n /* eslint-disable complexity */\n _resizeCache() {\n const {_cache, opts} = this;\n\n const maxCacheSize =\n opts.maxCacheSize ||\n (opts.maxCacheByteSize ? Infinity : DEFAULT_CACHE_SCALE * this.selectedTiles.length);\n const maxCacheByteSize = opts.maxCacheByteSize || Infinity;\n\n const overflown = _cache.size > maxCacheSize || this._cacheByteSize > maxCacheByteSize;\n\n if (overflown) {\n for (const [tileId, tile] of _cache) {\n if (!tile.isVisible) {\n // delete tile\n this._cacheByteSize -= opts.maxCacheByteSize ? tile.byteLength : 0;\n _cache.delete(tileId);\n this.opts.onTileUnload(tile);\n }\n if (_cache.size <= maxCacheSize && this._cacheByteSize <= maxCacheByteSize) {\n break;\n }\n }\n this._rebuildTree();\n this._dirty = true;\n }\n if (this._dirty) {\n this._tiles = Array.from(this._cache.values())\n // sort by zoom level so that smaller tiles are displayed on top\n .sort((t1, t2) => t1.z - t2.z);\n\n this._dirty = false;\n }\n }\n /* eslint-enable complexity */\n\n _getTile({x, y, z}, create) {\n const tileId = `${x},${y},${z}`;\n let tile = this._cache.get(tileId);\n let needsReload = false;\n\n if (!tile && create) {\n tile = new Tile2DHeader({x, y, z});\n Object.assign(tile, this.getTileMetadata(tile));\n needsReload = true;\n this._cache.set(tileId, tile);\n this._dirty = true;\n } else if (tile && tile.needsReload) {\n needsReload = true;\n }\n if (needsReload) {\n tile.loadData({\n getData: this.opts.getTileData,\n requestScheduler: this._requestScheduler,\n onLoad: this.onTileLoad,\n onError: this.opts.onTileError\n });\n }\n\n return tile;\n }\n\n _getNearestAncestor(x, y, z) {\n const {_minZoom = 0} = this;\n let index = {x, y, z};\n\n while (index.z > _minZoom) {\n index = this.getParentIndex(index);\n const parent = this._getTile(index);\n if (parent) {\n return parent;\n }\n }\n return null;\n }\n}\n\n/* -- Refinement strategies --*/\n/* eslint-disable max-depth */\n\n// For all the selected && pending tiles:\n// - pick the closest ancestor as placeholder\n// - if no ancestor is visible, pick the closest children as placeholder\nfunction updateTileStateDefault(allTiles) {\n for (const tile of allTiles) {\n tile.state = 0;\n }\n for (const tile of allTiles) {\n if (tile.isSelected && !getPlaceholderInAncestors(tile)) {\n getPlaceholderInChildren(tile);\n }\n }\n for (const tile of allTiles) {\n tile.isVisible = Boolean(tile.state & TILE_STATE_VISIBLE);\n }\n}\n\n// Until a selected tile and all its selected siblings are loaded, use the closest ancestor as placeholder\nfunction updateTileStateReplace(allTiles) {\n for (const tile of allTiles) {\n tile.state = 0;\n }\n for (const tile of allTiles) {\n if (tile.isSelected) {\n getPlaceholderInAncestors(tile);\n }\n }\n // Always process parents first\n const sortedTiles = Array.from(allTiles).sort((t1, t2) => t1.z - t2.z);\n for (const tile of sortedTiles) {\n tile.isVisible = Boolean(tile.state & TILE_STATE_VISIBLE);\n\n if (tile.isVisible || tile.state & TILE_STATE_VISITED) {\n // If the tile is rendered, or if the tile has been explicitly hidden, hide all of its children\n for (const child of tile.children) {\n child.state = TILE_STATE_VISITED;\n }\n } else if (tile.isSelected) {\n getPlaceholderInChildren(tile);\n }\n }\n}\n\n// Walk up the tree until we find one ancestor that is loaded. Returns true if successful.\nfunction getPlaceholderInAncestors(tile) {\n while (tile) {\n if (tile.isLoaded || tile.content) {\n tile.state |= TILE_STATE_VISIBLE;\n return true;\n }\n tile = tile.parent;\n }\n return false;\n}\n\n// Recursively set children as placeholder\nfunction getPlaceholderInChildren(tile) {\n for (const child of tile.children) {\n if (child.isLoaded || child.content) {\n child.state |= TILE_STATE_VISIBLE;\n } else {\n getPlaceholderInChildren(child);\n }\n }\n}\n"],"file":"tileset-2d.js"}
1
+ {"version":3,"sources":["../../../src/tile-layer/tileset-2d.ts"],"names":["Tile2DHeader","getTileIndices","tileToBoundingBox","RequestScheduler","Matrix4","assert","TILE_STATE_VISITED","TILE_STATE_VISIBLE","STRATEGY_NEVER","STRATEGY_REPLACE","STRATEGY_DEFAULT","DEFAULT_CACHE_SCALE","STRATEGIES","updateTileStateDefault","updateTileStateReplace","Tileset2D","constructor","opts","onTileLoad","tile","maxCacheByteSize","_cacheByteSize","byteLength","_resizeCache","_requestScheduler","maxRequests","throttleRequests","_cache","Map","_tiles","_dirty","_viewport","_selectedTiles","_frameNumber","_modelMatrix","_modelMatrixInverse","setOptions","tiles","selectedTiles","isLoaded","every","needsReload","some","Object","assign","Number","isFinite","maxZoom","_maxZoom","Math","floor","minZoom","_minZoom","ceil","finalize","values","isLoading","abort","clear","reloadAll","id","keys","get","includes","delete","setNeedsReload","update","viewport","zRange","modelMatrix","modelMatrixAsMatrix4","isModelMatrixNew","equals","clone","invert","tileIndices","modelMatrixInverse","map","index","_getTile","_rebuildTree","changed","updateTileStates","_pruneRequests","tileSize","extent","zoomOffset","getTileId","x","y","z","getTileZoom","getTileMetadata","bbox","getParentIndex","refinementStrategy","visibilities","Array","size","i","isVisible","isSelected","from","abortCandidates","ongoingRequestCount","push","length","shift","parent","children","_getNearestAncestor","maxCacheSize","Infinity","overflown","onTileUnload","sort","t1","t2","zoom","create","set","loadData","getData","getTileData","requestScheduler","onLoad","onError","onTileError","allTiles","state","getPlaceholderInAncestors","getPlaceholderInChildren","Boolean","sortedTiles","child","startTile","content"],"mappings":"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","sourcesContent":["import Tile2DHeader from './tile-2d-header';\nimport {getTileIndices, tileToBoundingBox} from './utils';\nimport {RequestScheduler} from '@loaders.gl/loader-utils';\nimport {Matrix4} from '@math.gl/core';\nimport {assert, Viewport} from '@deck.gl/core';\nimport {Bounds, TileIndex, ZRange} from './types';\nimport {TileLayerProps} from './tile-layer';\n\n// bit masks\nconst TILE_STATE_VISITED = 1;\nconst TILE_STATE_VISIBLE = 2;\n/*\n show cached parent tile if children are loading\n +-----------+ +-----+ +-----+-----+\n | | | | | | |\n | | | | | | |\n | | --> +-----+-----+ -> +-----+-----+\n | | | | | | |\n | | | | | | |\n +-----------+ +-----+ +-----+-----+\n\n show cached children tiles when parent is loading\n +-------+---- +------------\n | | |\n | | |\n | | |\n +-------+---- --> |\n | | |\n */\n\nexport const STRATEGY_NEVER = 'never';\nexport const STRATEGY_REPLACE = 'no-overlap';\nexport const STRATEGY_DEFAULT = 'best-available';\n\nexport type RefinementStrategyFunction = (tiles: Tile2DHeader[]) => void;\nexport type RefinementStrategy =\n | typeof STRATEGY_NEVER\n | typeof STRATEGY_REPLACE\n | typeof STRATEGY_DEFAULT\n | RefinementStrategyFunction;\n\nconst DEFAULT_CACHE_SCALE = 5;\n\nconst STRATEGIES = {\n [STRATEGY_DEFAULT]: updateTileStateDefault,\n [STRATEGY_REPLACE]: updateTileStateReplace,\n [STRATEGY_NEVER]: () => {}\n};\n\nexport type Tileset2DProps = Pick<\n TileLayerProps,\n | 'getTileData'\n | 'tileSize'\n | 'maxCacheSize'\n | 'maxCacheByteSize'\n | 'refinementStrategy'\n | 'extent'\n | 'maxZoom'\n | 'minZoom'\n | 'maxRequests'\n | 'zoomOffset'\n> & {\n onTileLoad: (tile: Tile2DHeader) => void;\n onTileUnload: (tile: Tile2DHeader) => void;\n onTileError: (error: any, tile: Tile2DHeader) => void;\n};\n\n/**\n * Manages loading and purging of tile data. This class caches recently visited tiles\n * and only creates new tiles if they are present.\n */\nexport default class Tileset2D {\n private opts: Tileset2DProps;\n private _requestScheduler: RequestScheduler;\n private _cache: Map<string, Tile2DHeader>;\n private _dirty: boolean;\n private _tiles: Tile2DHeader[];\n\n private _cacheByteSize: number;\n private _viewport: Viewport | null;\n private _selectedTiles: Tile2DHeader[] | null;\n private _frameNumber: number;\n private _modelMatrix: Matrix4;\n private _modelMatrixInverse: Matrix4;\n\n private _maxZoom?: number;\n private _minZoom?: number;\n\n private onTileLoad: (tile: Tile2DHeader) => void;\n\n /**\n * Takes in a function that returns tile data, a cache size, and a max and a min zoom level.\n * Cache size defaults to 5 * number of tiles in the current viewport\n */\n constructor(opts: Tileset2DProps) {\n this.opts = opts;\n\n this.onTileLoad = tile => {\n this.opts.onTileLoad(tile);\n if (this.opts.maxCacheByteSize) {\n this._cacheByteSize += tile.byteLength;\n this._resizeCache();\n }\n };\n\n this._requestScheduler = new RequestScheduler({\n maxRequests: opts.maxRequests,\n throttleRequests: opts.maxRequests > 0\n });\n\n // Maps tile id in string {z}-{x}-{y} to a Tile object\n this._cache = new Map();\n this._tiles = [];\n this._dirty = false;\n this._cacheByteSize = 0;\n\n // Cache the last processed viewport\n this._viewport = null;\n this._selectedTiles = null;\n this._frameNumber = 0;\n\n this._modelMatrix = new Matrix4();\n this._modelMatrixInverse = new Matrix4();\n\n this.setOptions(opts);\n }\n\n /* Public API */\n get tiles() {\n return this._tiles;\n }\n\n get selectedTiles(): Tile2DHeader[] | null {\n return this._selectedTiles;\n }\n\n get isLoaded(): boolean {\n return this._selectedTiles !== null && this._selectedTiles.every(tile => tile.isLoaded);\n }\n\n get needsReload(): boolean {\n return this._selectedTiles !== null && this._selectedTiles.some(tile => tile.needsReload);\n }\n\n setOptions(opts: Tileset2DProps): void {\n Object.assign(this.opts, opts);\n if (Number.isFinite(opts.maxZoom)) {\n this._maxZoom = Math.floor(opts.maxZoom);\n }\n if (Number.isFinite(opts.minZoom)) {\n this._minZoom = Math.ceil(opts.minZoom);\n }\n }\n\n // Clean up any outstanding tile requests.\n finalize(): void {\n for (const tile of this._cache.values()) {\n if (tile.isLoading) {\n tile.abort();\n }\n }\n this._cache.clear();\n this._tiles = [];\n this._selectedTiles = null;\n }\n\n reloadAll(): void {\n for (const id of this._cache.keys()) {\n const tile = this._cache.get(id) as Tile2DHeader;\n if (!this._selectedTiles || !this._selectedTiles.includes(tile)) {\n this._cache.delete(id);\n } else {\n tile.setNeedsReload();\n }\n }\n }\n\n /**\n * Update the cache with the given viewport and model matrix and triggers callback onUpdate.\n */\n update(\n viewport: Viewport,\n {zRange, modelMatrix}: {zRange?: ZRange; modelMatrix?: Matrix4} = {}\n ): number {\n const modelMatrixAsMatrix4 = new Matrix4(modelMatrix);\n const isModelMatrixNew = !modelMatrixAsMatrix4.equals(this._modelMatrix);\n if (!this._viewport || !viewport.equals(this._viewport) || isModelMatrixNew) {\n if (isModelMatrixNew) {\n this._modelMatrixInverse = modelMatrixAsMatrix4.clone().invert();\n this._modelMatrix = modelMatrixAsMatrix4;\n }\n this._viewport = viewport;\n const tileIndices = this.getTileIndices({\n viewport,\n maxZoom: this._maxZoom,\n minZoom: this._minZoom,\n zRange,\n modelMatrix: this._modelMatrix,\n modelMatrixInverse: this._modelMatrixInverse\n });\n this._selectedTiles = tileIndices.map(index => this._getTile(index, true));\n\n if (this._dirty) {\n // Some new tiles are added\n this._rebuildTree();\n }\n // Check for needed reloads explicitly even if the view/matrix has not changed.\n } else if (this.needsReload) {\n this._selectedTiles = this._selectedTiles!.map(tile => this._getTile(tile.index));\n }\n\n // Update tile states\n const changed = this.updateTileStates();\n this._pruneRequests();\n\n if (this._dirty) {\n // cache size is either the user defined maxSize or 5 * number of current tiles in the viewport.\n this._resizeCache();\n }\n\n if (changed) {\n this._frameNumber++;\n }\n\n return this._frameNumber;\n }\n\n /* Public interface for subclassing */\n\n /** Returns array of tile indices in the current viewport */\n getTileIndices({\n viewport,\n maxZoom,\n minZoom,\n zRange,\n modelMatrix,\n modelMatrixInverse\n }: {\n viewport: Viewport;\n maxZoom?: number;\n minZoom?: number;\n zRange: ZRange | undefined;\n tileSize?: number;\n modelMatrix?: Matrix4;\n modelMatrixInverse?: Matrix4;\n zoomOffset?: number;\n }): TileIndex[] {\n const {tileSize, extent, zoomOffset} = this.opts;\n return getTileIndices({\n viewport,\n maxZoom,\n minZoom,\n zRange,\n tileSize,\n extent: extent as Bounds | undefined,\n modelMatrix,\n modelMatrixInverse,\n zoomOffset\n });\n }\n\n /** Returns unique string key for a tile index */\n getTileId(index: TileIndex) {\n return `${index.x}-${index.y}-${index.z}`;\n }\n\n /** Returns a zoom level for a tile index */\n getTileZoom(index: TileIndex) {\n return index.z;\n }\n\n /** Returns additional metadata to add to tile, bbox by default */\n getTileMetadata(index: TileIndex) {\n assert(this._viewport);\n const {tileSize} = this.opts;\n return {bbox: tileToBoundingBox(this._viewport, index.x, index.y, index.z, tileSize)};\n }\n\n /** Returns index of the parent tile */\n getParentIndex(index: TileIndex) {\n const x = Math.floor(index.x / 2);\n const y = Math.floor(index.y / 2);\n const z = index.z - 1;\n return {x, y, z};\n }\n\n // Returns true if any tile's visibility changed\n updateTileStates() {\n assert(this._selectedTiles);\n const refinementStrategy = this.opts.refinementStrategy || STRATEGY_DEFAULT;\n\n const visibilities = new Array(this._cache.size);\n let i = 0;\n // Reset state\n for (const tile of this._cache.values()) {\n // save previous state\n visibilities[i++] = tile.isVisible;\n tile.isSelected = false;\n tile.isVisible = false;\n }\n for (const tile of this._selectedTiles) {\n tile.isSelected = true;\n tile.isVisible = true;\n }\n\n // Strategy-specific state logic\n (typeof refinementStrategy === 'function'\n ? refinementStrategy\n : STRATEGIES[refinementStrategy])(Array.from(this._cache.values()));\n\n i = 0;\n // Check if any visibility has changed\n for (const tile of this._cache.values()) {\n if (visibilities[i++] !== tile.isVisible) {\n return true;\n }\n }\n\n return false;\n }\n\n /* Private methods */\n\n _pruneRequests(): void {\n const {maxRequests} = this.opts;\n\n const abortCandidates: Tile2DHeader[] = [];\n let ongoingRequestCount = 0;\n for (const tile of this._cache.values()) {\n // Keep track of all the ongoing requests\n if (tile.isLoading) {\n ongoingRequestCount++;\n if (!tile.isSelected && !tile.isVisible) {\n abortCandidates.push(tile);\n }\n }\n }\n\n while (maxRequests > 0 && ongoingRequestCount > maxRequests && abortCandidates.length > 0) {\n // There are too many ongoing requests, so abort some that are unselected\n const tile = abortCandidates.shift()!;\n tile.abort();\n ongoingRequestCount--;\n }\n }\n\n // This needs to be called every time some tiles have been added/removed from cache\n _rebuildTree() {\n const {_cache} = this;\n\n // Reset states\n for (const tile of _cache.values()) {\n tile.parent = null;\n if (tile.children) {\n tile.children.length = 0;\n }\n }\n\n // Rebuild tree\n for (const tile of _cache.values()) {\n const parent = this._getNearestAncestor(tile);\n tile.parent = parent;\n if (parent?.children) {\n parent.children.push(tile);\n }\n }\n }\n\n /**\n * Clear tiles that are not visible when the cache is full\n */\n /* eslint-disable complexity */\n _resizeCache() {\n assert(this.selectedTiles);\n const {_cache, opts} = this;\n\n const maxCacheSize =\n opts.maxCacheSize ||\n (opts.maxCacheByteSize ? Infinity : DEFAULT_CACHE_SCALE * this.selectedTiles.length);\n const maxCacheByteSize = opts.maxCacheByteSize || Infinity;\n\n const overflown = _cache.size > maxCacheSize || this._cacheByteSize > maxCacheByteSize;\n\n if (overflown) {\n for (const [id, tile] of _cache) {\n if (!tile.isVisible) {\n // delete tile\n this._cacheByteSize -= opts.maxCacheByteSize ? tile.byteLength : 0;\n _cache.delete(id);\n this.opts.onTileUnload(tile);\n }\n if (_cache.size <= maxCacheSize && this._cacheByteSize <= maxCacheByteSize) {\n break;\n }\n }\n this._rebuildTree();\n this._dirty = true;\n }\n if (this._dirty) {\n // sort by zoom level so that smaller tiles are displayed on top\n this._tiles = Array.from(this._cache.values()).sort((t1, t2) => t1.zoom - t2.zoom);\n\n this._dirty = false;\n }\n }\n /* eslint-enable complexity */\n\n _getTile(index: TileIndex, create: true): Tile2DHeader;\n _getTile(index: TileIndex, create?: false): Tile2DHeader | undefined;\n _getTile(index: TileIndex, create?: boolean): Tile2DHeader | undefined {\n const id = this.getTileId(index);\n let tile = this._cache.get(id);\n let needsReload = false;\n\n if (!tile && create) {\n tile = new Tile2DHeader(index);\n Object.assign(tile, this.getTileMetadata(tile.index));\n Object.assign(tile, {id, zoom: this.getTileZoom(tile.index)});\n needsReload = true;\n this._cache.set(id, tile);\n this._dirty = true;\n } else if (tile && tile.needsReload) {\n needsReload = true;\n }\n if (tile && needsReload) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n tile.loadData({\n getData: this.opts.getTileData,\n requestScheduler: this._requestScheduler,\n onLoad: this.onTileLoad,\n onError: this.opts.onTileError\n });\n }\n\n return tile;\n }\n\n _getNearestAncestor(tile: Tile2DHeader): Tile2DHeader | null {\n const {_minZoom = 0} = this;\n\n let index = tile.index;\n while (this.getTileZoom(index) > _minZoom) {\n index = this.getParentIndex(index);\n const parent = this._getTile(index);\n if (parent) {\n return parent;\n }\n }\n return null;\n }\n}\n\n/* -- Refinement strategies --*/\n/* eslint-disable max-depth */\n\n// For all the selected && pending tiles:\n// - pick the closest ancestor as placeholder\n// - if no ancestor is visible, pick the closest children as placeholder\nfunction updateTileStateDefault(allTiles: Tile2DHeader[]) {\n for (const tile of allTiles) {\n tile.state = 0;\n }\n for (const tile of allTiles) {\n if (tile.isSelected && !getPlaceholderInAncestors(tile)) {\n getPlaceholderInChildren(tile);\n }\n }\n for (const tile of allTiles) {\n tile.isVisible = Boolean(tile.state! & TILE_STATE_VISIBLE);\n }\n}\n\n// Until a selected tile and all its selected siblings are loaded, use the closest ancestor as placeholder\nfunction updateTileStateReplace(allTiles: Tile2DHeader[]) {\n for (const tile of allTiles) {\n tile.state = 0;\n }\n for (const tile of allTiles) {\n if (tile.isSelected) {\n getPlaceholderInAncestors(tile);\n }\n }\n // Always process parents first\n const sortedTiles = Array.from(allTiles).sort((t1, t2) => t1.zoom - t2.zoom);\n for (const tile of sortedTiles) {\n tile.isVisible = Boolean(tile.state! & TILE_STATE_VISIBLE);\n\n if (tile.children && (tile.isVisible || tile.state! & TILE_STATE_VISITED)) {\n // If the tile is rendered, or if the tile has been explicitly hidden, hide all of its children\n for (const child of tile.children) {\n child.state = TILE_STATE_VISITED;\n }\n } else if (tile.isSelected) {\n getPlaceholderInChildren(tile);\n }\n }\n}\n\n// Walk up the tree until we find one ancestor that is loaded. Returns true if successful.\nfunction getPlaceholderInAncestors(startTile: Tile2DHeader) {\n let tile: Tile2DHeader | null = startTile;\n while (tile) {\n if (tile.isLoaded || tile.content) {\n tile.state! |= TILE_STATE_VISIBLE;\n return true;\n }\n tile = tile.parent;\n }\n return false;\n}\n\n// Recursively set children as placeholder\nfunction getPlaceholderInChildren(tile) {\n for (const child of tile.children) {\n if (child.isLoaded || child.content) {\n child.state |= TILE_STATE_VISIBLE;\n } else {\n getPlaceholderInChildren(child);\n }\n }\n}\n"],"file":"tileset-2d.js"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","sourcesContent":[],"file":"types.js"}
@@ -36,22 +36,37 @@ function transformBox(bbox, modelMatrix) {
36
36
  return transformedBox;
37
37
  }
38
38
 
39
- export function getURLFromTemplate(template, properties) {
39
+ function stringHash(s) {
40
+ return Math.abs(s.split('').reduce((a, b) => (a << 5) - a + b.charCodeAt(0) | 0, 0));
41
+ }
42
+
43
+ export function getURLFromTemplate(template, tile) {
40
44
  if (!template || !template.length) {
41
45
  return null;
42
46
  }
43
47
 
48
+ const {
49
+ index,
50
+ id
51
+ } = tile;
52
+
44
53
  if (Array.isArray(template)) {
45
- const index = Math.abs(properties.x + properties.y) % template.length;
46
- template = template[index];
54
+ const i = stringHash(id) % template.length;
55
+ template = template[i];
47
56
  }
48
57
 
49
- const {
50
- x,
51
- y,
52
- z
53
- } = properties;
54
- return template.replace(/\{x\}/g, x).replace(/\{y\}/g, y).replace(/\{z\}/g, z).replace(/\{-y\}/g, Math.pow(2, z) - y - 1);
58
+ let url = template;
59
+
60
+ for (const key of Object.keys(index)) {
61
+ const regex = new RegExp("{".concat(key, "}"), 'g');
62
+ url = url.replace(regex, String(index[key]));
63
+ }
64
+
65
+ if (Number.isInteger(index.y) && Number.isInteger(index.z)) {
66
+ url = url.replace(/\{-y\}/g, String(Math.pow(2, index.z) - index.y - 1));
67
+ }
68
+
69
+ return url;
55
70
  }
56
71
 
57
72
  function getBoundingBox(viewport, zRange, extent) {
@@ -157,7 +172,7 @@ export function getTileIndices({
157
172
  }) {
158
173
  let z = viewport.isGeospatial ? Math.round(viewport.zoom + Math.log2(TILE_SIZE / tileSize)) + zoomOffset : Math.ceil(viewport.zoom) + zoomOffset;
159
174
 
160
- if (Number.isFinite(minZoom) && z < minZoom) {
175
+ if (typeof minZoom === 'number' && Number.isFinite(minZoom) && z < minZoom) {
161
176
  if (!extent) {
162
177
  return [];
163
178
  }
@@ -165,7 +180,7 @@ export function getTileIndices({
165
180
  z = minZoom;
166
181
  }
167
182
 
168
- if (Number.isFinite(maxZoom) && z > maxZoom) {
183
+ if (typeof maxZoom === 'number' && Number.isFinite(maxZoom) && z > maxZoom) {
169
184
  z = maxZoom;
170
185
  }
171
186
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/tile-layer/utils.js"],"names":["getOSMTileIndices","TILE_SIZE","DEFAULT_EXTENT","Infinity","urlType","type","value","validate","propType","optional","Array","isArray","every","url","equals","value1","value2","len","length","i","transformBox","bbox","modelMatrix","transformedCoords","transformAsPoint","transformedBox","Math","min","map","max","getURLFromTemplate","template","properties","index","abs","x","y","z","replace","pow","getBoundingBox","viewport","zRange","extent","bounds","minZ","maxZ","bounds0","getBounds","bounds1","isGeospatial","getIndexingCoords","scale","modelMatrixInverse","transformedTileIndex","getScale","tileSize","osmTile2lngLat","lng","n","PI","lat","atan","exp","tile2XY","tileToBoundingBox","west","north","east","south","left","top","right","bottom","getIdentityTileIndices","minX","minY","maxX","maxY","indices","floor","push","getTileIndices","maxZoom","minZoom","zoomOffset","round","zoom","log2","ceil","Number","isFinite","transformedExtent","isURLTemplate","s","test"],"mappings":"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","sourcesContent":["import {getOSMTileIndices} from './tile-2d-traversal';\n\nconst TILE_SIZE = 512;\nconst DEFAULT_EXTENT = [-Infinity, -Infinity, Infinity, Infinity];\n\nexport const urlType = {\n type: 'url',\n value: null,\n validate: (value, propType) =>\n (propType.optional && value === null) ||\n typeof value === 'string' ||\n (Array.isArray(value) && value.every(url => typeof url === 'string')),\n equals: (value1, value2) => {\n if (value1 === value2) {\n return true;\n }\n if (!Array.isArray(value1) || !Array.isArray(value2)) {\n return false;\n }\n const len = value1.length;\n if (len !== value2.length) {\n return false;\n }\n for (let i = 0; i < len; i++) {\n if (value1[i] !== value2[i]) {\n return false;\n }\n }\n return true;\n }\n};\n\nfunction transformBox(bbox, modelMatrix) {\n const transformedCoords = [\n // top-left\n modelMatrix.transformAsPoint([bbox[0], bbox[1]]),\n // top-right\n modelMatrix.transformAsPoint([bbox[2], bbox[1]]),\n // bottom-left\n modelMatrix.transformAsPoint([bbox[0], bbox[3]]),\n // bottom-right\n modelMatrix.transformAsPoint([bbox[2], bbox[3]])\n ];\n const transformedBox = [\n // Minimum x coord\n Math.min(...transformedCoords.map(i => i[0])),\n // Minimum y coord\n Math.min(...transformedCoords.map(i => i[1])),\n // Max x coord\n Math.max(...transformedCoords.map(i => i[0])),\n // Max y coord\n Math.max(...transformedCoords.map(i => i[1]))\n ];\n return transformedBox;\n}\n\nexport function getURLFromTemplate(template, properties) {\n if (!template || !template.length) {\n return null;\n }\n if (Array.isArray(template)) {\n const index = Math.abs(properties.x + properties.y) % template.length;\n template = template[index];\n }\n\n const {x, y, z} = properties;\n return template\n .replace(/\\{x\\}/g, x)\n .replace(/\\{y\\}/g, y)\n .replace(/\\{z\\}/g, z)\n .replace(/\\{-y\\}/g, Math.pow(2, z) - y - 1);\n}\n\n/**\n * gets the bounding box of a viewport\n */\nfunction getBoundingBox(viewport, zRange, extent) {\n let bounds;\n if (zRange && zRange.length === 2) {\n const [minZ, maxZ] = zRange;\n const bounds0 = viewport.getBounds({z: minZ});\n const bounds1 = viewport.getBounds({z: maxZ});\n bounds = [\n Math.min(bounds0[0], bounds1[0]),\n Math.min(bounds0[1], bounds1[1]),\n Math.max(bounds0[2], bounds1[2]),\n Math.max(bounds0[3], bounds1[3])\n ];\n } else {\n bounds = viewport.getBounds();\n }\n if (!viewport.isGeospatial) {\n return [\n // Top corner should not be more then bottom corner in either direction\n Math.max(Math.min(bounds[0], extent[2]), extent[0]),\n Math.max(Math.min(bounds[1], extent[3]), extent[1]),\n // Bottom corner should not be less then top corner in either direction\n Math.min(Math.max(bounds[2], extent[0]), extent[2]),\n Math.min(Math.max(bounds[3], extent[1]), extent[3])\n ];\n }\n return [\n Math.max(bounds[0], extent[0]),\n Math.max(bounds[1], extent[1]),\n Math.min(bounds[2], extent[2]),\n Math.min(bounds[3], extent[3])\n ];\n}\n\nfunction getIndexingCoords(bbox, scale, modelMatrixInverse) {\n if (modelMatrixInverse) {\n const transformedTileIndex = transformBox(bbox, modelMatrixInverse).map(\n i => (i * scale) / TILE_SIZE\n );\n return transformedTileIndex;\n }\n return bbox.map(i => (i * scale) / TILE_SIZE);\n}\n\nfunction getScale(z, tileSize) {\n return (Math.pow(2, z) * TILE_SIZE) / tileSize;\n}\n\n// https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames#Lon..2Flat._to_tile_numbers_2\nexport function osmTile2lngLat(x, y, z) {\n const scale = getScale(z, TILE_SIZE);\n const lng = (x / scale) * 360 - 180;\n const n = Math.PI - (2 * Math.PI * y) / scale;\n const lat = (180 / Math.PI) * Math.atan(0.5 * (Math.exp(n) - Math.exp(-n)));\n return [lng, lat];\n}\n\nfunction tile2XY(x, y, z, tileSize) {\n const scale = getScale(z, tileSize);\n return [(x / scale) * TILE_SIZE, (y / scale) * TILE_SIZE];\n}\nexport function tileToBoundingBox(viewport, x, y, z, tileSize = TILE_SIZE) {\n if (viewport.isGeospatial) {\n const [west, north] = osmTile2lngLat(x, y, z);\n const [east, south] = osmTile2lngLat(x + 1, y + 1, z);\n return {west, north, east, south};\n }\n const [left, top] = tile2XY(x, y, z, tileSize);\n const [right, bottom] = tile2XY(x + 1, y + 1, z, tileSize);\n return {left, top, right, bottom};\n}\n\nfunction getIdentityTileIndices(viewport, z, tileSize, extent, modelMatrixInverse) {\n const bbox = getBoundingBox(viewport, null, extent);\n const scale = getScale(z, tileSize);\n const [minX, minY, maxX, maxY] = getIndexingCoords(bbox, scale, modelMatrixInverse);\n const indices = [];\n\n /*\n | TILE | TILE | TILE |\n |(minX) |(maxX)\n */\n for (let x = Math.floor(minX); x < maxX; x++) {\n for (let y = Math.floor(minY); y < maxY; y++) {\n indices.push({x, y, z});\n }\n }\n return indices;\n}\n\n/**\n * Returns all tile indices in the current viewport. If the current zoom level is smaller\n * than minZoom, return an empty array. If the current zoom level is greater than maxZoom,\n * return tiles that are on maxZoom.\n */\n// eslint-disable-next-line complexity\nexport function getTileIndices({\n viewport,\n maxZoom,\n minZoom,\n zRange,\n extent,\n tileSize = TILE_SIZE,\n modelMatrix,\n modelMatrixInverse,\n zoomOffset = 0\n}) {\n let z = viewport.isGeospatial\n ? Math.round(viewport.zoom + Math.log2(TILE_SIZE / tileSize)) + zoomOffset\n : Math.ceil(viewport.zoom) + zoomOffset;\n if (Number.isFinite(minZoom) && z < minZoom) {\n if (!extent) {\n return [];\n }\n z = minZoom;\n }\n if (Number.isFinite(maxZoom) && z > maxZoom) {\n z = maxZoom;\n }\n let transformedExtent = extent;\n if (modelMatrix && modelMatrixInverse && extent && !viewport.isGeospatial) {\n transformedExtent = transformBox(extent, modelMatrix);\n }\n return viewport.isGeospatial\n ? getOSMTileIndices(viewport, z, zRange, extent)\n : getIdentityTileIndices(\n viewport,\n z,\n tileSize,\n transformedExtent || DEFAULT_EXTENT,\n modelMatrixInverse\n );\n}\n\n/**\n * Returns true if s is a valid URL template\n */\nexport function isURLTemplate(s) {\n return /(?=.*{z})(?=.*{x})(?=.*({y}|{-y}))/.test(s);\n}\n"],"file":"utils.js"}
1
+ {"version":3,"sources":["../../../src/tile-layer/utils.ts"],"names":["getOSMTileIndices","TILE_SIZE","DEFAULT_EXTENT","Infinity","urlType","type","value","validate","propType","optional","Array","isArray","every","url","equals","value1","value2","len","length","i","transformBox","bbox","modelMatrix","transformedCoords","transformAsPoint","transformedBox","Math","min","map","max","stringHash","s","abs","split","reduce","a","b","charCodeAt","getURLFromTemplate","template","tile","index","id","key","Object","keys","regex","RegExp","replace","String","Number","isInteger","y","z","pow","getBoundingBox","viewport","zRange","extent","bounds","minZ","maxZ","bounds0","getBounds","bounds1","isGeospatial","getIndexingCoords","scale","modelMatrixInverse","transformedTileIndex","getScale","tileSize","osmTile2lngLat","x","lng","n","PI","lat","atan","exp","tile2XY","tileToBoundingBox","west","north","east","south","left","top","right","bottom","getIdentityTileIndices","minX","minY","maxX","maxY","indices","floor","push","getTileIndices","maxZoom","minZoom","zoomOffset","round","zoom","log2","ceil","isFinite","transformedExtent","isURLTemplate","test"],"mappings":"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","sourcesContent":["import {Viewport} from '@deck.gl/core';\nimport {Matrix4} from '@math.gl/core';\nimport Tile2DHeader from './tile-2d-header';\nimport {getOSMTileIndices} from './tile-2d-traversal';\nimport {Bounds, TileBoundingBox, TileIndex, ZRange} from './types';\n\nconst TILE_SIZE = 512;\nconst DEFAULT_EXTENT: Bounds = [-Infinity, -Infinity, Infinity, Infinity];\n\nexport const urlType = {\n type: 'url',\n value: null,\n validate: (value, propType) =>\n (propType.optional && value === null) ||\n typeof value === 'string' ||\n (Array.isArray(value) && value.every(url => typeof url === 'string')),\n equals: (value1, value2) => {\n if (value1 === value2) {\n return true;\n }\n if (!Array.isArray(value1) || !Array.isArray(value2)) {\n return false;\n }\n const len = value1.length;\n if (len !== value2.length) {\n return false;\n }\n for (let i = 0; i < len; i++) {\n if (value1[i] !== value2[i]) {\n return false;\n }\n }\n return true;\n }\n};\n\nfunction transformBox(bbox: Bounds, modelMatrix: Matrix4): Bounds {\n const transformedCoords = [\n // top-left\n modelMatrix.transformAsPoint([bbox[0], bbox[1]]),\n // top-right\n modelMatrix.transformAsPoint([bbox[2], bbox[1]]),\n // bottom-left\n modelMatrix.transformAsPoint([bbox[0], bbox[3]]),\n // bottom-right\n modelMatrix.transformAsPoint([bbox[2], bbox[3]])\n ];\n const transformedBox: Bounds = [\n // Minimum x coord\n Math.min(...transformedCoords.map(i => i[0])),\n // Minimum y coord\n Math.min(...transformedCoords.map(i => i[1])),\n // Max x coord\n Math.max(...transformedCoords.map(i => i[0])),\n // Max y coord\n Math.max(...transformedCoords.map(i => i[1]))\n ];\n return transformedBox;\n}\n\nfunction stringHash(s: string): number {\n return Math.abs(s.split('').reduce((a, b) => ((a << 5) - a + b.charCodeAt(0)) | 0, 0));\n}\n\nexport function getURLFromTemplate(template: string | string[], tile: Tile2DHeader): string | null {\n if (!template || !template.length) {\n return null;\n }\n const {index, id} = tile;\n\n if (Array.isArray(template)) {\n const i = stringHash(id) % template.length;\n template = template[i];\n }\n\n let url = template;\n for (const key of Object.keys(index)) {\n const regex = new RegExp(`{${key}}`, 'g');\n url = url.replace(regex, String(index[key]));\n }\n\n // Back-compatible support for {-y}\n if (Number.isInteger(index.y) && Number.isInteger(index.z)) {\n url = url.replace(/\\{-y\\}/g, String(Math.pow(2, index.z) - index.y - 1));\n }\n return url;\n}\n\n/**\n * gets the bounding box of a viewport\n */\nfunction getBoundingBox(viewport: Viewport, zRange: number[] | null, extent: Bounds): Bounds {\n let bounds;\n if (zRange && zRange.length === 2) {\n const [minZ, maxZ] = zRange;\n const bounds0 = viewport.getBounds({z: minZ});\n const bounds1 = viewport.getBounds({z: maxZ});\n bounds = [\n Math.min(bounds0[0], bounds1[0]),\n Math.min(bounds0[1], bounds1[1]),\n Math.max(bounds0[2], bounds1[2]),\n Math.max(bounds0[3], bounds1[3])\n ];\n } else {\n bounds = viewport.getBounds();\n }\n if (!viewport.isGeospatial) {\n return [\n // Top corner should not be more then bottom corner in either direction\n Math.max(Math.min(bounds[0], extent[2]), extent[0]),\n Math.max(Math.min(bounds[1], extent[3]), extent[1]),\n // Bottom corner should not be less then top corner in either direction\n Math.min(Math.max(bounds[2], extent[0]), extent[2]),\n Math.min(Math.max(bounds[3], extent[1]), extent[3])\n ];\n }\n return [\n Math.max(bounds[0], extent[0]),\n Math.max(bounds[1], extent[1]),\n Math.min(bounds[2], extent[2]),\n Math.min(bounds[3], extent[3])\n ];\n}\n\nfunction getIndexingCoords(bbox: Bounds, scale: number, modelMatrixInverse?: Matrix4): Bounds {\n if (modelMatrixInverse) {\n const transformedTileIndex = transformBox(bbox, modelMatrixInverse).map(\n i => (i * scale) / TILE_SIZE\n );\n return transformedTileIndex as Bounds;\n }\n return bbox.map(i => (i * scale) / TILE_SIZE) as Bounds;\n}\n\nfunction getScale(z: number, tileSize: number): number {\n return (Math.pow(2, z) * TILE_SIZE) / tileSize;\n}\n\n// https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames#Lon..2Flat._to_tile_numbers_2\nexport function osmTile2lngLat(x: number, y: number, z: number): [number, number] {\n const scale = getScale(z, TILE_SIZE);\n const lng = (x / scale) * 360 - 180;\n const n = Math.PI - (2 * Math.PI * y) / scale;\n const lat = (180 / Math.PI) * Math.atan(0.5 * (Math.exp(n) - Math.exp(-n)));\n return [lng, lat];\n}\n\nfunction tile2XY(x: number, y: number, z: number, tileSize: number): [number, number] {\n const scale = getScale(z, tileSize);\n return [(x / scale) * TILE_SIZE, (y / scale) * TILE_SIZE];\n}\nexport function tileToBoundingBox(\n viewport: Viewport,\n x: number,\n y: number,\n z: number,\n tileSize: number = TILE_SIZE\n): TileBoundingBox {\n if (viewport.isGeospatial) {\n const [west, north] = osmTile2lngLat(x, y, z);\n const [east, south] = osmTile2lngLat(x + 1, y + 1, z);\n return {west, north, east, south};\n }\n const [left, top] = tile2XY(x, y, z, tileSize);\n const [right, bottom] = tile2XY(x + 1, y + 1, z, tileSize);\n return {left, top, right, bottom};\n}\n\nfunction getIdentityTileIndices(\n viewport: Viewport,\n z: number,\n tileSize: number,\n extent: Bounds,\n modelMatrixInverse?: Matrix4\n) {\n const bbox = getBoundingBox(viewport, null, extent);\n const scale = getScale(z, tileSize);\n const [minX, minY, maxX, maxY] = getIndexingCoords(bbox, scale, modelMatrixInverse);\n const indices: TileIndex[] = [];\n\n /*\n | TILE | TILE | TILE |\n |(minX) |(maxX)\n */\n for (let x = Math.floor(minX); x < maxX; x++) {\n for (let y = Math.floor(minY); y < maxY; y++) {\n indices.push({x, y, z});\n }\n }\n return indices;\n}\n\n/**\n * Returns all tile indices in the current viewport. If the current zoom level is smaller\n * than minZoom, return an empty array. If the current zoom level is greater than maxZoom,\n * return tiles that are on maxZoom.\n */\n// eslint-disable-next-line complexity\nexport function getTileIndices({\n viewport,\n maxZoom,\n minZoom,\n zRange,\n extent,\n tileSize = TILE_SIZE,\n modelMatrix,\n modelMatrixInverse,\n zoomOffset = 0\n}: {\n viewport: Viewport;\n maxZoom?: number;\n minZoom?: number;\n zRange: ZRange | undefined;\n extent?: Bounds;\n tileSize?: number;\n modelMatrix?: Matrix4;\n modelMatrixInverse?: Matrix4;\n zoomOffset?: number;\n}) {\n let z = viewport.isGeospatial\n ? Math.round(viewport.zoom + Math.log2(TILE_SIZE / tileSize)) + zoomOffset\n : Math.ceil(viewport.zoom) + zoomOffset;\n if (typeof minZoom === 'number' && Number.isFinite(minZoom) && z < minZoom) {\n if (!extent) {\n return [];\n }\n z = minZoom;\n }\n if (typeof maxZoom === 'number' && Number.isFinite(maxZoom) && z > maxZoom) {\n z = maxZoom;\n }\n let transformedExtent = extent;\n if (modelMatrix && modelMatrixInverse && extent && !viewport.isGeospatial) {\n transformedExtent = transformBox(extent, modelMatrix);\n }\n return viewport.isGeospatial\n ? getOSMTileIndices(viewport, z, zRange, extent)\n : getIdentityTileIndices(\n viewport,\n z,\n tileSize,\n transformedExtent || DEFAULT_EXTENT,\n modelMatrixInverse\n );\n}\n\n/**\n * Returns true if s is a valid URL template\n */\nexport function isURLTemplate(s: string): boolean {\n return /(?=.*{z})(?=.*{x})(?=.*({y}|{-y}))/.test(s);\n}\n"],"file":"utils.js"}