@loaders.gl/tiles 4.4.5 → 5.0.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 (227) hide show
  1. package/LICENSE +14 -3
  2. package/README.md +110 -1
  3. package/dist/dist.dev.js +6588 -2057
  4. package/dist/dist.min.js +1 -1
  5. package/dist/image-set.d.ts +94 -0
  6. package/dist/image-set.d.ts.map +1 -0
  7. package/dist/image-set.js +243 -0
  8. package/dist/image-set.js.map +1 -0
  9. package/dist/index.cjs +6872 -2160
  10. package/dist/index.cjs.map +3 -4
  11. package/dist/index.d.ts +33 -9
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +18 -8
  14. package/dist/index.js.map +1 -1
  15. package/dist/point-cloud/point-cloud-tile.d.ts +47 -0
  16. package/dist/point-cloud/point-cloud-tile.d.ts.map +1 -0
  17. package/dist/point-cloud/point-cloud-tile.js +70 -0
  18. package/dist/point-cloud/point-cloud-tile.js.map +1 -0
  19. package/dist/point-cloud/point-cloud-tileset.d.ts +131 -0
  20. package/dist/point-cloud/point-cloud-tileset.d.ts.map +1 -0
  21. package/dist/point-cloud/point-cloud-tileset.js +510 -0
  22. package/dist/point-cloud/point-cloud-tileset.js.map +1 -0
  23. package/dist/point-cloud/types.d.ts +64 -0
  24. package/dist/point-cloud/types.d.ts.map +1 -0
  25. package/dist/point-cloud/types.js +5 -0
  26. package/dist/point-cloud/types.js.map +1 -0
  27. package/dist/raster-set.d.ts +113 -0
  28. package/dist/raster-set.d.ts.map +1 -0
  29. package/dist/raster-set.js +274 -0
  30. package/dist/raster-set.js.map +1 -0
  31. package/dist/tileset-2d/adapter.d.ts +38 -0
  32. package/dist/tileset-2d/adapter.d.ts.map +1 -0
  33. package/dist/tileset-2d/adapter.js +5 -0
  34. package/dist/tileset-2d/adapter.js.map +1 -0
  35. package/dist/tileset-2d/index.d.ts +7 -0
  36. package/dist/tileset-2d/index.d.ts.map +1 -0
  37. package/dist/tileset-2d/index.js +6 -0
  38. package/dist/tileset-2d/index.js.map +1 -0
  39. package/dist/tileset-2d/tile-2d-header.d.ts +68 -0
  40. package/dist/tileset-2d/tile-2d-header.d.ts.map +1 -0
  41. package/dist/tileset-2d/tile-2d-header.js +181 -0
  42. package/dist/tileset-2d/tile-2d-header.js.map +1 -0
  43. package/dist/tileset-2d/tileset-2d.d.ts +201 -0
  44. package/dist/tileset-2d/tileset-2d.d.ts.map +1 -0
  45. package/dist/tileset-2d/tileset-2d.js +532 -0
  46. package/dist/tileset-2d/tileset-2d.js.map +1 -0
  47. package/dist/tileset-2d/types.d.ts +44 -0
  48. package/dist/tileset-2d/types.d.ts.map +1 -0
  49. package/dist/tileset-2d/types.js +5 -0
  50. package/dist/tileset-2d/types.js.map +1 -0
  51. package/dist/tileset-2d.d.ts +2 -0
  52. package/dist/tileset-2d.d.ts.map +1 -0
  53. package/dist/tileset-2d.js +5 -0
  54. package/dist/tileset-2d.js.map +1 -0
  55. package/dist/tileset-3d/common/indexed-archive-tileset-source.d.ts +60 -0
  56. package/dist/tileset-3d/common/indexed-archive-tileset-source.d.ts.map +1 -0
  57. package/dist/tileset-3d/common/indexed-archive-tileset-source.js +125 -0
  58. package/dist/tileset-3d/common/indexed-archive-tileset-source.js.map +1 -0
  59. package/dist/{tileset → tileset-3d/common}/tile-3d.d.ts +133 -29
  60. package/dist/tileset-3d/common/tile-3d.d.ts.map +1 -0
  61. package/dist/{tileset → tileset-3d/common}/tile-3d.js +282 -77
  62. package/dist/tileset-3d/common/tile-3d.js.map +1 -0
  63. package/dist/tileset-3d/common/tileset-3d.d.ts +317 -0
  64. package/dist/tileset-3d/common/tileset-3d.d.ts.map +1 -0
  65. package/dist/tileset-3d/common/tileset-3d.js +807 -0
  66. package/dist/tileset-3d/common/tileset-3d.js.map +1 -0
  67. package/dist/tileset-3d/common/tileset-cache.d.ts +29 -0
  68. package/dist/tileset-3d/common/tileset-cache.d.ts.map +1 -0
  69. package/dist/{tileset → tileset-3d/common}/tileset-cache.js +12 -4
  70. package/dist/tileset-3d/common/tileset-cache.js.map +1 -0
  71. package/dist/tileset-3d/common/tileset-source.d.ts +204 -0
  72. package/dist/tileset-3d/common/tileset-source.d.ts.map +1 -0
  73. package/dist/tileset-3d/common/tileset-source.js +17 -0
  74. package/dist/tileset-3d/common/tileset-source.js.map +1 -0
  75. package/dist/{tileset → tileset-3d/common}/tileset-traverser.d.ts +15 -2
  76. package/dist/tileset-3d/common/tileset-traverser.d.ts.map +1 -0
  77. package/dist/{tileset → tileset-3d/common}/tileset-traverser.js +30 -3
  78. package/dist/tileset-3d/common/tileset-traverser.js.map +1 -0
  79. package/dist/tileset-3d/format-3d-tiles/implicit-tiling.d.ts +111 -0
  80. package/dist/tileset-3d/format-3d-tiles/implicit-tiling.d.ts.map +1 -0
  81. package/dist/tileset-3d/format-3d-tiles/implicit-tiling.js +340 -0
  82. package/dist/tileset-3d/format-3d-tiles/implicit-tiling.js.map +1 -0
  83. package/dist/tileset-3d/format-3d-tiles/tiles-3d-source.d.ts +189 -0
  84. package/dist/tileset-3d/format-3d-tiles/tiles-3d-source.d.ts.map +1 -0
  85. package/dist/tileset-3d/format-3d-tiles/tiles-3d-source.js +510 -0
  86. package/dist/tileset-3d/format-3d-tiles/tiles-3d-source.js.map +1 -0
  87. package/dist/tileset-3d/format-3d-tiles/tileset-3d-traverser.d.ts +43 -0
  88. package/dist/tileset-3d/format-3d-tiles/tileset-3d-traverser.d.ts.map +1 -0
  89. package/dist/tileset-3d/format-3d-tiles/tileset-3d-traverser.js +119 -0
  90. package/dist/tileset-3d/format-3d-tiles/tileset-3d-traverser.js.map +1 -0
  91. package/dist/tileset-3d/format-i3s/i3s-pending-tiles-register.d.ts.map +1 -0
  92. package/dist/{tileset → tileset-3d}/format-i3s/i3s-pending-tiles-register.js +3 -0
  93. package/dist/tileset-3d/format-i3s/i3s-pending-tiles-register.js.map +1 -0
  94. package/dist/tileset-3d/format-i3s/i3s-source.d.ts +99 -0
  95. package/dist/tileset-3d/format-i3s/i3s-source.d.ts.map +1 -0
  96. package/dist/tileset-3d/format-i3s/i3s-source.js +299 -0
  97. package/dist/tileset-3d/format-i3s/i3s-source.js.map +1 -0
  98. package/dist/tileset-3d/format-i3s/i3s-tile-manager.d.ts.map +1 -0
  99. package/dist/{tileset → tileset-3d}/format-i3s/i3s-tile-manager.js +5 -2
  100. package/dist/tileset-3d/format-i3s/i3s-tile-manager.js.map +1 -0
  101. package/dist/{tileset → tileset-3d}/format-i3s/i3s-tileset-traverser.d.ts +2 -2
  102. package/dist/tileset-3d/format-i3s/i3s-tileset-traverser.d.ts.map +1 -0
  103. package/dist/{tileset → tileset-3d}/format-i3s/i3s-tileset-traverser.js +17 -23
  104. package/dist/tileset-3d/format-i3s/i3s-tileset-traverser.js.map +1 -0
  105. package/dist/{tileset → tileset-3d}/helpers/3d-tiles-options.d.ts +1 -1
  106. package/dist/tileset-3d/helpers/3d-tiles-options.d.ts.map +1 -0
  107. package/dist/{tileset → tileset-3d}/helpers/3d-tiles-options.js +3 -0
  108. package/dist/tileset-3d/helpers/3d-tiles-options.js.map +1 -0
  109. package/dist/tileset-3d/helpers/bounding-volume.d.ts.map +1 -0
  110. package/dist/{tileset → tileset-3d}/helpers/bounding-volume.js +1 -0
  111. package/dist/tileset-3d/helpers/bounding-volume.js.map +1 -0
  112. package/dist/tileset-3d/helpers/frame-state.d.ts +86 -0
  113. package/dist/tileset-3d/helpers/frame-state.d.ts.map +1 -0
  114. package/dist/{tileset → tileset-3d}/helpers/frame-state.js +84 -9
  115. package/dist/tileset-3d/helpers/frame-state.js.map +1 -0
  116. package/dist/{tileset → tileset-3d}/helpers/i3s-lod.d.ts +1 -1
  117. package/dist/tileset-3d/helpers/i3s-lod.d.ts.map +1 -0
  118. package/dist/{tileset → tileset-3d}/helpers/i3s-lod.js +1 -1
  119. package/dist/tileset-3d/helpers/i3s-lod.js.map +1 -0
  120. package/dist/tileset-3d/helpers/tiles-3d-lod.d.ts +72 -0
  121. package/dist/tileset-3d/helpers/tiles-3d-lod.d.ts.map +1 -0
  122. package/dist/tileset-3d/helpers/tiles-3d-lod.js +257 -0
  123. package/dist/tileset-3d/helpers/tiles-3d-lod.js.map +1 -0
  124. package/dist/tileset-3d/helpers/tiles-3d-request-priority.d.ts +134 -0
  125. package/dist/tileset-3d/helpers/tiles-3d-request-priority.d.ts.map +1 -0
  126. package/dist/tileset-3d/helpers/tiles-3d-request-priority.js +179 -0
  127. package/dist/tileset-3d/helpers/tiles-3d-request-priority.js.map +1 -0
  128. package/dist/{tileset → tileset-3d}/helpers/transform-utils.d.ts +1 -1
  129. package/dist/tileset-3d/helpers/transform-utils.d.ts.map +1 -0
  130. package/dist/tileset-3d/helpers/transform-utils.js.map +1 -0
  131. package/dist/tileset-3d/helpers/zoom.d.ts.map +1 -0
  132. package/dist/tileset-3d/helpers/zoom.js.map +1 -0
  133. package/dist/types.d.ts +9 -0
  134. package/dist/types.d.ts.map +1 -1
  135. package/dist/types.js +3 -0
  136. package/dist/types.js.map +1 -1
  137. package/dist/utils/doubly-linked-list.d.ts.map +1 -1
  138. package/dist/utils/doubly-linked-list.js +1 -0
  139. package/dist/utils/doubly-linked-list.js.map +1 -1
  140. package/dist/utils/managed-array.d.ts.map +1 -1
  141. package/dist/utils/managed-array.js +1 -0
  142. package/dist/utils/managed-array.js.map +1 -1
  143. package/package.json +7 -6
  144. package/src/image-set.ts +328 -0
  145. package/src/index.ts +99 -9
  146. package/src/point-cloud/point-cloud-tile.ts +80 -0
  147. package/src/point-cloud/point-cloud-tileset.ts +713 -0
  148. package/src/point-cloud/types.ts +82 -0
  149. package/src/raster-set.ts +412 -0
  150. package/src/tileset-2d/adapter.ts +47 -0
  151. package/src/tileset-2d/index.ts +33 -0
  152. package/src/tileset-2d/tile-2d-header.ts +224 -0
  153. package/src/tileset-2d/tileset-2d.ts +716 -0
  154. package/src/tileset-2d/types.ts +39 -0
  155. package/src/tileset-2d.ts +5 -0
  156. package/src/tileset-3d/common/indexed-archive-tileset-source.ts +205 -0
  157. package/src/{tileset → tileset-3d/common}/tile-3d.ts +348 -93
  158. package/src/tileset-3d/common/tileset-3d.ts +1087 -0
  159. package/src/{tileset → tileset-3d/common}/tileset-cache.ts +16 -8
  160. package/src/tileset-3d/common/tileset-source.ts +255 -0
  161. package/src/{tileset → tileset-3d/common}/tileset-traverser.ts +32 -4
  162. package/src/tileset-3d/format-3d-tiles/implicit-tiling.ts +534 -0
  163. package/src/tileset-3d/format-3d-tiles/tiles-3d-source.ts +632 -0
  164. package/src/tileset-3d/format-3d-tiles/tileset-3d-traverser.ts +140 -0
  165. package/src/{tileset → tileset-3d}/format-i3s/i3s-pending-tiles-register.ts +4 -0
  166. package/src/tileset-3d/format-i3s/i3s-source.ts +366 -0
  167. package/src/{tileset → tileset-3d}/format-i3s/i3s-tile-manager.ts +6 -2
  168. package/src/{tileset → tileset-3d}/format-i3s/i3s-tileset-traverser.ts +19 -24
  169. package/src/{tileset → tileset-3d}/helpers/3d-tiles-options.ts +5 -1
  170. package/src/{tileset → tileset-3d}/helpers/bounding-volume.ts +2 -0
  171. package/src/tileset-3d/helpers/frame-state.ts +311 -0
  172. package/src/{tileset → tileset-3d}/helpers/i3s-lod.ts +2 -2
  173. package/src/tileset-3d/helpers/tiles-3d-lod.ts +370 -0
  174. package/src/tileset-3d/helpers/tiles-3d-request-priority.ts +301 -0
  175. package/src/{tileset → tileset-3d}/helpers/transform-utils.ts +1 -1
  176. package/src/types.ts +13 -0
  177. package/src/utils/doubly-linked-list.ts +2 -0
  178. package/src/utils/managed-array.ts +2 -0
  179. package/dist/tileset/format-3d-tiles/tileset-3d-traverser.d.ts +0 -7
  180. package/dist/tileset/format-3d-tiles/tileset-3d-traverser.d.ts.map +0 -1
  181. package/dist/tileset/format-3d-tiles/tileset-3d-traverser.js +0 -53
  182. package/dist/tileset/format-3d-tiles/tileset-3d-traverser.js.map +0 -1
  183. package/dist/tileset/format-i3s/i3s-pending-tiles-register.d.ts.map +0 -1
  184. package/dist/tileset/format-i3s/i3s-pending-tiles-register.js.map +0 -1
  185. package/dist/tileset/format-i3s/i3s-tile-manager.d.ts.map +0 -1
  186. package/dist/tileset/format-i3s/i3s-tile-manager.js.map +0 -1
  187. package/dist/tileset/format-i3s/i3s-tileset-traverser.d.ts.map +0 -1
  188. package/dist/tileset/format-i3s/i3s-tileset-traverser.js.map +0 -1
  189. package/dist/tileset/helpers/3d-tiles-options.d.ts.map +0 -1
  190. package/dist/tileset/helpers/3d-tiles-options.js.map +0 -1
  191. package/dist/tileset/helpers/bounding-volume.d.ts.map +0 -1
  192. package/dist/tileset/helpers/bounding-volume.js.map +0 -1
  193. package/dist/tileset/helpers/frame-state.d.ts +0 -28
  194. package/dist/tileset/helpers/frame-state.d.ts.map +0 -1
  195. package/dist/tileset/helpers/frame-state.js.map +0 -1
  196. package/dist/tileset/helpers/i3s-lod.d.ts.map +0 -1
  197. package/dist/tileset/helpers/i3s-lod.js.map +0 -1
  198. package/dist/tileset/helpers/tiles-3d-lod.d.ts +0 -8
  199. package/dist/tileset/helpers/tiles-3d-lod.d.ts.map +0 -1
  200. package/dist/tileset/helpers/tiles-3d-lod.js +0 -113
  201. package/dist/tileset/helpers/tiles-3d-lod.js.map +0 -1
  202. package/dist/tileset/helpers/transform-utils.d.ts.map +0 -1
  203. package/dist/tileset/helpers/transform-utils.js.map +0 -1
  204. package/dist/tileset/helpers/zoom.d.ts.map +0 -1
  205. package/dist/tileset/helpers/zoom.js.map +0 -1
  206. package/dist/tileset/tile-3d.d.ts.map +0 -1
  207. package/dist/tileset/tile-3d.js.map +0 -1
  208. package/dist/tileset/tileset-3d.d.ts +0 -284
  209. package/dist/tileset/tileset-3d.d.ts.map +0 -1
  210. package/dist/tileset/tileset-3d.js +0 -814
  211. package/dist/tileset/tileset-3d.js.map +0 -1
  212. package/dist/tileset/tileset-cache.d.ts +0 -19
  213. package/dist/tileset/tileset-cache.d.ts.map +0 -1
  214. package/dist/tileset/tileset-cache.js.map +0 -1
  215. package/dist/tileset/tileset-traverser.d.ts.map +0 -1
  216. package/dist/tileset/tileset-traverser.js.map +0 -1
  217. package/src/tileset/format-3d-tiles/tileset-3d-traverser.ts +0 -63
  218. package/src/tileset/helpers/frame-state.ts +0 -183
  219. package/src/tileset/helpers/tiles-3d-lod.ts +0 -149
  220. package/src/tileset/tileset-3d.ts +0 -1037
  221. /package/dist/{tileset → tileset-3d}/format-i3s/i3s-pending-tiles-register.d.ts +0 -0
  222. /package/dist/{tileset → tileset-3d}/format-i3s/i3s-tile-manager.d.ts +0 -0
  223. /package/dist/{tileset → tileset-3d}/helpers/bounding-volume.d.ts +0 -0
  224. /package/dist/{tileset → tileset-3d}/helpers/transform-utils.js +0 -0
  225. /package/dist/{tileset → tileset-3d}/helpers/zoom.d.ts +0 -0
  226. /package/dist/{tileset → tileset-3d}/helpers/zoom.js +0 -0
  227. /package/src/{tileset → tileset-3d}/helpers/zoom.ts +0 -0
@@ -0,0 +1,82 @@
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ import type {DataSource, DataSourceOptions} from '@loaders.gl/loader-utils';
6
+ import type {MeshArrowTable} from '@loaders.gl/schema';
7
+
8
+ /**
9
+ * An accessor-like description for point cloud attributes.
10
+ */
11
+ export type PointCloudAttribute = {
12
+ value: ArrayBufferView;
13
+ size: number;
14
+ normalized?: boolean;
15
+ };
16
+
17
+ /**
18
+ * deck.gl coordinate system string values accepted by point cloud tile content.
19
+ */
20
+ export type PointCloudCoordinateSystem =
21
+ | 'default'
22
+ | 'lnglat'
23
+ | 'meter-offsets'
24
+ | 'lnglat-offsets'
25
+ | 'cartesian';
26
+
27
+ /**
28
+ * A normalized point cloud tile content payload.
29
+ */
30
+ export type PointCloudTileContent = {
31
+ data: MeshArrowTable;
32
+ pointCount: number;
33
+ cartographicOrigin: number[];
34
+ coordinateSystem: PointCloudCoordinateSystem;
35
+ constantRGBA?: number[];
36
+ modelMatrix?: number[] | Float32Array;
37
+ };
38
+
39
+ /**
40
+ * A cartographic bounding volume for a point cloud tile.
41
+ */
42
+ export type PointCloudBoundingVolume = {
43
+ cartographicBounds: [min: number[], max: number[]];
44
+ center: number[];
45
+ radius: number;
46
+ };
47
+
48
+ /**
49
+ * A source-owned tile header used by the point cloud tileset.
50
+ */
51
+ export type PointCloudTileHeader = {
52
+ id: string;
53
+ level: number;
54
+ pointCount: number;
55
+ geometricError: number;
56
+ boundingVolume: PointCloudBoundingVolume;
57
+ };
58
+
59
+ /**
60
+ * Optional tileset view metadata.
61
+ */
62
+ export type PointCloudTilesetViewState = {
63
+ cartographicCenter?: number[];
64
+ zoom?: number;
65
+ boundingVolume?: PointCloudBoundingVolume;
66
+ };
67
+
68
+ /**
69
+ * Structural contract for point cloud sources that can back a PointCloudTileset.
70
+ */
71
+ export type PointCloudTilesetSource<
72
+ DataT = unknown,
73
+ OptionsT extends DataSourceOptions = DataSourceOptions
74
+ > = DataSource<DataT, OptionsT> & {
75
+ isReady: boolean;
76
+ initialize(): Promise<void>;
77
+ getMetadata?(): Promise<unknown>;
78
+ getRootTile(): Promise<PointCloudTileHeader>;
79
+ getChildren(tile: PointCloudTileHeader): Promise<PointCloudTileHeader[]>;
80
+ loadTileContent(tile: PointCloudTileHeader): Promise<PointCloudTileContent | null>;
81
+ getViewState?(): Promise<PointCloudTilesetViewState> | PointCloudTilesetViewState;
82
+ };
@@ -0,0 +1,412 @@
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ import type {
6
+ GetRasterParameters,
7
+ RasterData,
8
+ RasterSource,
9
+ RasterSourceMetadata
10
+ } from '@loaders.gl/loader-utils';
11
+
12
+ /** Accepted raster request currently retained by {@link RasterSet}. */
13
+ export type RasterSetRequest<
14
+ DataT extends RasterData = RasterData,
15
+ ParametersT extends GetRasterParameters = GetRasterParameters
16
+ > = {
17
+ /** Unique request id assigned by the manager. */
18
+ requestId: number;
19
+ /** Raster request parameters that produced the accepted raster payload. */
20
+ parameters: ParametersT;
21
+ /** Raster retained as the current output. */
22
+ raster: DataT;
23
+ };
24
+
25
+ /** Arguments supplied to {@link RasterSetBaseProps.shouldRefetch}. */
26
+ export type RasterSetShouldRefetchArgs<
27
+ DataT extends RasterData = RasterData,
28
+ ParametersT extends GetRasterParameters = GetRasterParameters,
29
+ MetadataT extends RasterSourceMetadata = RasterSourceMetadata
30
+ > = {
31
+ /** Current accepted request retained by the raster manager, if any. */
32
+ currentRequest: RasterSetRequest<DataT, ParametersT> | null;
33
+ /** Source metadata resolved by {@link RasterSet.loadMetadata}, if available. */
34
+ metadata: MetadataT | null;
35
+ /** Candidate raster request parameters under evaluation. */
36
+ nextParameters: ParametersT;
37
+ };
38
+
39
+ /** Configuration shared by all {@link RasterSet} instances. */
40
+ export type RasterSetBaseProps<
41
+ DataT extends RasterData = RasterData,
42
+ ParametersT extends GetRasterParameters = GetRasterParameters,
43
+ MetadataT extends RasterSourceMetadata = RasterSourceMetadata
44
+ > = {
45
+ /** Callback used to load source metadata. */
46
+ getMetadata: () => Promise<MetadataT>;
47
+ /** Callback used to load raster data for a viewport-derived request. */
48
+ getRaster: (parameters: ParametersT) => Promise<DataT>;
49
+ /** Debounce interval applied before issuing raster requests. */
50
+ debounceTime?: number;
51
+ /** Optional policy callback that can skip redundant raster requests. */
52
+ shouldRefetch?: (args: RasterSetShouldRefetchArgs<DataT, ParametersT, MetadataT>) => boolean;
53
+ };
54
+
55
+ /** Options for creating a {@link RasterSet}. */
56
+ export type RasterSetProps<
57
+ DataT extends RasterData = RasterData,
58
+ ParametersT extends GetRasterParameters = GetRasterParameters,
59
+ MetadataT extends RasterSourceMetadata = RasterSourceMetadata
60
+ > = Partial<RasterSetBaseProps<DataT, ParametersT, MetadataT>> & {
61
+ /** Optional loaders.gl raster source backing this manager. */
62
+ rasterSource?: RasterSource<DataT, ParametersT, MetadataT> | null;
63
+ };
64
+
65
+ /** Subscription callbacks emitted by {@link RasterSet}. */
66
+ export type RasterSetListener<
67
+ DataT extends RasterData = RasterData,
68
+ ParametersT extends GetRasterParameters = GetRasterParameters,
69
+ MetadataT extends RasterSourceMetadata = RasterSourceMetadata
70
+ > = {
71
+ /** Fired when metadata/raster loading starts or stops. */
72
+ onLoadingStateChange?: (isLoading: boolean) => void;
73
+ /** Fired when source metadata resolves successfully. */
74
+ onMetadataLoad?: (metadata: MetadataT) => void;
75
+ /** Fired when metadata loading fails. */
76
+ onMetadataLoadError?: (error: Error) => void;
77
+ /** Fired when a new raster request is issued. */
78
+ onRasterLoadStart?: (requestId: number, parameters: ParametersT) => void;
79
+ /** Fired when a raster request resolves and becomes current. */
80
+ onRasterLoad?: (request: RasterSetRequest<DataT, ParametersT>) => void;
81
+ /** Fired when a raster request fails. */
82
+ onRasterLoadError?: (requestId: number, error: Error, parameters: ParametersT) => void;
83
+ /** Fired when metadata or the current raster changes. */
84
+ onUpdate?: () => void;
85
+ };
86
+
87
+ const DEFAULT_RASTERSET_PROPS: Required<Omit<RasterSetProps, 'rasterSource'>> = {
88
+ getMetadata: async () => ({
89
+ width: 0,
90
+ height: 0,
91
+ bandCount: 0,
92
+ dtype: 'uint8'
93
+ }),
94
+ getRaster: async () =>
95
+ ({
96
+ data: new Uint8Array(0),
97
+ width: 0,
98
+ height: 0,
99
+ bandCount: 0,
100
+ dtype: 'uint8'
101
+ }) as never,
102
+ debounceTime: 0,
103
+ shouldRefetch: () => true
104
+ };
105
+
106
+ /**
107
+ * Shared raster request manager used by viewport-driven raster examples and layers.
108
+ *
109
+ * @typeParam DataT Raster payload retained by the manager.
110
+ * @typeParam ParametersT Request parameters accepted by the source.
111
+ * @typeParam MetadataT Metadata returned by the source.
112
+ */
113
+ export class RasterSet<
114
+ DataT extends RasterData = RasterData,
115
+ ParametersT extends GetRasterParameters = GetRasterParameters,
116
+ MetadataT extends RasterSourceMetadata = RasterSourceMetadata
117
+ > {
118
+ /** Cached metadata returned by the backing source, if any. */
119
+ metadata: MetadataT | null = null;
120
+
121
+ private _opts: Required<RasterSetProps<DataT, ParametersT, MetadataT>>;
122
+ private _listeners = new Set<RasterSetListener<DataT, ParametersT, MetadataT>>();
123
+ private _currentRequest: RasterSetRequest<DataT, ParametersT> | null = null;
124
+ private _lastAcceptedRequestId = -1;
125
+ private _nextRequestId = 0;
126
+ private _loadCounter = 0;
127
+ private _timeoutId: ReturnType<typeof setTimeout> | null = null;
128
+ private _abortController: AbortController | null = null;
129
+ private _finalized = false;
130
+
131
+ /** Creates a raster manager from a source or direct callbacks. */
132
+ constructor(opts: RasterSetProps<DataT, ParametersT, MetadataT>) {
133
+ this._opts = this._normalizeOptions(opts);
134
+ if (!this._opts.rasterSource && (!opts.getRaster || !opts.getMetadata)) {
135
+ throw new Error(
136
+ 'RasterSet requires either `rasterSource` or both `getRaster` and `getMetadata`.'
137
+ );
138
+ }
139
+ }
140
+
141
+ /** Convenience factory for wrapping a loaders.gl {@link RasterSource}. */
142
+ static fromRasterSource<
143
+ DataT extends RasterData = RasterData,
144
+ ParametersT extends GetRasterParameters = GetRasterParameters,
145
+ MetadataT extends RasterSourceMetadata = RasterSourceMetadata
146
+ >(
147
+ rasterSource: RasterSource<DataT, ParametersT, MetadataT>,
148
+ opts: Omit<
149
+ RasterSetProps<DataT, ParametersT, MetadataT>,
150
+ 'rasterSource' | 'getRaster' | 'getMetadata'
151
+ > = {}
152
+ ): RasterSet<DataT, ParametersT, MetadataT> {
153
+ return new RasterSet<DataT, ParametersT, MetadataT>({...opts, rasterSource});
154
+ }
155
+
156
+ /** Whether the manager has no requests in flight and a current raster. */
157
+ get isLoaded(): boolean {
158
+ return this._loadCounter === 0 && Boolean(this._currentRequest);
159
+ }
160
+
161
+ /** Current accepted raster, if any. */
162
+ get raster(): DataT | null {
163
+ return this._currentRequest?.raster || null;
164
+ }
165
+
166
+ /** Current accepted request and raster payload, if any. */
167
+ get currentRequest(): RasterSetRequest<DataT, ParametersT> | null {
168
+ return this._currentRequest;
169
+ }
170
+
171
+ /** Backing raster source when constructed from one. */
172
+ get rasterSource(): RasterSource<DataT, ParametersT, MetadataT> | null {
173
+ return this._opts.rasterSource;
174
+ }
175
+
176
+ /** Subscribes to metadata and raster lifecycle events. */
177
+ subscribe(listener: RasterSetListener<DataT, ParametersT, MetadataT>): () => void {
178
+ this._listeners.add(listener);
179
+ return () => this._listeners.delete(listener);
180
+ }
181
+
182
+ /** Updates source callbacks or debounce settings, resetting state when the source changes. */
183
+ setOptions(opts: RasterSetProps<DataT, ParametersT, MetadataT>): void {
184
+ const previousRasterSource = this._opts.rasterSource;
185
+ const nextOptions = this._normalizeOptions({...this._opts, ...opts});
186
+ const sourceChanged =
187
+ previousRasterSource !== nextOptions.rasterSource ||
188
+ this._opts.getRaster !== nextOptions.getRaster ||
189
+ this._opts.getMetadata !== nextOptions.getMetadata;
190
+
191
+ this._opts = nextOptions;
192
+
193
+ if (sourceChanged) {
194
+ this._cancelScheduledRaster();
195
+ this.metadata = null;
196
+ this._currentRequest = null;
197
+ this._lastAcceptedRequestId = -1;
198
+ this._nextRequestId = 0;
199
+ this._emitUpdate();
200
+ }
201
+ }
202
+
203
+ /** Loads metadata from the current raster source or callbacks. */
204
+ async loadMetadata(): Promise<MetadataT> {
205
+ this._startLoading();
206
+ try {
207
+ const metadata = await this._opts.getMetadata();
208
+ if (this._finalized) {
209
+ return metadata;
210
+ }
211
+ this.metadata = metadata;
212
+ for (const listener of this._listeners) {
213
+ listener.onMetadataLoad?.(metadata);
214
+ }
215
+ this._emitUpdate();
216
+ return metadata;
217
+ } catch (error) {
218
+ const normalizedError = normalizeRasterSetError(error, 'Raster metadata request failed');
219
+ if (!this._finalized) {
220
+ for (const listener of this._listeners) {
221
+ listener.onMetadataLoadError?.(normalizedError);
222
+ }
223
+ }
224
+ throw normalizedError;
225
+ } finally {
226
+ this._finishLoading();
227
+ }
228
+ }
229
+
230
+ /** Debounces and issues a new raster request for the supplied parameters. */
231
+ requestRaster(parameters: ParametersT, debounceTime = this._opts.debounceTime): number {
232
+ if (!this.shouldRefetchRaster(parameters)) {
233
+ return this._currentRequest?.requestId ?? -1;
234
+ }
235
+
236
+ const requestId = this._nextRequestId++;
237
+ this._cancelScheduledRaster();
238
+
239
+ if (debounceTime > 0) {
240
+ this._timeoutId = setTimeout(() => {
241
+ this._timeoutId = null;
242
+ void this._loadRaster(requestId, parameters);
243
+ }, debounceTime);
244
+ } else {
245
+ void this._loadRaster(requestId, parameters);
246
+ }
247
+
248
+ return requestId;
249
+ }
250
+
251
+ /** Returns `true` when the supplied parameters warrant a new raster fetch. */
252
+ shouldRefetchRaster(parameters: ParametersT): boolean {
253
+ return this._opts.shouldRefetch({
254
+ currentRequest: this._currentRequest,
255
+ metadata: this.metadata,
256
+ nextParameters: parameters
257
+ });
258
+ }
259
+
260
+ /** Clears timers and listeners held by the manager. */
261
+ finalize(): void {
262
+ this._finalized = true;
263
+ this._cancelScheduledRaster();
264
+ this._abortActiveRequest();
265
+ this._listeners.clear();
266
+ }
267
+
268
+ /** Loads a raster immediately and accepts it only if it is the newest completed request. */
269
+ private async _loadRaster(requestId: number, parameters: ParametersT): Promise<void> {
270
+ if (this._finalized) {
271
+ return;
272
+ }
273
+
274
+ this._startLoading();
275
+ for (const listener of this._listeners) {
276
+ listener.onRasterLoadStart?.(requestId, parameters);
277
+ }
278
+
279
+ try {
280
+ const abortController = new AbortController();
281
+ this._abortController = abortController;
282
+ const raster = await this._opts.getRaster({...parameters, signal: abortController.signal});
283
+ if (
284
+ this._finalized ||
285
+ abortController.signal.aborted ||
286
+ requestId <= this._lastAcceptedRequestId
287
+ ) {
288
+ return;
289
+ }
290
+
291
+ this._lastAcceptedRequestId = requestId;
292
+ this._currentRequest = {requestId, parameters, raster};
293
+
294
+ for (const listener of this._listeners) {
295
+ listener.onRasterLoad?.(this._currentRequest);
296
+ }
297
+ this._emitUpdate();
298
+ } catch (error) {
299
+ if (isAbortError(error)) {
300
+ return;
301
+ }
302
+ const normalizedError = normalizeRasterSetError(error, 'Raster request failed');
303
+ if (!this._finalized) {
304
+ for (const listener of this._listeners) {
305
+ listener.onRasterLoadError?.(requestId, normalizedError, parameters);
306
+ }
307
+ }
308
+ } finally {
309
+ this._abortController = null;
310
+ this._finishLoading();
311
+ }
312
+ }
313
+
314
+ /** Resolves current options from either a source or direct callbacks. */
315
+ private _normalizeOptions(
316
+ opts: RasterSetProps<DataT, ParametersT, MetadataT>
317
+ ): Required<RasterSetProps<DataT, ParametersT, MetadataT>> {
318
+ const rasterSource = opts.rasterSource || null;
319
+ return {
320
+ ...DEFAULT_RASTERSET_PROPS,
321
+ ...opts,
322
+ rasterSource,
323
+ getMetadata:
324
+ opts.getMetadata ||
325
+ (() => {
326
+ if (rasterSource) {
327
+ return rasterSource.getMetadata();
328
+ }
329
+ return DEFAULT_RASTERSET_PROPS.getMetadata() as Promise<MetadataT>;
330
+ }),
331
+ getRaster:
332
+ opts.getRaster ||
333
+ ((parameters: ParametersT) => {
334
+ if (rasterSource) {
335
+ return rasterSource.getRaster(parameters);
336
+ }
337
+ return DEFAULT_RASTERSET_PROPS.getRaster(parameters) as Promise<DataT>;
338
+ }),
339
+ debounceTime: opts.debounceTime ?? DEFAULT_RASTERSET_PROPS.debounceTime,
340
+ shouldRefetch:
341
+ (opts.shouldRefetch as
342
+ | ((args: RasterSetShouldRefetchArgs<DataT, ParametersT, MetadataT>) => boolean)
343
+ | undefined) ||
344
+ ((args: RasterSetShouldRefetchArgs<DataT, ParametersT, MetadataT>) =>
345
+ DEFAULT_RASTERSET_PROPS.shouldRefetch(args as RasterSetShouldRefetchArgs))
346
+ };
347
+ }
348
+
349
+ /** Emits one generic update notification to all subscribers. */
350
+ private _emitUpdate(): void {
351
+ for (const listener of this._listeners) {
352
+ listener.onUpdate?.();
353
+ }
354
+ }
355
+
356
+ /** Emits one loading-state transition to all subscribers. */
357
+ private _emitLoadingStateChange(isLoading: boolean): void {
358
+ for (const listener of this._listeners) {
359
+ listener.onLoadingStateChange?.(isLoading);
360
+ }
361
+ }
362
+
363
+ /** Increments the active load count and emits loading-state transitions. */
364
+ private _startLoading(): void {
365
+ const wasLoading = this._loadCounter > 0;
366
+ this._loadCounter++;
367
+ if (!wasLoading) {
368
+ this._emitLoadingStateChange(true);
369
+ this._emitUpdate();
370
+ }
371
+ }
372
+
373
+ /** Decrements the active load count and emits loading-state transitions. */
374
+ private _finishLoading(): void {
375
+ const wasLoading = this._loadCounter > 0;
376
+ this._loadCounter = Math.max(0, this._loadCounter - 1);
377
+ if (wasLoading && this._loadCounter === 0) {
378
+ this._emitLoadingStateChange(false);
379
+ this._emitUpdate();
380
+ }
381
+ }
382
+
383
+ /** Clears any pending debounced raster request before it hits the network. */
384
+ private _cancelScheduledRaster(): void {
385
+ if (this._timeoutId !== null) {
386
+ clearTimeout(this._timeoutId);
387
+ this._timeoutId = null;
388
+ }
389
+ }
390
+
391
+ /** Aborts the currently active raster request, if one exists. */
392
+ private _abortActiveRequest(): void {
393
+ this._abortController?.abort();
394
+ this._abortController = null;
395
+ }
396
+ }
397
+
398
+ /** Normalizes arbitrary thrown values to `Error` instances for raster-set callbacks. */
399
+ function normalizeRasterSetError(error: unknown, message: string): Error {
400
+ if (error instanceof Error) {
401
+ return error;
402
+ }
403
+ if (typeof error === 'string') {
404
+ return new Error(error);
405
+ }
406
+ return new Error(message);
407
+ }
408
+
409
+ /** Returns true when an error came from an aborted request. */
410
+ function isAbortError(error: unknown): boolean {
411
+ return error instanceof Error && error.name === 'AbortError';
412
+ }
@@ -0,0 +1,47 @@
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ import type {Matrix4} from '@math.gl/core';
6
+ import type {Bounds, TileBoundingBox, TileIndex, ZRange} from './types';
7
+
8
+ /** Traversal inputs required by a {@link Tileset2DAdapter}. */
9
+ export type Tileset2DTraversalContext<ViewStateT> = {
10
+ /** Consumer-defined view state used by the adapter. */
11
+ viewState: ViewStateT;
12
+ /** Tile size in pixels. */
13
+ tileSize: number;
14
+ /** Bounding box limiting tile generation. */
15
+ extent?: Bounds | null;
16
+ /** Minimum zoom level to request. */
17
+ minZoom?: number;
18
+ /** Maximum zoom level to request. */
19
+ maxZoom?: number;
20
+ /** Integer zoom offset applied during tile selection. */
21
+ zoomOffset?: number;
22
+ /** Elevation range used during geospatial tile selection. */
23
+ zRange?: ZRange | null;
24
+ /** Optional model matrix applied by the surrounding layer stack. */
25
+ modelMatrix?: Matrix4 | null;
26
+ /** Inverse of the current model matrix. */
27
+ modelMatrixInverse?: Matrix4 | null;
28
+ };
29
+
30
+ /** Minimal tile metadata inputs required by a {@link Tileset2DAdapter}. */
31
+ export type Tileset2DTileContext<ViewStateT> = {
32
+ /** Consumer-defined view state used by the adapter. */
33
+ viewState: ViewStateT;
34
+ /** Tile size in pixels. */
35
+ tileSize: number;
36
+ };
37
+
38
+ /** Adapter used by {@link Tileset2D} to compute traversal and tile bounds. */
39
+ export type Tileset2DAdapter<ViewStateT> = {
40
+ /** Returns tile indices that should be selected for one traversal context. */
41
+ getTileIndices: (context: Tileset2DTraversalContext<ViewStateT>) => TileIndex[];
42
+ /** Returns the structured bounding box for one tile index. */
43
+ getTileBoundingBox: (
44
+ context: Tileset2DTileContext<ViewStateT>,
45
+ index: TileIndex
46
+ ) => TileBoundingBox;
47
+ };
@@ -0,0 +1,33 @@
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ export type {
6
+ Bounds,
7
+ GeoBoundingBox,
8
+ NonGeoBoundingBox,
9
+ TileBoundingBox,
10
+ TileIndex,
11
+ TileLoadProps,
12
+ ZRange
13
+ } from './types';
14
+ export type {
15
+ Tileset2DAdapter,
16
+ Tileset2DTileContext,
17
+ Tileset2DTraversalContext
18
+ } from './adapter';
19
+ export type {Tile2DLoadDataProps} from './tile-2d-header';
20
+ export {SharedTile2DHeader} from './tile-2d-header';
21
+ export type {
22
+ RefinementStrategy,
23
+ RefinementStrategyFunction,
24
+ Tileset2DBaseProps,
25
+ Tileset2DProps,
26
+ Tile2DListener
27
+ } from './tileset-2d';
28
+ export {
29
+ Tileset2D,
30
+ STRATEGY_DEFAULT,
31
+ STRATEGY_NEVER,
32
+ STRATEGY_REPLACE
33
+ } from './tileset-2d';