@deck.gl/geo-layers 9.0.0-beta.1 → 9.0.0-beta.10

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 (262) hide show
  1. package/dist/dist.dev.js +2574 -5077
  2. package/dist/geo-cell-layer/GeoCellLayer.js +51 -0
  3. package/{typed → dist}/geohash-layer/geohash-layer.d.ts +1 -1
  4. package/dist/geohash-layer/geohash-layer.d.ts.map +1 -0
  5. package/dist/geohash-layer/geohash-layer.js +19 -0
  6. package/dist/geohash-layer/geohash-utils.js +50 -0
  7. package/dist/great-circle-layer/great-circle-layer.js +12 -0
  8. package/{typed → dist}/h3-layers/h3-cluster-layer.d.ts +1 -1
  9. package/dist/h3-layers/h3-cluster-layer.d.ts.map +1 -0
  10. package/dist/h3-layers/h3-cluster-layer.js +47 -0
  11. package/dist/h3-layers/h3-hexagon-layer.js +204 -0
  12. package/dist/h3-layers/h3-utils.js +56 -0
  13. package/dist/index.cjs +3160 -0
  14. package/dist/index.cjs.map +7 -0
  15. package/dist/index.d.ts +31 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +36 -0
  18. package/dist/mesh-layer/mesh-layer-fragment.glsl.d.ts +3 -0
  19. package/{typed → dist}/mesh-layer/mesh-layer-fragment.glsl.d.ts.map +1 -1
  20. package/dist/mesh-layer/mesh-layer-fragment.glsl.js +33 -0
  21. package/dist/mesh-layer/mesh-layer-vertex.glsl.js +63 -0
  22. package/{typed → dist}/mesh-layer/mesh-layer.d.ts.map +1 -1
  23. package/dist/mesh-layer/mesh-layer.js +128 -0
  24. package/{typed → dist}/mvt-layer/coordinate-transform.d.ts +1 -1
  25. package/{typed → dist}/mvt-layer/coordinate-transform.d.ts.map +1 -1
  26. package/dist/mvt-layer/coordinate-transform.js +41 -0
  27. package/dist/mvt-layer/find-index-binary.d.ts +11 -0
  28. package/dist/mvt-layer/find-index-binary.d.ts.map +1 -0
  29. package/dist/mvt-layer/find-index-binary.js +96 -0
  30. package/{typed → dist}/mvt-layer/mvt-layer.d.ts +13 -11
  31. package/dist/mvt-layer/mvt-layer.d.ts.map +1 -0
  32. package/dist/mvt-layer/mvt-layer.js +305 -0
  33. package/{typed → dist}/quadkey-layer/quadkey-layer.d.ts +1 -1
  34. package/dist/quadkey-layer/quadkey-layer.d.ts.map +1 -0
  35. package/dist/quadkey-layer/quadkey-layer.js +22 -0
  36. package/dist/quadkey-layer/quadkey-utils.js +26 -0
  37. package/dist/s2-layer/s2-geometry.js +123 -0
  38. package/{typed → dist}/s2-layer/s2-layer.d.ts +1 -1
  39. package/dist/s2-layer/s2-layer.d.ts.map +1 -0
  40. package/dist/s2-layer/s2-layer.js +38 -0
  41. package/dist/s2-layer/s2-utils.js +87 -0
  42. package/{typed → dist}/terrain-layer/terrain-layer.d.ts +4 -4
  43. package/dist/terrain-layer/terrain-layer.d.ts.map +1 -0
  44. package/dist/terrain-layer/terrain-layer.js +233 -0
  45. package/{typed → dist}/tile-3d-layer/tile-3d-layer.d.ts +15 -1
  46. package/{typed → dist}/tile-3d-layer/tile-3d-layer.d.ts.map +1 -1
  47. package/dist/tile-3d-layer/tile-3d-layer.js +302 -0
  48. package/{typed → dist}/tile-layer/tile-layer.d.ts +14 -5
  49. package/dist/tile-layer/tile-layer.d.ts.map +1 -0
  50. package/dist/tile-layer/tile-layer.js +207 -0
  51. package/dist/tileset-2d/index.d.ts +7 -0
  52. package/dist/tileset-2d/index.d.ts.map +1 -0
  53. package/dist/tileset-2d/index.js +4 -0
  54. package/dist/tileset-2d/memoize.js +41 -0
  55. package/{typed → dist}/tileset-2d/tile-2d-header.d.ts +3 -2
  56. package/dist/tileset-2d/tile-2d-header.d.ts.map +1 -0
  57. package/dist/tileset-2d/tile-2d-header.js +135 -0
  58. package/dist/tileset-2d/tile-2d-traversal.d.ts +4 -0
  59. package/dist/tileset-2d/tile-2d-traversal.d.ts.map +1 -0
  60. package/dist/tileset-2d/tile-2d-traversal.js +182 -0
  61. package/{typed → dist}/tileset-2d/tileset-2d.d.ts +9 -7
  62. package/dist/tileset-2d/tileset-2d.d.ts.map +1 -0
  63. package/dist/tileset-2d/tileset-2d.js +458 -0
  64. package/dist/tileset-2d/types.js +1 -0
  65. package/{typed → dist}/tileset-2d/utils.d.ts +3 -3
  66. package/dist/tileset-2d/utils.d.ts.map +1 -0
  67. package/dist/tileset-2d/utils.js +234 -0
  68. package/{typed → dist}/trips-layer/trips-layer.d.ts +1 -1
  69. package/{typed → dist}/trips-layer/trips-layer.d.ts.map +1 -1
  70. package/dist/trips-layer/trips-layer.js +93 -0
  71. package/dist/wms-layer/utils.js +13 -0
  72. package/dist/wms-layer/wms-layer.js +192 -0
  73. package/dist.min.js +243 -564
  74. package/package.json +30 -23
  75. package/src/index.ts +7 -7
  76. package/src/mesh-layer/mesh-layer-fragment.glsl.ts +1 -9
  77. package/src/mesh-layer/mesh-layer.ts +1 -2
  78. package/src/mvt-layer/coordinate-transform.ts +1 -1
  79. package/src/mvt-layer/find-index-binary.ts +5 -9
  80. package/src/mvt-layer/mvt-layer.ts +36 -25
  81. package/src/terrain-layer/terrain-layer.ts +13 -3
  82. package/src/tile-layer/tile-layer.ts +30 -14
  83. package/src/tileset-2d/tile-2d-header.ts +2 -1
  84. package/src/tileset-2d/tile-2d-traversal.ts +1 -1
  85. package/src/tileset-2d/tileset-2d.ts +14 -7
  86. package/src/tileset-2d/utils.ts +2 -2
  87. package/src/trips-layer/trips-layer.ts +1 -1
  88. package/src/wms-layer/wms-layer.ts +1 -1
  89. package/dist/es5/geo-cell-layer/GeoCellLayer.js +0 -118
  90. package/dist/es5/geo-cell-layer/GeoCellLayer.js.map +0 -1
  91. package/dist/es5/geohash-layer/geohash-layer.js +0 -67
  92. package/dist/es5/geohash-layer/geohash-layer.js.map +0 -1
  93. package/dist/es5/geohash-layer/geohash-utils.js +0 -77
  94. package/dist/es5/geohash-layer/geohash-utils.js.map +0 -1
  95. package/dist/es5/great-circle-layer/great-circle-layer.js +0 -48
  96. package/dist/es5/great-circle-layer/great-circle-layer.js.map +0 -1
  97. package/dist/es5/h3-layers/h3-cluster-layer.js +0 -162
  98. package/dist/es5/h3-layers/h3-cluster-layer.js.map +0 -1
  99. package/dist/es5/h3-layers/h3-hexagon-layer.js +0 -351
  100. package/dist/es5/h3-layers/h3-hexagon-layer.js.map +0 -1
  101. package/dist/es5/h3-layers/h3-utils.js +0 -111
  102. package/dist/es5/h3-layers/h3-utils.js.map +0 -1
  103. package/dist/es5/index.js +0 -132
  104. package/dist/es5/index.js.map +0 -1
  105. package/dist/es5/mesh-layer/mesh-layer-fragment.glsl.js +0 -9
  106. package/dist/es5/mesh-layer/mesh-layer-fragment.glsl.js.map +0 -1
  107. package/dist/es5/mesh-layer/mesh-layer-vertex.glsl.js +0 -9
  108. package/dist/es5/mesh-layer/mesh-layer-vertex.glsl.js.map +0 -1
  109. package/dist/es5/mesh-layer/mesh-layer.js +0 -217
  110. package/dist/es5/mesh-layer/mesh-layer.js.map +0 -1
  111. package/dist/es5/mvt-layer/coordinate-transform.js +0 -83
  112. package/dist/es5/mvt-layer/coordinate-transform.js.map +0 -1
  113. package/dist/es5/mvt-layer/find-index-binary.js +0 -127
  114. package/dist/es5/mvt-layer/find-index-binary.js.map +0 -1
  115. package/dist/es5/mvt-layer/mvt-layer.js +0 -533
  116. package/dist/es5/mvt-layer/mvt-layer.js.map +0 -1
  117. package/dist/es5/quadkey-layer/quadkey-layer.js +0 -72
  118. package/dist/es5/quadkey-layer/quadkey-layer.js.map +0 -1
  119. package/dist/es5/quadkey-layer/quadkey-utils.js +0 -53
  120. package/dist/es5/quadkey-layer/quadkey-utils.js.map +0 -1
  121. package/dist/es5/s2-layer/s2-geometry.js +0 -158
  122. package/dist/es5/s2-layer/s2-geometry.js.map +0 -1
  123. package/dist/es5/s2-layer/s2-layer.js +0 -67
  124. package/dist/es5/s2-layer/s2-layer.js.map +0 -1
  125. package/dist/es5/s2-layer/s2-utils.js +0 -80
  126. package/dist/es5/s2-layer/s2-utils.js.map +0 -1
  127. package/dist/es5/terrain-layer/terrain-layer.js +0 -347
  128. package/dist/es5/terrain-layer/terrain-layer.js.map +0 -1
  129. package/dist/es5/tile-3d-layer/tile-3d-layer.js +0 -511
  130. package/dist/es5/tile-3d-layer/tile-3d-layer.js.map +0 -1
  131. package/dist/es5/tile-layer/tile-layer.js +0 -363
  132. package/dist/es5/tile-layer/tile-layer.js.map +0 -1
  133. package/dist/es5/tileset-2d/index.js +0 -66
  134. package/dist/es5/tileset-2d/index.js.map +0 -1
  135. package/dist/es5/tileset-2d/memoize.js +0 -47
  136. package/dist/es5/tileset-2d/memoize.js.map +0 -1
  137. package/dist/es5/tileset-2d/tile-2d-header.js +0 -250
  138. package/dist/es5/tileset-2d/tile-2d-header.js.map +0 -1
  139. package/dist/es5/tileset-2d/tile-2d-traversal.js +0 -256
  140. package/dist/es5/tileset-2d/tile-2d-traversal.js.map +0 -1
  141. package/dist/es5/tileset-2d/tileset-2d.js +0 -757
  142. package/dist/es5/tileset-2d/tileset-2d.js.map +0 -1
  143. package/dist/es5/tileset-2d/types.js +0 -2
  144. package/dist/es5/tileset-2d/types.js.map +0 -1
  145. package/dist/es5/tileset-2d/utils.js +0 -302
  146. package/dist/es5/tileset-2d/utils.js.map +0 -1
  147. package/dist/es5/trips-layer/trips-layer.js +0 -114
  148. package/dist/es5/trips-layer/trips-layer.js.map +0 -1
  149. package/dist/es5/wms-layer/utils.js +0 -18
  150. package/dist/es5/wms-layer/utils.js.map +0 -1
  151. package/dist/es5/wms-layer/wms-layer.js +0 -376
  152. package/dist/es5/wms-layer/wms-layer.js.map +0 -1
  153. package/dist/esm/geo-cell-layer/GeoCellLayer.js +0 -72
  154. package/dist/esm/geo-cell-layer/GeoCellLayer.js.map +0 -1
  155. package/dist/esm/geohash-layer/geohash-layer.js +0 -26
  156. package/dist/esm/geohash-layer/geohash-layer.js.map +0 -1
  157. package/dist/esm/geohash-layer/geohash-utils.js +0 -56
  158. package/dist/esm/geohash-layer/geohash-utils.js.map +0 -1
  159. package/dist/esm/great-circle-layer/great-circle-layer.js +0 -12
  160. package/dist/esm/great-circle-layer/great-circle-layer.js.map +0 -1
  161. package/dist/esm/h3-layers/h3-cluster-layer.js +0 -79
  162. package/dist/esm/h3-layers/h3-cluster-layer.js.map +0 -1
  163. package/dist/esm/h3-layers/h3-hexagon-layer.js +0 -280
  164. package/dist/esm/h3-layers/h3-hexagon-layer.js.map +0 -1
  165. package/dist/esm/h3-layers/h3-utils.js +0 -54
  166. package/dist/esm/h3-layers/h3-utils.js.map +0 -1
  167. package/dist/esm/index.js +0 -17
  168. package/dist/esm/index.js.map +0 -1
  169. package/dist/esm/mesh-layer/mesh-layer-fragment.glsl.js +0 -56
  170. package/dist/esm/mesh-layer/mesh-layer-fragment.glsl.js.map +0 -1
  171. package/dist/esm/mesh-layer/mesh-layer-vertex.glsl.js +0 -85
  172. package/dist/esm/mesh-layer/mesh-layer-vertex.glsl.js.map +0 -1
  173. package/dist/esm/mesh-layer/mesh-layer.js +0 -178
  174. package/dist/esm/mesh-layer/mesh-layer.js.map +0 -1
  175. package/dist/esm/mvt-layer/coordinate-transform.js +0 -49
  176. package/dist/esm/mvt-layer/coordinate-transform.js.map +0 -1
  177. package/dist/esm/mvt-layer/find-index-binary.js +0 -99
  178. package/dist/esm/mvt-layer/find-index-binary.js.map +0 -1
  179. package/dist/esm/mvt-layer/mvt-layer.js +0 -427
  180. package/dist/esm/mvt-layer/mvt-layer.js.map +0 -1
  181. package/dist/esm/quadkey-layer/quadkey-layer.js +0 -31
  182. package/dist/esm/quadkey-layer/quadkey-layer.js.map +0 -1
  183. package/dist/esm/quadkey-layer/quadkey-utils.js +0 -24
  184. package/dist/esm/quadkey-layer/quadkey-utils.js.map +0 -1
  185. package/dist/esm/s2-layer/s2-geometry.js +0 -126
  186. package/dist/esm/s2-layer/s2-geometry.js.map +0 -1
  187. package/dist/esm/s2-layer/s2-layer.js +0 -26
  188. package/dist/esm/s2-layer/s2-layer.js.map +0 -1
  189. package/dist/esm/s2-layer/s2-utils.js +0 -69
  190. package/dist/esm/s2-layer/s2-utils.js.map +0 -1
  191. package/dist/esm/terrain-layer/terrain-layer.js +0 -292
  192. package/dist/esm/terrain-layer/terrain-layer.js.map +0 -1
  193. package/dist/esm/tile-3d-layer/tile-3d-layer.js +0 -438
  194. package/dist/esm/tile-3d-layer/tile-3d-layer.js.map +0 -1
  195. package/dist/esm/tile-layer/tile-layer.js +0 -299
  196. package/dist/esm/tile-layer/tile-layer.js.map +0 -1
  197. package/dist/esm/tileset-2d/index.js +0 -4
  198. package/dist/esm/tileset-2d/index.js.map +0 -1
  199. package/dist/esm/tileset-2d/memoize.js +0 -40
  200. package/dist/esm/tileset-2d/memoize.js.map +0 -1
  201. package/dist/esm/tileset-2d/tile-2d-header.js +0 -179
  202. package/dist/esm/tileset-2d/tile-2d-header.js.map +0 -1
  203. package/dist/esm/tileset-2d/tile-2d-traversal.js +0 -184
  204. package/dist/esm/tileset-2d/tile-2d-traversal.js.map +0 -1
  205. package/dist/esm/tileset-2d/tileset-2d.js +0 -509
  206. package/dist/esm/tileset-2d/tileset-2d.js.map +0 -1
  207. package/dist/esm/tileset-2d/types.js +0 -2
  208. package/dist/esm/tileset-2d/types.js.map +0 -1
  209. package/dist/esm/tileset-2d/utils.js +0 -233
  210. package/dist/esm/tileset-2d/utils.js.map +0 -1
  211. package/dist/esm/trips-layer/trips-layer.js +0 -88
  212. package/dist/esm/trips-layer/trips-layer.js.map +0 -1
  213. package/dist/esm/wms-layer/utils.js +0 -9
  214. package/dist/esm/wms-layer/utils.js.map +0 -1
  215. package/dist/esm/wms-layer/wms-layer.js +0 -231
  216. package/dist/esm/wms-layer/wms-layer.js.map +0 -1
  217. package/typed/geohash-layer/geohash-layer.d.ts.map +0 -1
  218. package/typed/h3-layers/h3-cluster-layer.d.ts.map +0 -1
  219. package/typed/index.d.ts +0 -31
  220. package/typed/index.d.ts.map +0 -1
  221. package/typed/mesh-layer/mesh-layer-fragment.glsl.d.ts +0 -3
  222. package/typed/mvt-layer/find-index-binary.d.ts +0 -12
  223. package/typed/mvt-layer/find-index-binary.d.ts.map +0 -1
  224. package/typed/mvt-layer/mvt-layer.d.ts.map +0 -1
  225. package/typed/quadkey-layer/quadkey-layer.d.ts.map +0 -1
  226. package/typed/s2-layer/s2-layer.d.ts.map +0 -1
  227. package/typed/terrain-layer/terrain-layer.d.ts.map +0 -1
  228. package/typed/tile-layer/tile-layer.d.ts.map +0 -1
  229. package/typed/tileset-2d/index.d.ts +0 -7
  230. package/typed/tileset-2d/index.d.ts.map +0 -1
  231. package/typed/tileset-2d/tile-2d-header.d.ts.map +0 -1
  232. package/typed/tileset-2d/tile-2d-traversal.d.ts +0 -4
  233. package/typed/tileset-2d/tile-2d-traversal.d.ts.map +0 -1
  234. package/typed/tileset-2d/tileset-2d.d.ts.map +0 -1
  235. package/typed/tileset-2d/utils.d.ts.map +0 -1
  236. /package/{typed → dist}/geo-cell-layer/GeoCellLayer.d.ts +0 -0
  237. /package/{typed → dist}/geo-cell-layer/GeoCellLayer.d.ts.map +0 -0
  238. /package/{typed → dist}/geohash-layer/geohash-utils.d.ts +0 -0
  239. /package/{typed → dist}/geohash-layer/geohash-utils.d.ts.map +0 -0
  240. /package/{typed → dist}/great-circle-layer/great-circle-layer.d.ts +0 -0
  241. /package/{typed → dist}/great-circle-layer/great-circle-layer.d.ts.map +0 -0
  242. /package/{typed → dist}/h3-layers/h3-hexagon-layer.d.ts +0 -0
  243. /package/{typed → dist}/h3-layers/h3-hexagon-layer.d.ts.map +0 -0
  244. /package/{typed → dist}/h3-layers/h3-utils.d.ts +0 -0
  245. /package/{typed → dist}/h3-layers/h3-utils.d.ts.map +0 -0
  246. /package/{typed → dist}/mesh-layer/mesh-layer-vertex.glsl.d.ts +0 -0
  247. /package/{typed → dist}/mesh-layer/mesh-layer-vertex.glsl.d.ts.map +0 -0
  248. /package/{typed → dist}/mesh-layer/mesh-layer.d.ts +0 -0
  249. /package/{typed → dist}/quadkey-layer/quadkey-utils.d.ts +0 -0
  250. /package/{typed → dist}/quadkey-layer/quadkey-utils.d.ts.map +0 -0
  251. /package/{typed → dist}/s2-layer/s2-geometry.d.ts +0 -0
  252. /package/{typed → dist}/s2-layer/s2-geometry.d.ts.map +0 -0
  253. /package/{typed → dist}/s2-layer/s2-utils.d.ts +0 -0
  254. /package/{typed → dist}/s2-layer/s2-utils.d.ts.map +0 -0
  255. /package/{typed → dist}/tileset-2d/memoize.d.ts +0 -0
  256. /package/{typed → dist}/tileset-2d/memoize.d.ts.map +0 -0
  257. /package/{typed → dist}/tileset-2d/types.d.ts +0 -0
  258. /package/{typed → dist}/tileset-2d/types.d.ts.map +0 -0
  259. /package/{typed → dist}/wms-layer/utils.d.ts +0 -0
  260. /package/{typed → dist}/wms-layer/utils.d.ts.map +0 -0
  261. /package/{typed → dist}/wms-layer/wms-layer.d.ts +0 -0
  262. /package/{typed → dist}/wms-layer/wms-layer.d.ts.map +0 -0
@@ -0,0 +1,458 @@
1
+ import { RequestScheduler } from '@loaders.gl/loader-utils';
2
+ import { Matrix4, equals } from '@math.gl/core';
3
+ import { Tile2DHeader } from "./tile-2d-header.js";
4
+ import { getTileIndices, tileToBoundingBox, getCullBounds } from "./utils.js";
5
+ import { memoize } from "./memoize.js";
6
+ // bit masks
7
+ const TILE_STATE_VISITED = 1;
8
+ const TILE_STATE_VISIBLE = 2;
9
+ /*
10
+ show cached parent tile if children are loading
11
+ +-----------+ +-----+ +-----+-----+
12
+ | | | | | | |
13
+ | | | | | | |
14
+ | | --> +-----+-----+ -> +-----+-----+
15
+ | | | | | | |
16
+ | | | | | | |
17
+ +-----------+ +-----+ +-----+-----+
18
+
19
+ show cached children tiles when parent is loading
20
+ +-------+---- +------------
21
+ | | |
22
+ | | |
23
+ | | |
24
+ +-------+---- --> |
25
+ | | |
26
+ */
27
+ export const STRATEGY_NEVER = 'never';
28
+ export const STRATEGY_REPLACE = 'no-overlap';
29
+ export const STRATEGY_DEFAULT = 'best-available';
30
+ const DEFAULT_CACHE_SCALE = 5;
31
+ const STRATEGIES = {
32
+ [STRATEGY_DEFAULT]: updateTileStateDefault,
33
+ [STRATEGY_REPLACE]: updateTileStateReplace,
34
+ [STRATEGY_NEVER]: () => { }
35
+ };
36
+ export const DEFAULT_TILESET2D_PROPS = {
37
+ extent: null,
38
+ tileSize: 512,
39
+ maxZoom: null,
40
+ minZoom: null,
41
+ maxCacheSize: null,
42
+ maxCacheByteSize: null,
43
+ refinementStrategy: 'best-available',
44
+ zRange: null,
45
+ maxRequests: 6,
46
+ debounceTime: 0,
47
+ zoomOffset: 0,
48
+ // onTileLoad: (tile: Tile2DHeader) => void, // onTileUnload: (tile: Tile2DHeader) => void, // onTileError: (error: any, tile: Tile2DHeader) => void, /** Called when all tiles in the current viewport are loaded. */
49
+ // onViewportLoad: ((tiles: Tile2DHeader<DataT>[]) => void) | null,
50
+ onTileLoad: () => { },
51
+ onTileUnload: () => { },
52
+ onTileError: () => { }
53
+ };
54
+ /**
55
+ * Manages loading and purging of tile data. This class caches recently visited tiles
56
+ * and only creates new tiles if they are present.
57
+ */
58
+ export class Tileset2D {
59
+ /**
60
+ * Takes in a function that returns tile data, a cache size, and a max and a min zoom level.
61
+ * Cache size defaults to 5 * number of tiles in the current viewport
62
+ */
63
+ constructor(opts) {
64
+ /* Private methods */
65
+ this._getCullBounds = memoize(getCullBounds);
66
+ this.opts = { ...DEFAULT_TILESET2D_PROPS, ...opts };
67
+ this.setOptions(this.opts);
68
+ this.onTileLoad = tile => {
69
+ this.opts.onTileLoad?.(tile);
70
+ if (this.opts.maxCacheByteSize) {
71
+ this._cacheByteSize += tile.byteLength;
72
+ this._resizeCache();
73
+ }
74
+ };
75
+ this._requestScheduler = new RequestScheduler({
76
+ throttleRequests: this.opts.maxRequests > 0 || this.opts.debounceTime > 0,
77
+ maxRequests: this.opts.maxRequests,
78
+ debounceTime: this.opts.debounceTime
79
+ });
80
+ // Maps tile id in string {z}-{x}-{y} to a Tile object
81
+ this._cache = new Map();
82
+ this._tiles = [];
83
+ this._dirty = false;
84
+ this._cacheByteSize = 0;
85
+ // Cache the last processed viewport
86
+ this._viewport = null;
87
+ this._zRange = null;
88
+ this._selectedTiles = null;
89
+ this._frameNumber = 0;
90
+ this._modelMatrix = new Matrix4();
91
+ this._modelMatrixInverse = new Matrix4();
92
+ }
93
+ /* Public API */
94
+ get tiles() {
95
+ return this._tiles;
96
+ }
97
+ get selectedTiles() {
98
+ return this._selectedTiles;
99
+ }
100
+ get isLoaded() {
101
+ return this._selectedTiles !== null && this._selectedTiles.every(tile => tile.isLoaded);
102
+ }
103
+ get needsReload() {
104
+ return this._selectedTiles !== null && this._selectedTiles.some(tile => tile.needsReload);
105
+ }
106
+ setOptions(opts) {
107
+ Object.assign(this.opts, opts);
108
+ if (Number.isFinite(opts.maxZoom)) {
109
+ this._maxZoom = Math.floor(opts.maxZoom);
110
+ }
111
+ if (Number.isFinite(opts.minZoom)) {
112
+ this._minZoom = Math.ceil(opts.minZoom);
113
+ }
114
+ }
115
+ // Clean up any outstanding tile requests.
116
+ finalize() {
117
+ for (const tile of this._cache.values()) {
118
+ if (tile.isLoading) {
119
+ tile.abort();
120
+ }
121
+ }
122
+ this._cache.clear();
123
+ this._tiles = [];
124
+ this._selectedTiles = null;
125
+ }
126
+ reloadAll() {
127
+ for (const id of this._cache.keys()) {
128
+ const tile = this._cache.get(id);
129
+ if (!this._selectedTiles || !this._selectedTiles.includes(tile)) {
130
+ this._cache.delete(id);
131
+ }
132
+ else {
133
+ tile.setNeedsReload();
134
+ }
135
+ }
136
+ }
137
+ /**
138
+ * Update the cache with the given viewport and model matrix and triggers callback onUpdate.
139
+ */
140
+ update(viewport, { zRange, modelMatrix } = {
141
+ zRange: null,
142
+ modelMatrix: null
143
+ }) {
144
+ const modelMatrixAsMatrix4 = modelMatrix ? new Matrix4(modelMatrix) : new Matrix4();
145
+ const isModelMatrixNew = !modelMatrixAsMatrix4.equals(this._modelMatrix);
146
+ if (!this._viewport ||
147
+ !viewport.equals(this._viewport) ||
148
+ !equals(this._zRange, zRange) ||
149
+ isModelMatrixNew) {
150
+ if (isModelMatrixNew) {
151
+ this._modelMatrixInverse = modelMatrixAsMatrix4.clone().invert();
152
+ this._modelMatrix = modelMatrixAsMatrix4;
153
+ }
154
+ this._viewport = viewport;
155
+ this._zRange = zRange;
156
+ const tileIndices = this.getTileIndices({
157
+ viewport,
158
+ maxZoom: this._maxZoom,
159
+ minZoom: this._minZoom,
160
+ zRange,
161
+ modelMatrix: this._modelMatrix,
162
+ modelMatrixInverse: this._modelMatrixInverse
163
+ });
164
+ this._selectedTiles = tileIndices.map(index => this._getTile(index, true));
165
+ if (this._dirty) {
166
+ // Some new tiles are added
167
+ this._rebuildTree();
168
+ }
169
+ // Check for needed reloads explicitly even if the view/matrix has not changed.
170
+ }
171
+ else if (this.needsReload) {
172
+ this._selectedTiles = this._selectedTiles.map(tile => this._getTile(tile.index, true));
173
+ }
174
+ // Update tile states
175
+ const changed = this.updateTileStates();
176
+ this._pruneRequests();
177
+ if (this._dirty) {
178
+ // cache size is either the user defined maxSize or 5 * number of current tiles in the viewport.
179
+ this._resizeCache();
180
+ }
181
+ if (changed) {
182
+ this._frameNumber++;
183
+ }
184
+ return this._frameNumber;
185
+ }
186
+ // eslint-disable-next-line complexity
187
+ isTileVisible(tile, cullRect) {
188
+ if (!tile.isVisible) {
189
+ return false;
190
+ }
191
+ if (cullRect && this._viewport) {
192
+ const boundsArr = this._getCullBounds({
193
+ viewport: this._viewport,
194
+ z: this._zRange,
195
+ cullRect
196
+ });
197
+ const { bbox } = tile;
198
+ for (const [minX, minY, maxX, maxY] of boundsArr) {
199
+ let overlaps;
200
+ if ('west' in bbox) {
201
+ overlaps = bbox.west < maxX && bbox.east > minX && bbox.south < maxY && bbox.north > minY;
202
+ }
203
+ else {
204
+ // top/bottom could be swapped depending on the indexing system
205
+ const y0 = Math.min(bbox.top, bbox.bottom);
206
+ const y1 = Math.max(bbox.top, bbox.bottom);
207
+ overlaps = bbox.left < maxX && bbox.right > minX && y0 < maxY && y1 > minY;
208
+ }
209
+ if (overlaps) {
210
+ return true;
211
+ }
212
+ }
213
+ return false;
214
+ }
215
+ return true;
216
+ }
217
+ /* Public interface for subclassing */
218
+ /** Returns array of tile indices in the current viewport */
219
+ getTileIndices({ viewport, maxZoom, minZoom, zRange, modelMatrix, modelMatrixInverse }) {
220
+ const { tileSize, extent, zoomOffset } = this.opts;
221
+ return getTileIndices({
222
+ viewport,
223
+ maxZoom,
224
+ minZoom,
225
+ zRange,
226
+ tileSize,
227
+ extent: extent,
228
+ modelMatrix,
229
+ modelMatrixInverse,
230
+ zoomOffset
231
+ });
232
+ }
233
+ /** Returns unique string key for a tile index */
234
+ getTileId(index) {
235
+ return `${index.x}-${index.y}-${index.z}`;
236
+ }
237
+ /** Returns a zoom level for a tile index */
238
+ getTileZoom(index) {
239
+ return index.z;
240
+ }
241
+ /** Returns additional metadata to add to tile, bbox by default */
242
+ getTileMetadata(index) {
243
+ const { tileSize } = this.opts;
244
+ return { bbox: tileToBoundingBox(this._viewport, index.x, index.y, index.z, tileSize) };
245
+ }
246
+ /** Returns index of the parent tile */
247
+ getParentIndex(index) {
248
+ const x = Math.floor(index.x / 2);
249
+ const y = Math.floor(index.y / 2);
250
+ const z = index.z - 1;
251
+ return { x, y, z };
252
+ }
253
+ // Returns true if any tile's visibility changed
254
+ updateTileStates() {
255
+ const refinementStrategy = this.opts.refinementStrategy || STRATEGY_DEFAULT;
256
+ const visibilities = new Array(this._cache.size);
257
+ let i = 0;
258
+ // Reset state
259
+ for (const tile of this._cache.values()) {
260
+ // save previous state
261
+ visibilities[i++] = tile.isVisible;
262
+ tile.isSelected = false;
263
+ tile.isVisible = false;
264
+ }
265
+ // @ts-expect-error called only when _selectedTiles is already defined
266
+ for (const tile of this._selectedTiles) {
267
+ tile.isSelected = true;
268
+ tile.isVisible = true;
269
+ }
270
+ // Strategy-specific state logic
271
+ (typeof refinementStrategy === 'function'
272
+ ? refinementStrategy
273
+ : STRATEGIES[refinementStrategy])(Array.from(this._cache.values()));
274
+ i = 0;
275
+ // Check if any visibility has changed
276
+ for (const tile of this._cache.values()) {
277
+ if (visibilities[i++] !== tile.isVisible) {
278
+ return true;
279
+ }
280
+ }
281
+ return false;
282
+ }
283
+ _pruneRequests() {
284
+ const { maxRequests = 0 } = this.opts;
285
+ const abortCandidates = [];
286
+ let ongoingRequestCount = 0;
287
+ for (const tile of this._cache.values()) {
288
+ // Keep track of all the ongoing requests
289
+ if (tile.isLoading) {
290
+ ongoingRequestCount++;
291
+ if (!tile.isSelected && !tile.isVisible) {
292
+ abortCandidates.push(tile);
293
+ }
294
+ }
295
+ }
296
+ while (maxRequests > 0 && ongoingRequestCount > maxRequests && abortCandidates.length > 0) {
297
+ // There are too many ongoing requests, so abort some that are unselected
298
+ const tile = abortCandidates.shift();
299
+ tile.abort();
300
+ ongoingRequestCount--;
301
+ }
302
+ }
303
+ // This needs to be called every time some tiles have been added/removed from cache
304
+ _rebuildTree() {
305
+ const { _cache } = this;
306
+ // Reset states
307
+ for (const tile of _cache.values()) {
308
+ tile.parent = null;
309
+ if (tile.children) {
310
+ tile.children.length = 0;
311
+ }
312
+ }
313
+ // Rebuild tree
314
+ for (const tile of _cache.values()) {
315
+ const parent = this._getNearestAncestor(tile);
316
+ tile.parent = parent;
317
+ if (parent?.children) {
318
+ parent.children.push(tile);
319
+ }
320
+ }
321
+ }
322
+ /**
323
+ * Clear tiles that are not visible when the cache is full
324
+ */
325
+ /* eslint-disable complexity */
326
+ _resizeCache() {
327
+ const { _cache, opts } = this;
328
+ const maxCacheSize = opts.maxCacheSize ||
329
+ // @ts-expect-error called only when selectedTiles is initialized
330
+ (opts.maxCacheByteSize ? Infinity : DEFAULT_CACHE_SCALE * this.selectedTiles.length);
331
+ const maxCacheByteSize = opts.maxCacheByteSize || Infinity;
332
+ const overflown = _cache.size > maxCacheSize || this._cacheByteSize > maxCacheByteSize;
333
+ if (overflown) {
334
+ for (const [id, tile] of _cache) {
335
+ if (!tile.isVisible && !tile.isSelected) {
336
+ // delete tile
337
+ this._cacheByteSize -= opts.maxCacheByteSize ? tile.byteLength : 0;
338
+ _cache.delete(id);
339
+ this.opts.onTileUnload?.(tile);
340
+ }
341
+ if (_cache.size <= maxCacheSize && this._cacheByteSize <= maxCacheByteSize) {
342
+ break;
343
+ }
344
+ }
345
+ this._rebuildTree();
346
+ this._dirty = true;
347
+ }
348
+ if (this._dirty) {
349
+ // sort by zoom level so that smaller tiles are displayed on top
350
+ this._tiles = Array.from(this._cache.values()).sort((t1, t2) => t1.zoom - t2.zoom);
351
+ this._dirty = false;
352
+ }
353
+ }
354
+ _getTile(index, create) {
355
+ const id = this.getTileId(index);
356
+ let tile = this._cache.get(id);
357
+ let needsReload = false;
358
+ if (!tile && create) {
359
+ tile = new Tile2DHeader(index);
360
+ Object.assign(tile, this.getTileMetadata(tile.index));
361
+ Object.assign(tile, { id, zoom: this.getTileZoom(tile.index) });
362
+ needsReload = true;
363
+ this._cache.set(id, tile);
364
+ this._dirty = true;
365
+ }
366
+ else if (tile && tile.needsReload) {
367
+ needsReload = true;
368
+ }
369
+ if (tile && needsReload) {
370
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
371
+ tile.loadData({
372
+ getData: this.opts.getTileData,
373
+ requestScheduler: this._requestScheduler,
374
+ onLoad: this.onTileLoad,
375
+ onError: this.opts.onTileError
376
+ });
377
+ }
378
+ return tile;
379
+ }
380
+ _getNearestAncestor(tile) {
381
+ const { _minZoom = 0 } = this;
382
+ let index = tile.index;
383
+ while (this.getTileZoom(index) > _minZoom) {
384
+ index = this.getParentIndex(index);
385
+ const parent = this._getTile(index);
386
+ if (parent) {
387
+ return parent;
388
+ }
389
+ }
390
+ return null;
391
+ }
392
+ }
393
+ /* -- Refinement strategies --*/
394
+ /* eslint-disable max-depth */
395
+ // For all the selected && pending tiles:
396
+ // - pick the closest ancestor as placeholder
397
+ // - if no ancestor is visible, pick the closest children as placeholder
398
+ function updateTileStateDefault(allTiles) {
399
+ for (const tile of allTiles) {
400
+ tile.state = 0;
401
+ }
402
+ for (const tile of allTiles) {
403
+ if (tile.isSelected && !getPlaceholderInAncestors(tile)) {
404
+ getPlaceholderInChildren(tile);
405
+ }
406
+ }
407
+ for (const tile of allTiles) {
408
+ tile.isVisible = Boolean(tile.state & TILE_STATE_VISIBLE);
409
+ }
410
+ }
411
+ // Until a selected tile and all its selected siblings are loaded, use the closest ancestor as placeholder
412
+ function updateTileStateReplace(allTiles) {
413
+ for (const tile of allTiles) {
414
+ tile.state = 0;
415
+ }
416
+ for (const tile of allTiles) {
417
+ if (tile.isSelected) {
418
+ getPlaceholderInAncestors(tile);
419
+ }
420
+ }
421
+ // Always process parents first
422
+ const sortedTiles = Array.from(allTiles).sort((t1, t2) => t1.zoom - t2.zoom);
423
+ for (const tile of sortedTiles) {
424
+ tile.isVisible = Boolean(tile.state & TILE_STATE_VISIBLE);
425
+ if (tile.children && (tile.isVisible || tile.state & TILE_STATE_VISITED)) {
426
+ // If the tile is rendered, or if the tile has been explicitly hidden, hide all of its children
427
+ for (const child of tile.children) {
428
+ child.state = TILE_STATE_VISITED;
429
+ }
430
+ }
431
+ else if (tile.isSelected) {
432
+ getPlaceholderInChildren(tile);
433
+ }
434
+ }
435
+ }
436
+ // Walk up the tree until we find one ancestor that is loaded. Returns true if successful.
437
+ function getPlaceholderInAncestors(startTile) {
438
+ let tile = startTile;
439
+ while (tile) {
440
+ if (tile.isLoaded || tile.content) {
441
+ tile.state |= TILE_STATE_VISIBLE;
442
+ return true;
443
+ }
444
+ tile = tile.parent;
445
+ }
446
+ return false;
447
+ }
448
+ // Recursively set children as placeholder
449
+ function getPlaceholderInChildren(tile) {
450
+ for (const child of tile.children) {
451
+ if (child.isLoaded || child.content) {
452
+ child.state |= TILE_STATE_VISIBLE;
453
+ }
454
+ else {
455
+ getPlaceholderInChildren(child);
456
+ }
457
+ }
458
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -1,6 +1,6 @@
1
1
  import { Viewport } from '@deck.gl/core';
2
2
  import { Matrix4 } from '@math.gl/core';
3
- import { Bounds, GeoBoundingBox, TileBoundingBox, TileIndex, ZRange } from './types';
3
+ import { Bounds, GeoBoundingBox, TileBoundingBox, TileIndex, ZRange } from "./types.js";
4
4
  export type URLTemplate = string | string[] | null;
5
5
  export declare const urlType: {
6
6
  type: "object";
@@ -17,7 +17,7 @@ export declare function getCullBounds({ viewport, z, cullRect }: {
17
17
  /** Current viewport */
18
18
  viewport: Viewport;
19
19
  /** Current z range */
20
- z?: ZRange | number | null;
20
+ z: ZRange | number | null;
21
21
  /** Culling rectangle in screen space */
22
22
  cullRect: {
23
23
  x: number;
@@ -37,7 +37,7 @@ export declare function getTileIndices({ viewport, maxZoom, minZoom, zRange, ext
37
37
  viewport: Viewport;
38
38
  maxZoom?: number;
39
39
  minZoom?: number;
40
- zRange?: ZRange | null;
40
+ zRange: ZRange | null;
41
41
  extent?: Bounds;
42
42
  tileSize?: number;
43
43
  modelMatrix?: Matrix4;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/tileset-2d/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,eAAe,CAAC;AACvC,OAAO,EAAC,OAAO,EAAC,MAAM,eAAe,CAAC;AAEtC,OAAO,EAAC,MAAM,EAAE,cAAc,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,EAAC,mBAAgB;AAKnF,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC;AAEnD,eAAO,MAAM,OAAO;;;;;CAyBnB,CAAC;AA8BF,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,WAAW,EACrB,IAAI,EAAE;IACJ,KAAK,EAAE,SAAS,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;CACZ,GACA,MAAM,GAAG,IAAI,CAsBf;AAsCD,wCAAwC;AACxC,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,CAAC,EACD,QAAQ,EACT,EAAE;IACD,uBAAuB;IACvB,QAAQ,EAAE,QAAQ,CAAC;IACnB,sBAAsB;IACtB,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC1B,wCAAwC;IACxC,QAAQ,EAAE;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAC,CAAC;CACjE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAGrC;AAwDD,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAMhF;AAMD,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,QAAQ,EAClB,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,QAAQ,GAAE,MAAkB,GAC3B,eAAe,CASjB;AA0BD;;;;GAIG;AAEH,wBAAgB,cAAc,CAAC,EAC7B,QAAQ,EACR,OAAO,EACP,OAAO,EACP,MAAM,EACN,MAAM,EACN,QAAoB,EACpB,WAAW,EACX,kBAAkB,EAClB,UAAc,EACf,EAAE;IACD,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,eA0BA;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAEhD;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,IAAI,cAAc,CAO5D"}