@deck.gl/geo-layers 8.8.23 → 8.8.24

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 (55) hide show
  1. package/dist/dist.dev.js +1661 -1648
  2. package/dist/es5/tile-layer/tileset-2d.js +122 -102
  3. package/dist/es5/tile-layer/tileset-2d.js.map +1 -1
  4. package/dist/es5/tile-layer/utils.js +15 -16
  5. package/dist/es5/tile-layer/utils.js.map +1 -1
  6. package/dist/esm/tile-layer/tileset-2d.js +17 -6
  7. package/dist/esm/tile-layer/tileset-2d.js.map +1 -1
  8. package/dist/esm/tile-layer/utils.js +14 -18
  9. package/dist/esm/tile-layer/utils.js.map +1 -1
  10. package/dist.min.js +1 -1
  11. package/package.json +2 -2
  12. package/src/tile-layer/tileset-2d.ts +15 -7
  13. package/src/tile-layer/utils.ts +20 -8
  14. package/typed/geo-cell-layer/GeoCellLayer.js +49 -0
  15. package/typed/great-circle-layer/great-circle-layer.js +29 -0
  16. package/typed/h3-layers/h3-cluster-layer.js +33 -0
  17. package/typed/h3-layers/h3-hexagon-layer.js +251 -0
  18. package/typed/index.js +33 -0
  19. package/typed/mesh-layer/mesh-layer-fragment.glsl.js +55 -0
  20. package/typed/mesh-layer/mesh-layer-vertex.glsl.js +80 -0
  21. package/typed/mesh-layer/mesh-layer.js +110 -0
  22. package/typed/mvt-layer/coordinate-transform.js +41 -0
  23. package/typed/mvt-layer/find-index-binary.js +96 -0
  24. package/typed/mvt-layer/mvt-layer.js +297 -0
  25. package/typed/quadkey-layer/quadkey-layer.js +18 -0
  26. package/typed/quadkey-layer/quadkey-utils.js +26 -0
  27. package/typed/s2-layer/s2-geometry.js +123 -0
  28. package/typed/s2-layer/s2-layer.js +37 -0
  29. package/typed/s2-layer/s2-utils.js +88 -0
  30. package/typed/terrain-layer/terrain-layer.js +226 -0
  31. package/typed/tile-3d-layer/tile-3d-layer.js +294 -0
  32. package/typed/tile-layer/tile-2d-header.js +113 -0
  33. package/typed/tile-layer/tile-2d-traversal.js +181 -0
  34. package/typed/tile-layer/tile-layer.js +192 -0
  35. package/typed/tile-layer/tileset-2d.d.ts.map +1 -1
  36. package/typed/tile-layer/tileset-2d.js +399 -0
  37. package/typed/tile-layer/types.js +1 -0
  38. package/typed/tile-layer/utils.d.ts +1 -1
  39. package/typed/tile-layer/utils.d.ts.map +1 -1
  40. package/typed/tile-layer/utils.js +197 -0
  41. package/typed/tileset-2d/index.d.ts +6 -0
  42. package/typed/tileset-2d/index.d.ts.map +1 -0
  43. package/typed/tileset-2d/memoize.d.ts +7 -0
  44. package/typed/tileset-2d/memoize.d.ts.map +1 -0
  45. package/typed/tileset-2d/tile-2d-header.d.ts +39 -0
  46. package/typed/tileset-2d/tile-2d-header.d.ts.map +1 -0
  47. package/typed/tileset-2d/tile-2d-traversal.d.ts +4 -0
  48. package/typed/tileset-2d/tile-2d-traversal.d.ts.map +1 -0
  49. package/typed/tileset-2d/tileset-2d.d.ts +121 -0
  50. package/typed/tileset-2d/tileset-2d.d.ts.map +1 -0
  51. package/typed/tileset-2d/types.d.ts +30 -0
  52. package/typed/tileset-2d/types.d.ts.map +1 -0
  53. package/typed/tileset-2d/utils.d.ts +51 -0
  54. package/typed/tileset-2d/utils.d.ts.map +1 -0
  55. package/typed/trips-layer/trips-layer.js +92 -0
@@ -242,26 +242,46 @@ var Tileset2D = function () {
242
242
  }
243
243
 
244
244
  if (cullRect && this._viewport) {
245
- var _getCullBounds = (0, _utils.getCullBounds)({
245
+ var boundsArr = this._getCullBounds({
246
246
  viewport: this._viewport,
247
247
  z: this._zRange,
248
248
  cullRect: cullRect
249
- }),
250
- _getCullBounds2 = (0, _slicedToArray2.default)(_getCullBounds, 4),
251
- minX = _getCullBounds2[0],
252
- minY = _getCullBounds2[1],
253
- maxX = _getCullBounds2[2],
254
- maxY = _getCullBounds2[3];
249
+ });
255
250
 
256
251
  var bbox = tile.bbox;
257
252
 
258
- if ('west' in bbox) {
259
- return bbox.west < maxX && bbox.east > minX && bbox.south < maxY && bbox.north > minY;
253
+ var _iterator3 = _createForOfIteratorHelper(boundsArr),
254
+ _step3;
255
+
256
+ try {
257
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
258
+ var _step3$value = (0, _slicedToArray2.default)(_step3.value, 4),
259
+ minX = _step3$value[0],
260
+ minY = _step3$value[1],
261
+ maxX = _step3$value[2],
262
+ maxY = _step3$value[3];
263
+
264
+ var overlaps = void 0;
265
+
266
+ if ('west' in bbox) {
267
+ overlaps = bbox.west < maxX && bbox.east > minX && bbox.south < maxY && bbox.north > minY;
268
+ } else {
269
+ var y0 = Math.min(bbox.top, bbox.bottom);
270
+ var y1 = Math.max(bbox.top, bbox.bottom);
271
+ overlaps = bbox.left < maxX && bbox.right > minX && y0 < maxY && y1 > minY;
272
+ }
273
+
274
+ if (overlaps) {
275
+ return true;
276
+ }
277
+ }
278
+ } catch (err) {
279
+ _iterator3.e(err);
280
+ } finally {
281
+ _iterator3.f();
260
282
  }
261
283
 
262
- var y0 = Math.min(bbox.top, bbox.bottom);
263
- var y1 = Math.max(bbox.top, bbox.bottom);
264
- return bbox.left < maxX && bbox.right > minX && y0 < maxY && y1 > minY;
284
+ return false;
265
285
  }
266
286
 
267
287
  return true;
@@ -328,55 +348,55 @@ var Tileset2D = function () {
328
348
  var visibilities = new Array(this._cache.size);
329
349
  var i = 0;
330
350
 
331
- var _iterator3 = _createForOfIteratorHelper(this._cache.values()),
332
- _step3;
351
+ var _iterator4 = _createForOfIteratorHelper(this._cache.values()),
352
+ _step4;
333
353
 
334
354
  try {
335
- for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
336
- var _tile3 = _step3.value;
355
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
356
+ var _tile3 = _step4.value;
337
357
  visibilities[i++] = _tile3.isVisible;
338
358
  _tile3.isSelected = false;
339
359
  _tile3.isVisible = false;
340
360
  }
341
361
  } catch (err) {
342
- _iterator3.e(err);
362
+ _iterator4.e(err);
343
363
  } finally {
344
- _iterator3.f();
364
+ _iterator4.f();
345
365
  }
346
366
 
347
- var _iterator4 = _createForOfIteratorHelper(this._selectedTiles),
348
- _step4;
367
+ var _iterator5 = _createForOfIteratorHelper(this._selectedTiles),
368
+ _step5;
349
369
 
350
370
  try {
351
- for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
352
- var _tile4 = _step4.value;
371
+ for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
372
+ var _tile4 = _step5.value;
353
373
  _tile4.isSelected = true;
354
374
  _tile4.isVisible = true;
355
375
  }
356
376
  } catch (err) {
357
- _iterator4.e(err);
377
+ _iterator5.e(err);
358
378
  } finally {
359
- _iterator4.f();
379
+ _iterator5.f();
360
380
  }
361
381
 
362
382
  (typeof refinementStrategy === 'function' ? refinementStrategy : STRATEGIES[refinementStrategy])(Array.from(this._cache.values()));
363
383
  i = 0;
364
384
 
365
- var _iterator5 = _createForOfIteratorHelper(this._cache.values()),
366
- _step5;
385
+ var _iterator6 = _createForOfIteratorHelper(this._cache.values()),
386
+ _step6;
367
387
 
368
388
  try {
369
- for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
370
- var _tile5 = _step5.value;
389
+ for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
390
+ var _tile5 = _step6.value;
371
391
 
372
392
  if (visibilities[i++] !== _tile5.isVisible) {
373
393
  return true;
374
394
  }
375
395
  }
376
396
  } catch (err) {
377
- _iterator5.e(err);
397
+ _iterator6.e(err);
378
398
  } finally {
379
- _iterator5.f();
399
+ _iterator6.f();
380
400
  }
381
401
 
382
402
  return false;
@@ -388,12 +408,12 @@ var Tileset2D = function () {
388
408
  var abortCandidates = [];
389
409
  var ongoingRequestCount = 0;
390
410
 
391
- var _iterator6 = _createForOfIteratorHelper(this._cache.values()),
392
- _step6;
411
+ var _iterator7 = _createForOfIteratorHelper(this._cache.values()),
412
+ _step7;
393
413
 
394
414
  try {
395
- for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
396
- var _tile7 = _step6.value;
415
+ for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {
416
+ var _tile7 = _step7.value;
397
417
 
398
418
  if (_tile7.isLoading) {
399
419
  ongoingRequestCount++;
@@ -404,9 +424,9 @@ var Tileset2D = function () {
404
424
  }
405
425
  }
406
426
  } catch (err) {
407
- _iterator6.e(err);
427
+ _iterator7.e(err);
408
428
  } finally {
409
- _iterator6.f();
429
+ _iterator7.f();
410
430
  }
411
431
 
412
432
  while (maxRequests > 0 && ongoingRequestCount > maxRequests && abortCandidates.length > 0) {
@@ -422,12 +442,12 @@ var Tileset2D = function () {
422
442
  value: function _rebuildTree() {
423
443
  var _cache = this._cache;
424
444
 
425
- var _iterator7 = _createForOfIteratorHelper(_cache.values()),
426
- _step7;
445
+ var _iterator8 = _createForOfIteratorHelper(_cache.values()),
446
+ _step8;
427
447
 
428
448
  try {
429
- for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {
430
- var _tile8 = _step7.value;
449
+ for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) {
450
+ var _tile8 = _step8.value;
431
451
  _tile8.parent = null;
432
452
 
433
453
  if (_tile8.children) {
@@ -435,17 +455,17 @@ var Tileset2D = function () {
435
455
  }
436
456
  }
437
457
  } catch (err) {
438
- _iterator7.e(err);
458
+ _iterator8.e(err);
439
459
  } finally {
440
- _iterator7.f();
460
+ _iterator8.f();
441
461
  }
442
462
 
443
- var _iterator8 = _createForOfIteratorHelper(_cache.values()),
444
- _step8;
463
+ var _iterator9 = _createForOfIteratorHelper(_cache.values()),
464
+ _step9;
445
465
 
446
466
  try {
447
- for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) {
448
- var _tile9 = _step8.value;
467
+ for (_iterator9.s(); !(_step9 = _iterator9.n()).done;) {
468
+ var _tile9 = _step9.value;
449
469
 
450
470
  var parent = this._getNearestAncestor(_tile9);
451
471
 
@@ -456,9 +476,9 @@ var Tileset2D = function () {
456
476
  }
457
477
  }
458
478
  } catch (err) {
459
- _iterator8.e(err);
479
+ _iterator9.e(err);
460
480
  } finally {
461
- _iterator8.f();
481
+ _iterator9.f();
462
482
  }
463
483
  }
464
484
  }, {
@@ -471,14 +491,14 @@ var Tileset2D = function () {
471
491
  var overflown = _cache.size > maxCacheSize || this._cacheByteSize > maxCacheByteSize;
472
492
 
473
493
  if (overflown) {
474
- var _iterator9 = _createForOfIteratorHelper(_cache),
475
- _step9;
494
+ var _iterator10 = _createForOfIteratorHelper(_cache),
495
+ _step10;
476
496
 
477
497
  try {
478
- for (_iterator9.s(); !(_step9 = _iterator9.n()).done;) {
479
- var _step9$value = (0, _slicedToArray2.default)(_step9.value, 2),
480
- id = _step9$value[0],
481
- _tile10 = _step9$value[1];
498
+ for (_iterator10.s(); !(_step10 = _iterator10.n()).done;) {
499
+ var _step10$value = (0, _slicedToArray2.default)(_step10.value, 2),
500
+ id = _step10$value[0],
501
+ _tile10 = _step10$value[1];
482
502
 
483
503
  if (!_tile10.isVisible && !_tile10.isSelected) {
484
504
  this._cacheByteSize -= opts.maxCacheByteSize ? _tile10.byteLength : 0;
@@ -493,9 +513,9 @@ var Tileset2D = function () {
493
513
  }
494
514
  }
495
515
  } catch (err) {
496
- _iterator9.e(err);
516
+ _iterator10.e(err);
497
517
  } finally {
498
- _iterator9.f();
518
+ _iterator10.f();
499
519
  }
500
520
 
501
521
  this._rebuildTree();
@@ -573,30 +593,13 @@ var Tileset2D = function () {
573
593
  exports.default = Tileset2D;
574
594
 
575
595
  function updateTileStateDefault(allTiles) {
576
- var _iterator10 = _createForOfIteratorHelper(allTiles),
577
- _step10;
578
-
579
- try {
580
- for (_iterator10.s(); !(_step10 = _iterator10.n()).done;) {
581
- var _tile11 = _step10.value;
582
- _tile11.state = 0;
583
- }
584
- } catch (err) {
585
- _iterator10.e(err);
586
- } finally {
587
- _iterator10.f();
588
- }
589
-
590
596
  var _iterator11 = _createForOfIteratorHelper(allTiles),
591
597
  _step11;
592
598
 
593
599
  try {
594
600
  for (_iterator11.s(); !(_step11 = _iterator11.n()).done;) {
595
- var _tile12 = _step11.value;
596
-
597
- if (_tile12.isSelected && !getPlaceholderInAncestors(_tile12)) {
598
- getPlaceholderInChildren(_tile12);
599
- }
601
+ var _tile11 = _step11.value;
602
+ _tile11.state = 0;
600
603
  }
601
604
  } catch (err) {
602
605
  _iterator11.e(err);
@@ -609,82 +612,99 @@ function updateTileStateDefault(allTiles) {
609
612
 
610
613
  try {
611
614
  for (_iterator12.s(); !(_step12 = _iterator12.n()).done;) {
612
- var _tile13 = _step12.value;
613
- _tile13.isVisible = Boolean(_tile13.state & TILE_STATE_VISIBLE);
615
+ var _tile12 = _step12.value;
616
+
617
+ if (_tile12.isSelected && !getPlaceholderInAncestors(_tile12)) {
618
+ getPlaceholderInChildren(_tile12);
619
+ }
614
620
  }
615
621
  } catch (err) {
616
622
  _iterator12.e(err);
617
623
  } finally {
618
624
  _iterator12.f();
619
625
  }
620
- }
621
626
 
622
- function updateTileStateReplace(allTiles) {
623
627
  var _iterator13 = _createForOfIteratorHelper(allTiles),
624
628
  _step13;
625
629
 
626
630
  try {
627
631
  for (_iterator13.s(); !(_step13 = _iterator13.n()).done;) {
628
- var _tile14 = _step13.value;
629
- _tile14.state = 0;
632
+ var _tile13 = _step13.value;
633
+ _tile13.isVisible = Boolean(_tile13.state & TILE_STATE_VISIBLE);
630
634
  }
631
635
  } catch (err) {
632
636
  _iterator13.e(err);
633
637
  } finally {
634
638
  _iterator13.f();
635
639
  }
640
+ }
636
641
 
642
+ function updateTileStateReplace(allTiles) {
637
643
  var _iterator14 = _createForOfIteratorHelper(allTiles),
638
644
  _step14;
639
645
 
640
646
  try {
641
647
  for (_iterator14.s(); !(_step14 = _iterator14.n()).done;) {
642
- var _tile15 = _step14.value;
648
+ var _tile14 = _step14.value;
649
+ _tile14.state = 0;
650
+ }
651
+ } catch (err) {
652
+ _iterator14.e(err);
653
+ } finally {
654
+ _iterator14.f();
655
+ }
656
+
657
+ var _iterator15 = _createForOfIteratorHelper(allTiles),
658
+ _step15;
659
+
660
+ try {
661
+ for (_iterator15.s(); !(_step15 = _iterator15.n()).done;) {
662
+ var _tile15 = _step15.value;
643
663
 
644
664
  if (_tile15.isSelected) {
645
665
  getPlaceholderInAncestors(_tile15);
646
666
  }
647
667
  }
648
668
  } catch (err) {
649
- _iterator14.e(err);
669
+ _iterator15.e(err);
650
670
  } finally {
651
- _iterator14.f();
671
+ _iterator15.f();
652
672
  }
653
673
 
654
674
  var sortedTiles = Array.from(allTiles).sort(function (t1, t2) {
655
675
  return t1.zoom - t2.zoom;
656
676
  });
657
677
 
658
- var _iterator15 = _createForOfIteratorHelper(sortedTiles),
659
- _step15;
678
+ var _iterator16 = _createForOfIteratorHelper(sortedTiles),
679
+ _step16;
660
680
 
661
681
  try {
662
- for (_iterator15.s(); !(_step15 = _iterator15.n()).done;) {
663
- var _tile16 = _step15.value;
682
+ for (_iterator16.s(); !(_step16 = _iterator16.n()).done;) {
683
+ var _tile16 = _step16.value;
664
684
  _tile16.isVisible = Boolean(_tile16.state & TILE_STATE_VISIBLE);
665
685
 
666
686
  if (_tile16.children && (_tile16.isVisible || _tile16.state & TILE_STATE_VISITED)) {
667
- var _iterator16 = _createForOfIteratorHelper(_tile16.children),
668
- _step16;
687
+ var _iterator17 = _createForOfIteratorHelper(_tile16.children),
688
+ _step17;
669
689
 
670
690
  try {
671
- for (_iterator16.s(); !(_step16 = _iterator16.n()).done;) {
672
- var child = _step16.value;
691
+ for (_iterator17.s(); !(_step17 = _iterator17.n()).done;) {
692
+ var child = _step17.value;
673
693
  child.state = TILE_STATE_VISITED;
674
694
  }
675
695
  } catch (err) {
676
- _iterator16.e(err);
696
+ _iterator17.e(err);
677
697
  } finally {
678
- _iterator16.f();
698
+ _iterator17.f();
679
699
  }
680
700
  } else if (_tile16.isSelected) {
681
701
  getPlaceholderInChildren(_tile16);
682
702
  }
683
703
  }
684
704
  } catch (err) {
685
- _iterator15.e(err);
705
+ _iterator16.e(err);
686
706
  } finally {
687
- _iterator15.f();
707
+ _iterator16.f();
688
708
  }
689
709
  }
690
710
 
@@ -704,12 +724,12 @@ function getPlaceholderInAncestors(startTile) {
704
724
  }
705
725
 
706
726
  function getPlaceholderInChildren(tile) {
707
- var _iterator17 = _createForOfIteratorHelper(tile.children),
708
- _step17;
727
+ var _iterator18 = _createForOfIteratorHelper(tile.children),
728
+ _step18;
709
729
 
710
730
  try {
711
- for (_iterator17.s(); !(_step17 = _iterator17.n()).done;) {
712
- var child = _step17.value;
731
+ for (_iterator18.s(); !(_step18 = _iterator18.n()).done;) {
732
+ var child = _step18.value;
713
733
 
714
734
  if (child.isLoaded || child.content) {
715
735
  child.state |= TILE_STATE_VISIBLE;
@@ -718,9 +738,9 @@ function getPlaceholderInChildren(tile) {
718
738
  }
719
739
  }
720
740
  } catch (err) {
721
- _iterator17.e(err);
741
+ _iterator18.e(err);
722
742
  } finally {
723
- _iterator17.f();
743
+ _iterator18.f();
724
744
  }
725
745
  }
726
746
  //# sourceMappingURL=tileset-2d.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/tile-layer/tileset-2d.ts"],"names":["TILE_STATE_VISITED","TILE_STATE_VISIBLE","STRATEGY_NEVER","STRATEGY_REPLACE","STRATEGY_DEFAULT","DEFAULT_CACHE_SCALE","STRATEGIES","updateTileStateDefault","updateTileStateReplace","Tileset2D","opts","getCullBounds","onTileLoad","tile","maxCacheByteSize","_cacheByteSize","byteLength","_resizeCache","_requestScheduler","RequestScheduler","maxRequests","throttleRequests","_cache","Map","_tiles","_dirty","_viewport","_selectedTiles","_frameNumber","_modelMatrix","Matrix4","_modelMatrixInverse","setOptions","every","isLoaded","some","needsReload","Object","assign","Number","isFinite","maxZoom","_maxZoom","Math","floor","minZoom","_minZoom","ceil","values","isLoading","abort","clear","keys","id","get","includes","delete","setNeedsReload","viewport","zRange","modelMatrix","modelMatrixAsMatrix4","isModelMatrixNew","equals","_zRange","clone","invert","tileIndices","getTileIndices","modelMatrixInverse","map","index","_getTile","_rebuildTree","changed","updateTileStates","_pruneRequests","cullRect","isVisible","z","minX","minY","maxX","maxY","bbox","west","east","south","north","y0","min","top","bottom","y1","max","left","right","tileSize","extent","zoomOffset","x","y","refinementStrategy","visibilities","Array","size","i","isSelected","from","abortCandidates","ongoingRequestCount","push","length","shift","parent","children","_getNearestAncestor","maxCacheSize","Infinity","selectedTiles","overflown","onTileUnload","sort","t1","t2","zoom","create","getTileId","Tile2DHeader","getTileMetadata","getTileZoom","set","loadData","getData","getTileData","requestScheduler","onLoad","onError","onTileError","getParentIndex","allTiles","state","getPlaceholderInAncestors","getPlaceholderInChildren","Boolean","sortedTiles","child","startTile","content"],"mappings":"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","sourcesContent":["import Tile2DHeader from './tile-2d-header';\nimport {getTileIndices, tileToBoundingBox, getCullBounds} from './utils';\nimport {RequestScheduler} from '@loaders.gl/loader-utils';\nimport {Matrix4, equals} from '@math.gl/core';\nimport {Viewport} from '@deck.gl/core';\nimport {Bounds, TileIndex, ZRange} from './types';\nimport {TileLayerProps} from './tile-layer';\nimport {_memoize as memoize} from '@deck.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\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 Required<TileLayerProps>,\n | 'tileSize'\n | 'maxCacheSize'\n | 'maxCacheByteSize'\n | 'refinementStrategy'\n | 'extent'\n | 'maxZoom'\n | 'minZoom'\n | 'maxRequests'\n | 'zoomOffset'\n> & {\n getTileData: NonNullable<TileLayerProps['getTileData']>;\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 _zRange?: ZRange;\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 as number);\n }\n if (Number.isFinite(opts.minZoom)) {\n this._minZoom = Math.ceil(opts.minZoom as number);\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 (\n !this._viewport ||\n !viewport.equals(this._viewport) ||\n !equals(this._zRange, zRange) ||\n isModelMatrixNew\n ) {\n if (isModelMatrixNew) {\n this._modelMatrixInverse = modelMatrixAsMatrix4.clone().invert();\n this._modelMatrix = modelMatrixAsMatrix4;\n }\n this._viewport = viewport;\n this._zRange = zRange;\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, true));\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 isTileVisible(\n tile: Tile2DHeader,\n cullRect?: {x: number; y: number; width: number; height: number}\n ): boolean {\n if (!tile.isVisible) {\n return false;\n }\n\n if (cullRect && this._viewport) {\n const [minX, minY, maxX, maxY] = getCullBounds({\n viewport: this._viewport,\n z: this._zRange,\n cullRect\n });\n const {bbox} = tile;\n if ('west' in bbox) {\n return bbox.west < maxX && bbox.east > minX && bbox.south < maxY && bbox.north > minY;\n }\n // top/bottom could be swapped depending on the indexing system\n const y0 = Math.min(bbox.top, bbox.bottom);\n const y1 = Math.max(bbox.top, bbox.bottom);\n return bbox.left < maxX && bbox.right > minX && y0 < maxY && y1 > minY;\n }\n return true;\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): Record<string, any> {\n const {tileSize} = this.opts;\n // @ts-expect-error\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 private 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 // @ts-expect-error called only when _selectedTiles is already defined\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 private _getCullBounds = memoize(getCullBounds);\n\n private _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 private _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 private _resizeCache() {\n const {_cache, opts} = this;\n\n const maxCacheSize =\n opts.maxCacheSize ||\n // @ts-expect-error called only when selectedTiles is initialized\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 && !tile.isSelected) {\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 private _getTile(index: TileIndex, create: true): Tile2DHeader;\n private _getTile(index: TileIndex, create?: false): Tile2DHeader | undefined;\n private _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"}
1
+ {"version":3,"sources":["../../../src/tile-layer/tileset-2d.ts"],"names":["TILE_STATE_VISITED","TILE_STATE_VISIBLE","STRATEGY_NEVER","STRATEGY_REPLACE","STRATEGY_DEFAULT","DEFAULT_CACHE_SCALE","STRATEGIES","updateTileStateDefault","updateTileStateReplace","Tileset2D","opts","getCullBounds","onTileLoad","tile","maxCacheByteSize","_cacheByteSize","byteLength","_resizeCache","_requestScheduler","RequestScheduler","maxRequests","throttleRequests","_cache","Map","_tiles","_dirty","_viewport","_selectedTiles","_frameNumber","_modelMatrix","Matrix4","_modelMatrixInverse","setOptions","every","isLoaded","some","needsReload","Object","assign","Number","isFinite","maxZoom","_maxZoom","Math","floor","minZoom","_minZoom","ceil","values","isLoading","abort","clear","keys","id","get","includes","delete","setNeedsReload","viewport","zRange","modelMatrix","modelMatrixAsMatrix4","isModelMatrixNew","equals","_zRange","clone","invert","tileIndices","getTileIndices","modelMatrixInverse","map","index","_getTile","_rebuildTree","changed","updateTileStates","_pruneRequests","cullRect","isVisible","boundsArr","_getCullBounds","z","bbox","minX","minY","maxX","maxY","overlaps","west","east","south","north","y0","min","top","bottom","y1","max","left","right","tileSize","extent","zoomOffset","x","y","refinementStrategy","visibilities","Array","size","i","isSelected","from","abortCandidates","ongoingRequestCount","push","length","shift","parent","children","_getNearestAncestor","maxCacheSize","Infinity","selectedTiles","overflown","onTileUnload","sort","t1","t2","zoom","create","getTileId","Tile2DHeader","getTileMetadata","getTileZoom","set","loadData","getData","getTileData","requestScheduler","onLoad","onError","onTileError","getParentIndex","allTiles","state","getPlaceholderInAncestors","getPlaceholderInChildren","Boolean","sortedTiles","child","startTile","content"],"mappings":"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","sourcesContent":["import Tile2DHeader from './tile-2d-header';\nimport {getTileIndices, tileToBoundingBox, getCullBounds} from './utils';\nimport {RequestScheduler} from '@loaders.gl/loader-utils';\nimport {Matrix4, equals} from '@math.gl/core';\nimport {Viewport} from '@deck.gl/core';\nimport {Bounds, TileIndex, ZRange} from './types';\nimport {TileLayerProps} from './tile-layer';\nimport {_memoize as memoize} from '@deck.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\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 Required<TileLayerProps>,\n | 'tileSize'\n | 'maxCacheSize'\n | 'maxCacheByteSize'\n | 'refinementStrategy'\n | 'extent'\n | 'maxZoom'\n | 'minZoom'\n | 'maxRequests'\n | 'zoomOffset'\n> & {\n getTileData: NonNullable<TileLayerProps['getTileData']>;\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 _zRange?: ZRange;\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 as number);\n }\n if (Number.isFinite(opts.minZoom)) {\n this._minZoom = Math.ceil(opts.minZoom as number);\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 (\n !this._viewport ||\n !viewport.equals(this._viewport) ||\n !equals(this._zRange, zRange) ||\n isModelMatrixNew\n ) {\n if (isModelMatrixNew) {\n this._modelMatrixInverse = modelMatrixAsMatrix4.clone().invert();\n this._modelMatrix = modelMatrixAsMatrix4;\n }\n this._viewport = viewport;\n this._zRange = zRange;\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, true));\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 isTileVisible(\n tile: Tile2DHeader,\n cullRect?: {x: number; y: number; width: number; height: number}\n ): boolean {\n if (!tile.isVisible) {\n return false;\n }\n\n if (cullRect && this._viewport) {\n const boundsArr = this._getCullBounds({\n viewport: this._viewport,\n z: this._zRange,\n cullRect\n });\n const {bbox} = tile;\n for (const [minX, minY, maxX, maxY] of boundsArr) {\n let overlaps;\n if ('west' in bbox) {\n overlaps = bbox.west < maxX && bbox.east > minX && bbox.south < maxY && bbox.north > minY;\n } else {\n // top/bottom could be swapped depending on the indexing system\n const y0 = Math.min(bbox.top, bbox.bottom);\n const y1 = Math.max(bbox.top, bbox.bottom);\n overlaps = bbox.left < maxX && bbox.right > minX && y0 < maxY && y1 > minY;\n }\n if (overlaps) {\n return true;\n }\n }\n return false;\n }\n return true;\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): Record<string, any> {\n const {tileSize} = this.opts;\n // @ts-expect-error\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 private 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 // @ts-expect-error called only when _selectedTiles is already defined\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 private _getCullBounds = memoize(getCullBounds);\n\n private _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 private _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 private _resizeCache() {\n const {_cache, opts} = this;\n\n const maxCacheSize =\n opts.maxCacheSize ||\n // @ts-expect-error called only when selectedTiles is initialized\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 && !tile.isSelected) {\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 private _getTile(index: TileIndex, create: true): Tile2DHeader;\n private _getTile(index: TileIndex, create?: false): Tile2DHeader | undefined;\n private _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"}
@@ -132,16 +132,23 @@ function getBoundingBox(viewport, zRange, extent) {
132
132
 
133
133
  function getCullBounds(_ref) {
134
134
  var viewport = _ref.viewport,
135
- z = _ref.z,
135
+ _ref$z = _ref.z,
136
+ z = _ref$z === void 0 ? 0 : _ref$z,
136
137
  cullRect = _ref.cullRect;
137
- var x = cullRect.x - viewport.x;
138
- var y = cullRect.y - viewport.y;
139
- var width = cullRect.width,
140
- height = cullRect.height;
138
+ var subViewports = viewport.subViewports || [viewport];
139
+ return subViewports.map(function (v) {
140
+ return getCullBoundsInViewport(v, z, cullRect);
141
+ });
142
+ }
141
143
 
144
+ function getCullBoundsInViewport(viewport, z, cullRect) {
142
145
  if (!Array.isArray(z)) {
146
+ var x = cullRect.x - viewport.x;
147
+ var y = cullRect.y - viewport.y;
148
+ var width = cullRect.width,
149
+ height = cullRect.height;
143
150
  var unprojectOption = {
144
- targetZ: z || 0
151
+ targetZ: z
145
152
  };
146
153
  var topLeft = viewport.unproject([x, y], unprojectOption);
147
154
  var topRight = viewport.unproject([x + width, y], unprojectOption);
@@ -150,16 +157,8 @@ function getCullBounds(_ref) {
150
157
  return [Math.min(topLeft[0], topRight[0], bottomLeft[0], bottomRight[0]), Math.min(topLeft[1], topRight[1], bottomLeft[1], bottomRight[1]), Math.max(topLeft[0], topRight[0], bottomLeft[0], bottomRight[0]), Math.max(topLeft[1], topRight[1], bottomLeft[1], bottomRight[1])];
151
158
  }
152
159
 
153
- var bounds0 = getCullBounds({
154
- viewport: viewport,
155
- z: z[0],
156
- cullRect: cullRect
157
- });
158
- var bounds1 = getCullBounds({
159
- viewport: viewport,
160
- z: z[1],
161
- cullRect: cullRect
162
- });
160
+ var bounds0 = getCullBoundsInViewport(viewport, z[0], cullRect);
161
+ var bounds1 = getCullBoundsInViewport(viewport, z[1], cullRect);
163
162
  return [Math.min(bounds0[0], bounds1[0]), Math.min(bounds0[1], bounds1[1]), Math.max(bounds0[2], bounds1[2]), Math.max(bounds0[3], bounds1[3])];
164
163
  }
165
164