@deck.gl/geo-layers 8.10.0-alpha.6 → 9.0.0-alpha.3

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 (120) hide show
  1. package/dist/dist.dev.js +7621 -22014
  2. package/dist/es5/geo-cell-layer/GeoCellLayer.js.map +1 -1
  3. package/dist/es5/geohash-layer/geohash-layer.js.map +1 -1
  4. package/dist/es5/great-circle-layer/great-circle-layer.js.map +1 -1
  5. package/dist/es5/h3-layers/h3-cluster-layer.js +10 -1
  6. package/dist/es5/h3-layers/h3-cluster-layer.js.map +1 -1
  7. package/dist/es5/h3-layers/h3-hexagon-layer.js.map +1 -1
  8. package/dist/es5/index.js +0 -8
  9. package/dist/es5/index.js.map +1 -1
  10. package/{src/mesh-layer/mesh-layer.ts → dist/es5/mesh-layer/mesh-layer.ts.disabled} +8 -7
  11. package/dist/es5/mvt-layer/find-index-binary.js.map +1 -1
  12. package/dist/es5/mvt-layer/mvt-layer.js +15 -6
  13. package/dist/es5/mvt-layer/mvt-layer.js.map +1 -1
  14. package/dist/es5/quadkey-layer/quadkey-layer.js.map +1 -1
  15. package/dist/es5/s2-layer/s2-layer.js.map +1 -1
  16. package/dist/es5/terrain-layer/terrain-layer.js.map +1 -1
  17. package/{src/tile-3d-layer/tile-3d-layer.ts → dist/es5/tile-3d-layer/tile-3d-layer.ts.disabled} +9 -9
  18. package/dist/es5/tile-layer/tile-layer.js +19 -9
  19. package/dist/es5/tile-layer/tile-layer.js.map +1 -1
  20. package/dist/es5/tileset-2d/tile-2d-traversal.js.map +1 -1
  21. package/dist/es5/tileset-2d/tileset-2d.js +1 -1
  22. package/dist/es5/tileset-2d/tileset-2d.js.map +1 -1
  23. package/dist/es5/tileset-2d/utils.js +2 -3
  24. package/dist/es5/tileset-2d/utils.js.map +1 -1
  25. package/dist/es5/trips-layer/trips-layer.js.map +1 -1
  26. package/dist/es5/wms-layer/wms-layer.js +6 -8
  27. package/dist/es5/wms-layer/wms-layer.js.map +1 -1
  28. package/dist/esm/geo-cell-layer/GeoCellLayer.js.map +1 -1
  29. package/dist/esm/geohash-layer/geohash-layer.js.map +1 -1
  30. package/dist/esm/great-circle-layer/great-circle-layer.js.map +1 -1
  31. package/dist/esm/h3-layers/h3-cluster-layer.js +5 -0
  32. package/dist/esm/h3-layers/h3-cluster-layer.js.map +1 -1
  33. package/dist/esm/h3-layers/h3-hexagon-layer.js.map +1 -1
  34. package/dist/esm/index.js +0 -1
  35. package/dist/esm/index.js.map +1 -1
  36. package/dist/esm/mesh-layer/mesh-layer.ts.disabled +176 -0
  37. package/dist/esm/mvt-layer/find-index-binary.js.map +1 -1
  38. package/dist/esm/mvt-layer/mvt-layer.js +6 -1
  39. package/dist/esm/mvt-layer/mvt-layer.js.map +1 -1
  40. package/dist/esm/quadkey-layer/quadkey-layer.js.map +1 -1
  41. package/dist/esm/s2-layer/s2-layer.js.map +1 -1
  42. package/dist/esm/terrain-layer/terrain-layer.js.map +1 -1
  43. package/dist/esm/tile-3d-layer/tile-3d-layer.ts.disabled +436 -0
  44. package/dist/esm/tile-layer/tile-layer.js +10 -6
  45. package/dist/esm/tile-layer/tile-layer.js.map +1 -1
  46. package/dist/esm/tileset-2d/tile-2d-traversal.js.map +1 -1
  47. package/dist/esm/tileset-2d/tileset-2d.js +1 -1
  48. package/dist/esm/tileset-2d/tileset-2d.js.map +1 -1
  49. package/dist/esm/tileset-2d/utils.js +2 -2
  50. package/dist/esm/tileset-2d/utils.js.map +1 -1
  51. package/dist/esm/trips-layer/trips-layer.js.map +1 -1
  52. package/dist/esm/wms-layer/wms-layer.js +5 -5
  53. package/dist/esm/wms-layer/wms-layer.js.map +1 -1
  54. package/dist.min.js +29 -227
  55. package/package.json +17 -17
  56. package/src/geo-cell-layer/GeoCellLayer.ts +1 -1
  57. package/src/geohash-layer/geohash-layer.ts +2 -2
  58. package/src/great-circle-layer/great-circle-layer.ts +1 -1
  59. package/src/h3-layers/h3-cluster-layer.ts +6 -2
  60. package/src/h3-layers/h3-hexagon-layer.ts +2 -2
  61. package/src/index.ts +4 -2
  62. package/src/mesh-layer/mesh-layer.ts.disabled +176 -0
  63. package/src/mvt-layer/find-index-binary.ts +6 -6
  64. package/src/mvt-layer/mvt-layer.ts +19 -9
  65. package/src/quadkey-layer/quadkey-layer.ts +3 -2
  66. package/src/s2-layer/s2-layer.ts +2 -2
  67. package/src/terrain-layer/terrain-layer.ts +2 -2
  68. package/src/tile-3d-layer/tile-3d-layer.ts.disabled +436 -0
  69. package/src/tile-layer/tile-layer.ts +20 -10
  70. package/src/tileset-2d/tile-2d-traversal.ts +1 -1
  71. package/src/tileset-2d/tileset-2d.ts +6 -7
  72. package/src/tileset-2d/utils.ts +4 -4
  73. package/src/trips-layer/trips-layer.ts +3 -3
  74. package/src/wms-layer/wms-layer.ts +11 -7
  75. package/typed/geo-cell-layer/GeoCellLayer.d.ts +1 -1
  76. package/typed/geo-cell-layer/GeoCellLayer.d.ts.map +1 -1
  77. package/typed/geohash-layer/geohash-layer.d.ts +2 -2
  78. package/typed/geohash-layer/geohash-layer.d.ts.map +1 -1
  79. package/typed/great-circle-layer/great-circle-layer.d.ts +2 -2
  80. package/typed/great-circle-layer/great-circle-layer.d.ts.map +1 -1
  81. package/typed/h3-layers/h3-cluster-layer.d.ts +7 -2
  82. package/typed/h3-layers/h3-cluster-layer.d.ts.map +1 -1
  83. package/typed/h3-layers/h3-hexagon-layer.d.ts +2 -2
  84. package/typed/h3-layers/h3-hexagon-layer.d.ts.map +1 -1
  85. package/typed/index.d.ts +0 -2
  86. package/typed/index.d.ts.map +1 -1
  87. package/typed/mvt-layer/find-index-binary.d.ts +2 -2
  88. package/typed/mvt-layer/find-index-binary.d.ts.map +1 -1
  89. package/typed/mvt-layer/mvt-layer.d.ts +11 -3
  90. package/typed/mvt-layer/mvt-layer.d.ts.map +1 -1
  91. package/typed/quadkey-layer/quadkey-layer.d.ts +2 -2
  92. package/typed/quadkey-layer/quadkey-layer.d.ts.map +1 -1
  93. package/typed/s2-layer/s2-layer.d.ts +2 -2
  94. package/typed/s2-layer/s2-layer.d.ts.map +1 -1
  95. package/typed/terrain-layer/terrain-layer.d.ts +2 -2
  96. package/typed/terrain-layer/terrain-layer.d.ts.map +1 -1
  97. package/typed/tile-layer/tile-layer.d.ts +7 -2
  98. package/typed/tile-layer/tile-layer.d.ts.map +1 -1
  99. package/typed/tileset-2d/tile-2d-traversal.d.ts +1 -1
  100. package/typed/tileset-2d/tile-2d-traversal.d.ts.map +1 -1
  101. package/typed/tileset-2d/tileset-2d.d.ts +4 -4
  102. package/typed/tileset-2d/tileset-2d.d.ts.map +1 -1
  103. package/typed/tileset-2d/utils.d.ts +2 -2
  104. package/typed/tileset-2d/utils.d.ts.map +1 -1
  105. package/typed/trips-layer/trips-layer.d.ts +3 -3
  106. package/typed/trips-layer/trips-layer.d.ts.map +1 -1
  107. package/typed/wms-layer/wms-layer.d.ts +2 -1
  108. package/typed/wms-layer/wms-layer.d.ts.map +1 -1
  109. package/dist/es5/mesh-layer/mesh-layer.js +0 -212
  110. package/dist/es5/mesh-layer/mesh-layer.js.map +0 -1
  111. package/dist/es5/tile-3d-layer/tile-3d-layer.js +0 -512
  112. package/dist/es5/tile-3d-layer/tile-3d-layer.js.map +0 -1
  113. package/dist/esm/mesh-layer/mesh-layer.js +0 -177
  114. package/dist/esm/mesh-layer/mesh-layer.js.map +0 -1
  115. package/dist/esm/tile-3d-layer/tile-3d-layer.js +0 -443
  116. package/dist/esm/tile-3d-layer/tile-3d-layer.js.map +0 -1
  117. package/typed/mesh-layer/mesh-layer.d.ts +0 -38
  118. package/typed/mesh-layer/mesh-layer.d.ts.map +0 -1
  119. package/typed/tile-3d-layer/tile-3d-layer.d.ts +0 -62
  120. package/typed/tile-3d-layer/tile-3d-layer.d.ts.map +0 -1
@@ -0,0 +1,436 @@
1
+ import {GL} from '@luma.gl/constants';
2
+ import {Geometry} from '@luma.gl/engine';
3
+
4
+ import {
5
+ Accessor,
6
+ Color,
7
+ CompositeLayer,
8
+ CompositeLayerProps,
9
+ COORDINATE_SYSTEM,
10
+ FilterContext,
11
+ GetPickingInfoParams,
12
+ Layer,
13
+ LayersList,
14
+ log,
15
+ PickingInfo,
16
+ UpdateParameters,
17
+ Viewport,
18
+ DefaultProps
19
+ } from '@deck.gl/core';
20
+ import {PointCloudLayer} from '@deck.gl/layers';
21
+ import {ScenegraphLayer} from '@deck.gl/mesh-layers';
22
+ import {default as MeshLayer} from '../mesh-layer/mesh-layer';
23
+
24
+ import {load} from '@loaders.gl/core';
25
+ import {MeshAttributes} from '@loaders.gl/schema';
26
+ import {Tileset3D, Tile3D, TILE_TYPE} from '@loaders.gl/tiles';
27
+ import {Tiles3DLoader} from '@loaders.gl/3d-tiles';
28
+
29
+ const SINGLE_DATA = [0];
30
+
31
+ const defaultProps: DefaultProps<Tile3DLayerProps> = {
32
+ getPointColor: {type: 'accessor', value: [0, 0, 0, 255]},
33
+ pointSize: 1.0,
34
+
35
+ // Disable async data loading (handling it in _loadTileSet)
36
+ data: '',
37
+ loader: Tiles3DLoader,
38
+
39
+ onTilesetLoad: {type: 'function', value: tileset3d => {}},
40
+ onTileLoad: {type: 'function', value: tileHeader => {}},
41
+ onTileUnload: {type: 'function', value: tileHeader => {}},
42
+ onTileError: {type: 'function', value: (tile, message, url) => {}},
43
+ _getMeshColor: {type: 'function', value: tileHeader => [255, 255, 255]}
44
+ };
45
+
46
+ /** All properties supported by Tile3DLayer */
47
+ export type Tile3DLayerProps<DataT = unknown> = _Tile3DLayerProps<DataT> & CompositeLayerProps;
48
+
49
+ /** Props added by the Tile3DLayer */
50
+ type _Tile3DLayerProps<DataT> = {
51
+ data: string;
52
+ /** Color Accessor for point clouds. **/
53
+ getPointColor?: Accessor<DataT, Color>;
54
+
55
+ /** Global radius of all points in pixels. **/
56
+ pointSize?: number;
57
+
58
+ /** A loader which is used to decode the fetched tiles.
59
+ * @deprecated Use `loaders` instead
60
+ */
61
+ loader?: typeof Tiles3DLoader;
62
+
63
+ /** Called when Tileset JSON file is loaded. **/
64
+ onTilesetLoad?: (tile: Tileset3D) => void;
65
+
66
+ /** Called when a tile in the tileset hierarchy is loaded. **/
67
+ onTileLoad?: (tile: Tile3D) => void;
68
+
69
+ /** Called when a tile is unloaded. **/
70
+ onTileUnload?: (tile: Tile3D) => void;
71
+
72
+ /** Called when a tile fails to load. **/
73
+ onTileError?: (tile: Tile3D, url: string, message: string) => void;
74
+
75
+ /** (Experimental) Accessor to change color of mesh based on properties. **/
76
+ _getMeshColor?: (tile: Tile3D) => Color;
77
+ };
78
+
79
+ /** Render 3d tiles data formatted according to the [3D Tiles Specification](https://www.opengeospatial.org/standards/3DTiles) and [`ESRI I3S`](https://github.com/Esri/i3s-spec) */
80
+ export default class Tile3DLayer<DataT = any, ExtraPropsT extends {} = {}> extends CompositeLayer<
81
+ ExtraPropsT & Required<_Tile3DLayerProps<DataT>>
82
+ > {
83
+ static defaultProps = defaultProps;
84
+ static layerName = 'Tile3DLayer';
85
+
86
+ state!: {
87
+ activeViewports: {};
88
+ frameNumber?: number;
89
+ lastUpdatedViewports: {[viewportId: string]: Viewport} | null;
90
+ layerMap: {[layerId: string]: any};
91
+ tileset3d: Tileset3D | null;
92
+ };
93
+
94
+ initializeState() {
95
+ if ('onTileLoadFail' in this.props) {
96
+ log.removed('onTileLoadFail', 'onTileError')();
97
+ }
98
+ // prop verification
99
+ this.state = {
100
+ layerMap: {},
101
+ tileset3d: null,
102
+ activeViewports: {},
103
+ lastUpdatedViewports: null
104
+ };
105
+ }
106
+
107
+ get isLoaded(): boolean {
108
+ const {tileset3d} = this.state;
109
+ return tileset3d !== null && tileset3d.isLoaded();
110
+ }
111
+
112
+ shouldUpdateState({changeFlags}: UpdateParameters<this>): boolean {
113
+ return changeFlags.somethingChanged;
114
+ }
115
+
116
+ updateState({props, oldProps, changeFlags}: UpdateParameters<this>): void {
117
+ if (props.data && props.data !== oldProps.data) {
118
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
119
+ this._loadTileset(props.data);
120
+ }
121
+
122
+ if (changeFlags.viewportChanged) {
123
+ const {activeViewports} = this.state;
124
+ const viewportsNumber = Object.keys(activeViewports).length;
125
+ if (viewportsNumber) {
126
+ this._updateTileset(activeViewports);
127
+ this.state.lastUpdatedViewports = activeViewports;
128
+ this.state.activeViewports = {};
129
+ }
130
+ }
131
+ if (changeFlags.propsChanged) {
132
+ const {layerMap} = this.state;
133
+ for (const key in layerMap) {
134
+ layerMap[key].needsUpdate = true;
135
+ }
136
+ }
137
+ }
138
+
139
+ activateViewport(viewport: Viewport): void {
140
+ const {activeViewports, lastUpdatedViewports} = this.state;
141
+ this.internalState.viewport = viewport;
142
+
143
+ activeViewports[viewport.id] = viewport;
144
+ const lastViewport = lastUpdatedViewports?.[viewport.id];
145
+ if (!lastViewport || !viewport.equals(lastViewport)) {
146
+ this.setChangeFlags({viewportChanged: true});
147
+ this.setNeedsUpdate();
148
+ }
149
+ }
150
+
151
+ getPickingInfo({info, sourceLayer}: GetPickingInfoParams) {
152
+ const sourceTile = sourceLayer && (sourceLayer.props as any).tile;
153
+ if (info.picked) {
154
+ info.object = sourceTile;
155
+ }
156
+ (info as any).sourceTile = sourceTile;
157
+
158
+ return info;
159
+ }
160
+
161
+ filterSubLayer({layer, viewport}: FilterContext): boolean {
162
+ // All sublayers will have a tile prop
163
+ const {tile} = layer.props as unknown as {tile: Tile3D};
164
+ const {id: viewportId} = viewport;
165
+ return tile.selected && tile.viewportIds.includes(viewportId);
166
+ }
167
+
168
+ protected _updateAutoHighlight(info: PickingInfo): void {
169
+ const sourceTile = (info as any).sourceTile;
170
+ const layerCache = this.state.layerMap[sourceTile?.id];
171
+ if (layerCache && layerCache.layer) {
172
+ layerCache.layer.updateAutoHighlight(info);
173
+ }
174
+ }
175
+
176
+ private async _loadTileset(tilesetUrl) {
177
+ const {loadOptions = {}} = this.props;
178
+
179
+ // TODO: deprecate `loader` in v9.0
180
+ // @ts-ignore
181
+ const loaders = this.props.loader || this.props.loaders;
182
+ const loader = Array.isArray(loaders) ? loaders[0] : loaders;
183
+
184
+ const options = {loadOptions: {...loadOptions}};
185
+ let actualTilesetUrl = tilesetUrl;
186
+ // @ts-expect-error preload
187
+ if (loader.preload) {
188
+ // @ts-expect-error preload
189
+ const preloadOptions = await loader.preload(tilesetUrl, loadOptions);
190
+ if (preloadOptions.url) {
191
+ actualTilesetUrl = preloadOptions.url;
192
+ }
193
+
194
+ if (preloadOptions.headers) {
195
+ options.loadOptions.fetch = {
196
+ ...options.loadOptions.fetch,
197
+ headers: preloadOptions.headers
198
+ };
199
+ }
200
+ Object.assign(options, preloadOptions);
201
+ }
202
+ const tilesetJson = await load(actualTilesetUrl, loader, options.loadOptions);
203
+
204
+ const tileset3d = new Tileset3D(tilesetJson, {
205
+ onTileLoad: this._onTileLoad.bind(this),
206
+ onTileUnload: this._onTileUnload.bind(this),
207
+ onTileError: this.props.onTileError,
208
+ ...options
209
+ });
210
+
211
+ this.setState({
212
+ tileset3d,
213
+ layerMap: {}
214
+ });
215
+
216
+ this._updateTileset(this.state.activeViewports);
217
+ this.props.onTilesetLoad(tileset3d);
218
+ }
219
+
220
+ private _onTileLoad(tileHeader: Tile3D): void {
221
+ const {lastUpdatedViewports} = this.state;
222
+ this.props.onTileLoad(tileHeader);
223
+ this._updateTileset(lastUpdatedViewports);
224
+ this.setNeedsUpdate();
225
+ }
226
+
227
+ private _onTileUnload(tileHeader: Tile3D): void {
228
+ // Was cleaned up from tileset cache. We no longer need to track it.
229
+ delete this.state.layerMap[tileHeader.id];
230
+ this.props.onTileUnload(tileHeader);
231
+ }
232
+
233
+ private _updateTileset(viewports: {[viewportId: string]: Viewport} | null): void {
234
+ if (!viewports) {
235
+ return;
236
+ }
237
+ const {tileset3d} = this.state;
238
+ const {timeline} = this.context;
239
+ const viewportsNumber = Object.keys(viewports).length;
240
+ if (!timeline || !viewportsNumber || !tileset3d) {
241
+ return;
242
+ }
243
+
244
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
245
+ tileset3d.selectTiles(Object.values(viewports)).then(frameNumber => {
246
+ const tilesetChanged = this.state.frameNumber !== frameNumber;
247
+ if (tilesetChanged) {
248
+ this.setState({frameNumber});
249
+ }
250
+ });
251
+ }
252
+
253
+ private _getSubLayer(
254
+ tileHeader: Tile3D,
255
+ oldLayer?: Layer
256
+ ): MeshLayer<DataT> | PointCloudLayer<DataT> | ScenegraphLayer<DataT> | null {
257
+ if (!tileHeader.content) {
258
+ return null;
259
+ }
260
+
261
+ switch (tileHeader.type) {
262
+ case TILE_TYPE.POINTCLOUD:
263
+ return this._makePointCloudLayer(tileHeader, oldLayer as PointCloudLayer<DataT>);
264
+ case TILE_TYPE.SCENEGRAPH:
265
+ return this._make3DModelLayer(tileHeader);
266
+ case TILE_TYPE.MESH:
267
+ return this._makeSimpleMeshLayer(tileHeader, oldLayer as MeshLayer<DataT>);
268
+ default:
269
+ throw new Error(`Tile3DLayer: Failed to render layer of type ${tileHeader.content.type}`);
270
+ }
271
+ }
272
+
273
+ private _makePointCloudLayer(
274
+ tileHeader: Tile3D,
275
+ oldLayer?: PointCloudLayer<DataT>
276
+ ): PointCloudLayer<DataT> | null {
277
+ const {attributes, pointCount, constantRGBA, cartographicOrigin, modelMatrix} =
278
+ tileHeader.content;
279
+ const {positions, normals, colors} = attributes;
280
+
281
+ if (!positions) {
282
+ return null;
283
+ }
284
+ const data = (oldLayer && oldLayer.props.data) || {
285
+ header: {
286
+ vertexCount: pointCount
287
+ },
288
+ attributes: {
289
+ POSITION: positions,
290
+ NORMAL: normals,
291
+ COLOR_0: colors
292
+ }
293
+ };
294
+
295
+ const {pointSize, getPointColor} = this.props;
296
+ const SubLayerClass = this.getSubLayerClass('pointcloud', PointCloudLayer);
297
+ return new SubLayerClass(
298
+ {
299
+ pointSize
300
+ },
301
+ this.getSubLayerProps({
302
+ id: 'pointcloud'
303
+ }),
304
+ {
305
+ id: `${this.id}-pointcloud-${tileHeader.id}`,
306
+ tile: tileHeader,
307
+ data,
308
+ coordinateSystem: COORDINATE_SYSTEM.METER_OFFSETS,
309
+ coordinateOrigin: cartographicOrigin,
310
+ modelMatrix,
311
+ getColor: constantRGBA || getPointColor,
312
+ _offset: 0
313
+ }
314
+ );
315
+ }
316
+
317
+ private _make3DModelLayer(tileHeader: Tile3D): ScenegraphLayer<DataT> {
318
+ const {gltf, instances, cartographicOrigin, modelMatrix} = tileHeader.content;
319
+
320
+ const SubLayerClass = this.getSubLayerClass('scenegraph', ScenegraphLayer);
321
+
322
+ return new SubLayerClass(
323
+ {
324
+ _lighting: 'pbr'
325
+ },
326
+ this.getSubLayerProps({
327
+ id: 'scenegraph'
328
+ }),
329
+ {
330
+ id: `${this.id}-scenegraph-${tileHeader.id}`,
331
+ tile: tileHeader,
332
+ data: instances || SINGLE_DATA,
333
+ scenegraph: gltf,
334
+
335
+ coordinateSystem: COORDINATE_SYSTEM.METER_OFFSETS,
336
+ coordinateOrigin: cartographicOrigin,
337
+ modelMatrix,
338
+ getTransformMatrix: instance => instance.modelMatrix,
339
+ getPosition: [0, 0, 0],
340
+ _offset: 0
341
+ }
342
+ );
343
+ }
344
+
345
+ private _makeSimpleMeshLayer(tileHeader: Tile3D, oldLayer?: MeshLayer<DataT>): MeshLayer<DataT> {
346
+ const content = tileHeader.content;
347
+ const {
348
+ attributes,
349
+ indices,
350
+ modelMatrix,
351
+ cartographicOrigin,
352
+ coordinateSystem = COORDINATE_SYSTEM.METER_OFFSETS,
353
+ material,
354
+ featureIds
355
+ } = content;
356
+ const {_getMeshColor} = this.props;
357
+
358
+ const geometry =
359
+ (oldLayer && oldLayer.props.mesh) ||
360
+ new Geometry({
361
+ topology: 'triangle-list',
362
+ attributes: getMeshGeometry(attributes),
363
+ indices
364
+ });
365
+
366
+ const SubLayerClass = this.getSubLayerClass('mesh', MeshLayer);
367
+
368
+ return new SubLayerClass(
369
+ this.getSubLayerProps({
370
+ id: 'mesh'
371
+ }),
372
+ {
373
+ id: `${this.id}-mesh-${tileHeader.id}`,
374
+ tile: tileHeader,
375
+ mesh: geometry,
376
+ data: SINGLE_DATA,
377
+ getColor: _getMeshColor(tileHeader),
378
+ pbrMaterial: material,
379
+ modelMatrix,
380
+ coordinateOrigin: cartographicOrigin,
381
+ coordinateSystem,
382
+ featureIds,
383
+ _offset: 0
384
+ }
385
+ );
386
+ }
387
+
388
+ renderLayers(): Layer | null | LayersList {
389
+ const {tileset3d, layerMap} = this.state;
390
+ if (!tileset3d) {
391
+ return null;
392
+ }
393
+
394
+ // loaders.gl doesn't provide a type for tileset3d.tiles
395
+ return (tileset3d.tiles as Tile3D[])
396
+ .map(tile => {
397
+ const layerCache = (layerMap[tile.id] = layerMap[tile.id] || {tile});
398
+ let {layer} = layerCache;
399
+ if (tile.selected) {
400
+ // render selected tiles
401
+ if (!layer) {
402
+ // create layer
403
+ layer = this._getSubLayer(tile);
404
+ } else if (layerCache.needsUpdate) {
405
+ // props have changed, rerender layer
406
+ layer = this._getSubLayer(tile, layer);
407
+ layerCache.needsUpdate = false;
408
+ }
409
+ }
410
+ layerCache.layer = layer;
411
+ return layer;
412
+ })
413
+ .filter(Boolean);
414
+ }
415
+ }
416
+
417
+ function getMeshGeometry(contentAttributes: MeshAttributes): MeshAttributes {
418
+ const attributes: MeshAttributes = {};
419
+ attributes.positions = {
420
+ ...contentAttributes.positions,
421
+ value: new Float32Array(contentAttributes.positions.value)
422
+ };
423
+ if (contentAttributes.normals) {
424
+ attributes.normals = contentAttributes.normals;
425
+ }
426
+ if (contentAttributes.texCoords) {
427
+ attributes.texCoords = contentAttributes.texCoords;
428
+ }
429
+ if (contentAttributes.colors) {
430
+ attributes.colors = contentAttributes.colors;
431
+ }
432
+ if (contentAttributes.uvRegions) {
433
+ attributes.uvRegions = contentAttributes.uvRegions;
434
+ }
435
+ return attributes;
436
+ }
@@ -52,6 +52,11 @@ const defaultProps = {
52
52
  zoomOffset: 0
53
53
  };
54
54
  export default class TileLayer extends CompositeLayer {
55
+ constructor(...args) {
56
+ super(...args);
57
+ this.state = void 0;
58
+ }
59
+
55
60
  initializeState() {
56
61
  this.state = {
57
62
  tileset: null,
@@ -66,9 +71,10 @@ export default class TileLayer extends CompositeLayer {
66
71
  }
67
72
 
68
73
  get isLoaded() {
69
- var _this$state2, _this$state2$tileset, _this$state2$tileset$;
74
+ var _this$state2, _this$state2$tileset;
70
75
 
71
- return (_this$state2 = this.state) === null || _this$state2 === void 0 ? void 0 : (_this$state2$tileset = _this$state2.tileset) === null || _this$state2$tileset === void 0 ? void 0 : (_this$state2$tileset$ = _this$state2$tileset.selectedTiles) === null || _this$state2$tileset$ === void 0 ? void 0 : _this$state2$tileset$.every(tile => tile.isLoaded && tile.layers && tile.layers.every(layer => layer.isLoaded));
76
+ const selectedTiles = (_this$state2 = this.state) === null || _this$state2 === void 0 ? void 0 : (_this$state2$tileset = _this$state2.tileset) === null || _this$state2$tileset === void 0 ? void 0 : _this$state2$tileset.selectedTiles;
77
+ return selectedTiles ? selectedTiles.every(tile => tile.isLoaded && tile.layers && tile.layers.every(layer => layer.isLoaded)) : false;
72
78
  }
73
79
 
74
80
  shouldUpdateState({
@@ -97,7 +103,7 @@ export default class TileLayer extends CompositeLayer {
97
103
  if (dataChanged) {
98
104
  tileset.reloadAll();
99
105
  } else {
100
- this.state.tileset.tiles.forEach(tile => {
106
+ tileset.tiles.forEach(tile => {
101
107
  tile.layers = null;
102
108
  });
103
109
  }
@@ -136,9 +142,7 @@ export default class TileLayer extends CompositeLayer {
136
142
  }
137
143
 
138
144
  _updateTileset() {
139
- const {
140
- tileset
141
- } = this.state;
145
+ const tileset = this.state.tileset;
142
146
  const {
143
147
  zRange,
144
148
  modelMatrix
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/tile-layer/tile-layer.ts"],"names":["CompositeLayer","_flatten","flatten","GeoJsonLayer","Tileset2D","STRATEGY_DEFAULT","urlType","getURLFromTemplate","defaultProps","TilesetClass","data","type","value","dataComparator","equal","renderSubLayers","props","getTileData","optional","onViewportLoad","onTileLoad","tile","onTileUnload","onTileError","err","console","error","extent","compare","tileSize","maxZoom","minZoom","maxCacheSize","maxCacheByteSize","refinementStrategy","zRange","maxRequests","zoomOffset","TileLayer","initializeState","state","tileset","isLoaded","finalizeState","finalize","selectedTiles","every","layers","layer","shouldUpdateState","changeFlags","somethingChanged","updateState","propsChanged","propsOrDataChanged","updateTriggersChanged","dataChanged","all","_getTilesetOptions","setState","setOptions","reloadAll","tiles","forEach","_updateTileset","bind","_onTileLoad","_onTileError","_onTileUnload","modelMatrix","frameNumber","update","context","viewport","loadingStateChanged","tilesetChanged","_onViewportLoad","setNeedsUpdate","fetch","signal","url","Array","isArray","propName","getSubLayerPropsByTile","getPickingInfo","info","sourceLayer","sourceTile","picked","_updateAutoHighlight","updateAutoHighlight","renderLayers","map","subLayerProps","content","getSubLayerProps","id","updateTriggers","_offset","Boolean","clone","Object","keys","some","filterSubLayer","cullRect","isTileVisible","layerName"],"mappings":"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","sourcesContent":["import {\n CompositeLayer,\n CompositeLayerProps,\n Layer,\n LayerProps,\n UpdateParameters,\n PickingInfo,\n GetPickingInfoParams,\n DefaultProps,\n FilterContext,\n _flatten as flatten\n} from '@deck.gl/core';\nimport {GeoJsonLayer} from '@deck.gl/layers';\nimport {LayersList} from '@deck.gl/core';\n\nimport type {TileLoadProps, ZRange} from '../tileset-2d';\nimport {\n Tileset2D,\n Tile2DHeader,\n RefinementStrategy,\n STRATEGY_DEFAULT,\n Tileset2DProps\n} from '../tileset-2d';\nimport {urlType, URLTemplate, getURLFromTemplate} from '../tileset-2d';\n\nconst defaultProps: DefaultProps<TileLayerProps> = {\n TilesetClass: Tileset2D,\n data: {type: 'data', value: []},\n dataComparator: urlType.equal,\n renderSubLayers: {type: 'function', value: props => new GeoJsonLayer(props)},\n getTileData: {type: 'function', optional: true, value: null},\n // TODO - change to onViewportLoad to align with Tile3DLayer\n onViewportLoad: {type: 'function', optional: true, value: null},\n onTileLoad: {type: 'function', value: tile => {}},\n onTileUnload: {type: 'function', value: tile => {}},\n // eslint-disable-next-line\n onTileError: {type: 'function', value: err => console.error(err)},\n extent: {type: 'array', optional: true, value: null, compare: true},\n tileSize: 512,\n maxZoom: null,\n minZoom: 0,\n maxCacheSize: null,\n maxCacheByteSize: null,\n refinementStrategy: STRATEGY_DEFAULT,\n zRange: null,\n maxRequests: 6,\n zoomOffset: 0\n};\n\n/** All props supported by the TileLayer */\nexport type TileLayerProps<DataT = any> = CompositeLayerProps & _TileLayerProps<DataT>;\n\n/** Props added by the TileLayer */\ntype _TileLayerProps<DataT> = {\n data: URLTemplate;\n /**\n * Optionally implement a custom indexing scheme.\n */\n TilesetClass?: typeof Tileset2D;\n /**\n * Renders one or an array of Layer instances.\n */\n renderSubLayers?: (\n props: TileLayerProps<DataT> & {\n id: string;\n data: DataT;\n _offset: number;\n tile: Tile2DHeader<DataT>;\n }\n ) => Layer | null | LayersList;\n /**\n * If supplied, `getTileData` is called to retrieve the data of each tile.\n */\n getTileData?: ((props: TileLoadProps) => Promise<DataT> | DataT) | null;\n\n /** Called when all tiles in the current viewport are loaded. */\n onViewportLoad?: ((tiles: Tile2DHeader<DataT>[]) => void) | null;\n\n /** Called when a tile successfully loads. */\n onTileLoad?: (tile: Tile2DHeader<DataT>) => void;\n\n /** Called when a tile is cleared from cache. */\n onTileUnload?: (tile: Tile2DHeader<DataT>) => void;\n\n /** Called when a tile failed to load. */\n onTileError?: (err: any, tile?) => void;\n\n /** The bounding box of the layer's data. */\n extent?: number[] | null;\n\n /** The pixel dimension of the tiles, usually a power of 2. */\n tileSize?: number;\n\n /** The max zoom level of the layer's data.\n * @default null\n */\n maxZoom?: number | null;\n\n /** The min zoom level of the layer's data.\n * @default 0\n */\n minZoom?: number | null;\n\n /** The maximum number of tiles that can be cached. */\n maxCacheSize?: number | null;\n\n /**\n * The maximum memory used for caching tiles.\n *\n * @default null\n */\n maxCacheByteSize?: number | null;\n\n /**\n * How the tile layer refines the visibility of tiles.\n *\n * @default 'best-available'\n */\n refinementStrategy?: RefinementStrategy;\n\n /** Range of minimum and maximum heights in the tile. */\n zRange?: ZRange | null;\n\n /**\n * The maximum number of concurrent getTileData calls.\n *\n * @default 6\n */\n maxRequests?: number;\n\n /**\n * This offset changes the zoom level at which the tiles are fetched.\n *\n * Needs to be an integer.\n *\n * @default 0\n */\n zoomOffset?: number;\n};\n\nexport type TiledPickingInfo<DataT = any> = PickingInfo & {\n tile?: Tile2DHeader<DataT>;\n};\n\n/**\n * The TileLayer is a composite layer that makes it possible to visualize very large datasets.\n *\n * Instead of fetching the entire dataset, it only loads and renders what's visible in the current viewport.\n */\nexport default class TileLayer<DataT = any, ExtraPropsT extends {} = {}> extends CompositeLayer<\n ExtraPropsT & Required<_TileLayerProps<DataT>>\n> {\n static defaultProps: DefaultProps = defaultProps;\n static layerName = 'TileLayer';\n\n initializeState() {\n this.state = {\n tileset: null,\n isLoaded: false\n };\n }\n\n finalizeState() {\n this.state?.tileset?.finalize();\n }\n\n get isLoaded(): boolean {\n return this.state?.tileset?.selectedTiles?.every(\n tile => tile.isLoaded && tile.layers && tile.layers.every(layer => layer.isLoaded)\n );\n }\n\n shouldUpdateState({changeFlags}): boolean {\n return changeFlags.somethingChanged;\n }\n\n updateState({changeFlags}: UpdateParameters<this>) {\n let {tileset} = this.state;\n const propsChanged = changeFlags.propsOrDataChanged || changeFlags.updateTriggersChanged;\n const dataChanged =\n changeFlags.dataChanged ||\n (changeFlags.updateTriggersChanged &&\n (changeFlags.updateTriggersChanged.all || changeFlags.updateTriggersChanged.getTileData));\n\n if (!tileset) {\n tileset = new this.props.TilesetClass(this._getTilesetOptions());\n this.setState({tileset});\n } else if (propsChanged) {\n tileset.setOptions(this._getTilesetOptions());\n\n if (dataChanged) {\n // reload all tiles\n // use cached layers until new content is loaded\n tileset.reloadAll();\n } else {\n // some render options changed, regenerate sub layers now\n this.state.tileset.tiles.forEach(tile => {\n tile.layers = null;\n });\n }\n }\n\n this._updateTileset();\n }\n\n _getTilesetOptions(): Tileset2DProps {\n const {\n tileSize,\n maxCacheSize,\n maxCacheByteSize,\n refinementStrategy,\n extent,\n maxZoom,\n minZoom,\n maxRequests,\n zoomOffset\n } = this.props;\n\n return {\n maxCacheSize,\n maxCacheByteSize,\n maxZoom,\n minZoom,\n tileSize,\n refinementStrategy,\n extent,\n maxRequests,\n zoomOffset,\n\n getTileData: this.getTileData.bind(this),\n onTileLoad: this._onTileLoad.bind(this),\n onTileError: this._onTileError.bind(this),\n onTileUnload: this._onTileUnload.bind(this)\n };\n }\n\n private _updateTileset(): void {\n const {tileset} = this.state;\n const {zRange, modelMatrix} = this.props;\n const frameNumber = tileset.update(this.context.viewport, {zRange, modelMatrix});\n const {isLoaded} = tileset;\n\n const loadingStateChanged = this.state.isLoaded !== isLoaded;\n const tilesetChanged = this.state.frameNumber !== frameNumber;\n\n if (isLoaded && (loadingStateChanged || tilesetChanged)) {\n this._onViewportLoad();\n }\n\n if (tilesetChanged) {\n // Save the tileset frame number - trigger a rerender\n this.setState({frameNumber});\n }\n // Save the loaded state - should not trigger a rerender\n this.state.isLoaded = isLoaded;\n }\n\n _onViewportLoad(): void {\n const {tileset} = this.state;\n const {onViewportLoad} = this.props;\n\n if (onViewportLoad) {\n onViewportLoad(tileset.selectedTiles);\n }\n }\n\n _onTileLoad(tile: Tile2DHeader<DataT>): void {\n this.props.onTileLoad(tile);\n tile.layers = null;\n\n this.setNeedsUpdate();\n }\n\n _onTileError(error: any, tile: Tile2DHeader<DataT>) {\n this.props.onTileError(error);\n tile.layers = null;\n\n this.setNeedsUpdate();\n }\n\n _onTileUnload(tile: Tile2DHeader<DataT>) {\n this.props.onTileUnload(tile);\n }\n\n // Methods for subclass to override\n\n getTileData(tile: TileLoadProps): Promise<DataT> | DataT | null {\n const {data, getTileData, fetch} = this.props;\n const {signal} = tile;\n\n tile.url =\n typeof data === 'string' || Array.isArray(data) ? getURLFromTemplate(data, tile) : null;\n\n if (getTileData) {\n return getTileData(tile);\n }\n if (fetch && tile.url) {\n return fetch(tile.url, {propName: 'data', layer: this, signal});\n }\n return null;\n }\n\n renderSubLayers(\n props: TileLayer['props'] & {\n id: string;\n data: DataT;\n _offset: number;\n tile: Tile2DHeader<DataT>;\n }\n ): Layer | null | LayersList {\n return this.props.renderSubLayers(props);\n }\n\n getSubLayerPropsByTile(tile: Tile2DHeader): Partial<LayerProps> | null {\n return null;\n }\n\n getPickingInfo({info, sourceLayer}: GetPickingInfoParams): TiledPickingInfo<DataT> {\n const sourceTile = (sourceLayer as any).props.tile;\n if (info.picked) {\n (info as any).tile = sourceTile;\n }\n (info as any).sourceTile = sourceTile;\n return info;\n }\n\n protected _updateAutoHighlight(info: PickingInfo): void {\n const sourceTile = (info as any).sourceTile as Tile2DHeader;\n if (sourceTile && sourceTile.layers) {\n for (const layer of sourceTile.layers) {\n layer.updateAutoHighlight(info);\n }\n }\n }\n\n renderLayers(): Layer | null | LayersList {\n return this.state.tileset.tiles.map((tile: Tile2DHeader) => {\n const subLayerProps = this.getSubLayerPropsByTile(tile);\n // cache the rendered layer in the tile\n if (!tile.isLoaded && !tile.content) {\n // nothing to show\n } else if (!tile.layers) {\n const layers = this.renderSubLayers({\n ...this.props,\n ...this.getSubLayerProps({\n id: tile.id,\n updateTriggers: this.props.updateTriggers\n }),\n data: tile.content,\n _offset: 0,\n tile\n });\n tile.layers = (flatten(layers, Boolean) as Layer<{tile?: Tile2DHeader}>[]).map(layer =>\n layer.clone({\n tile,\n ...subLayerProps\n })\n );\n } else if (\n subLayerProps &&\n tile.layers[0] &&\n Object.keys(subLayerProps).some(\n propName => tile.layers![0].props[propName] !== subLayerProps[propName]\n )\n ) {\n tile.layers = tile.layers.map(layer => layer.clone(subLayerProps));\n }\n return tile.layers;\n });\n }\n\n filterSubLayer({layer, cullRect}: FilterContext) {\n const {tile} = (layer as Layer<{tile: Tile2DHeader}>).props;\n return this.state.tileset.isTileVisible(tile, cullRect);\n }\n}\n"],"file":"tile-layer.js"}
1
+ {"version":3,"sources":["../../../src/tile-layer/tile-layer.ts"],"names":["CompositeLayer","_flatten","flatten","GeoJsonLayer","Tileset2D","STRATEGY_DEFAULT","urlType","getURLFromTemplate","defaultProps","TilesetClass","data","type","value","dataComparator","equal","renderSubLayers","props","getTileData","optional","onViewportLoad","onTileLoad","tile","onTileUnload","onTileError","err","console","error","extent","compare","tileSize","maxZoom","minZoom","maxCacheSize","maxCacheByteSize","refinementStrategy","zRange","maxRequests","zoomOffset","TileLayer","state","initializeState","tileset","isLoaded","finalizeState","finalize","selectedTiles","every","layers","layer","shouldUpdateState","changeFlags","somethingChanged","updateState","propsChanged","propsOrDataChanged","updateTriggersChanged","dataChanged","all","_getTilesetOptions","setState","setOptions","reloadAll","tiles","forEach","_updateTileset","bind","_onTileLoad","_onTileError","_onTileUnload","modelMatrix","frameNumber","update","context","viewport","loadingStateChanged","tilesetChanged","_onViewportLoad","setNeedsUpdate","fetch","signal","url","Array","isArray","propName","getSubLayerPropsByTile","getPickingInfo","info","sourceLayer","sourceTile","picked","_updateAutoHighlight","updateAutoHighlight","renderLayers","map","subLayerProps","content","getSubLayerProps","id","updateTriggers","_offset","Boolean","clone","Object","keys","some","filterSubLayer","cullRect","isTileVisible","layerName"],"mappings":"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","sourcesContent":["import {\n CompositeLayer,\n CompositeLayerProps,\n Layer,\n LayerProps,\n UpdateParameters,\n PickingInfo,\n GetPickingInfoParams,\n DefaultProps,\n FilterContext,\n _flatten as flatten\n} from '@deck.gl/core';\nimport {GeoJsonLayer} from '@deck.gl/layers';\nimport {LayersList} from '@deck.gl/core';\n\nimport type {TileLoadProps, ZRange} from '../tileset-2d';\nimport {\n Tileset2D,\n Tile2DHeader,\n RefinementStrategy,\n STRATEGY_DEFAULT,\n Tileset2DProps\n} from '../tileset-2d';\nimport {urlType, URLTemplate, getURLFromTemplate} from '../tileset-2d';\n\nconst defaultProps: DefaultProps<TileLayerProps> = {\n TilesetClass: Tileset2D,\n data: {type: 'data', value: []},\n dataComparator: urlType.equal,\n renderSubLayers: {type: 'function', value: (props: any) => new GeoJsonLayer(props)},\n getTileData: {type: 'function', optional: true, value: null},\n // TODO - change to onViewportLoad to align with Tile3DLayer\n onViewportLoad: {type: 'function', optional: true, value: null},\n onTileLoad: {type: 'function', value: tile => {}},\n onTileUnload: {type: 'function', value: tile => {}},\n // eslint-disable-next-line\n onTileError: {type: 'function', value: err => console.error(err)},\n extent: {type: 'array', optional: true, value: null, compare: true},\n tileSize: 512,\n maxZoom: null,\n minZoom: 0,\n maxCacheSize: null,\n maxCacheByteSize: null,\n refinementStrategy: STRATEGY_DEFAULT,\n zRange: null,\n maxRequests: 6,\n zoomOffset: 0\n};\n\n/** All props supported by the TileLayer */\nexport type TileLayerProps<DataT = unknown> = CompositeLayerProps & _TileLayerProps<DataT>;\n\n/** Props added by the TileLayer */\ntype _TileLayerProps<DataT> = {\n data: URLTemplate;\n /**\n * Optionally implement a custom indexing scheme.\n */\n TilesetClass?: typeof Tileset2D;\n /**\n * Renders one or an array of Layer instances.\n */\n renderSubLayers?: (\n props: TileLayerProps<DataT> & {\n id: string;\n data: DataT;\n _offset: number;\n tile: Tile2DHeader<DataT>;\n }\n ) => Layer | null | LayersList;\n /**\n * If supplied, `getTileData` is called to retrieve the data of each tile.\n */\n getTileData?: ((props: TileLoadProps) => Promise<DataT> | DataT) | null;\n\n /** Called when all tiles in the current viewport are loaded. */\n onViewportLoad?: ((tiles: Tile2DHeader<DataT>[]) => void) | null;\n\n /** Called when a tile successfully loads. */\n onTileLoad?: (tile: Tile2DHeader<DataT>) => void;\n\n /** Called when a tile is cleared from cache. */\n onTileUnload?: (tile: Tile2DHeader<DataT>) => void;\n\n /** Called when a tile failed to load. */\n onTileError?: (err: any, tile?) => void;\n\n /** The bounding box of the layer's data. */\n extent?: number[] | null;\n\n /** The pixel dimension of the tiles, usually a power of 2. */\n tileSize?: number;\n\n /** The max zoom level of the layer's data.\n * @default null\n */\n maxZoom?: number | null;\n\n /** The min zoom level of the layer's data.\n * @default 0\n */\n minZoom?: number | null;\n\n /** The maximum number of tiles that can be cached. */\n maxCacheSize?: number | null;\n\n /**\n * The maximum memory used for caching tiles.\n *\n * @default null\n */\n maxCacheByteSize?: number | null;\n\n /**\n * How the tile layer refines the visibility of tiles.\n *\n * @default 'best-available'\n */\n refinementStrategy?: RefinementStrategy;\n\n /** Range of minimum and maximum heights in the tile. */\n zRange?: ZRange | null;\n\n /**\n * The maximum number of concurrent getTileData calls.\n *\n * @default 6\n */\n maxRequests?: number;\n\n /**\n * This offset changes the zoom level at which the tiles are fetched.\n *\n * Needs to be an integer.\n *\n * @default 0\n */\n zoomOffset?: number;\n};\n\nexport type TiledPickingInfo<DataT = any> = PickingInfo & {\n tile?: Tile2DHeader<DataT>;\n};\n\n/**\n * The TileLayer is a composite layer that makes it possible to visualize very large datasets.\n *\n * Instead of fetching the entire dataset, it only loads and renders what's visible in the current viewport.\n */\nexport default class TileLayer<DataT = any, ExtraPropsT extends {} = {}> extends CompositeLayer<\n ExtraPropsT & Required<_TileLayerProps<DataT>>\n> {\n static defaultProps: DefaultProps = defaultProps;\n static layerName = 'TileLayer';\n\n state!: {\n tileset: Tileset2D | null;\n isLoaded: boolean;\n frameNumber?: number;\n };\n\n initializeState() {\n this.state = {\n tileset: null,\n isLoaded: false\n };\n }\n\n finalizeState() {\n this.state?.tileset?.finalize();\n }\n\n get isLoaded(): boolean {\n const selectedTiles = this.state?.tileset?.selectedTiles;\n return selectedTiles\n ? selectedTiles.every(\n tile => tile.isLoaded && tile.layers && tile.layers.every(layer => layer.isLoaded)\n )\n : false;\n }\n\n shouldUpdateState({changeFlags}): boolean {\n return changeFlags.somethingChanged;\n }\n\n updateState({changeFlags}: UpdateParameters<this>) {\n let {tileset} = this.state;\n const propsChanged = changeFlags.propsOrDataChanged || changeFlags.updateTriggersChanged;\n const dataChanged =\n changeFlags.dataChanged ||\n (changeFlags.updateTriggersChanged &&\n (changeFlags.updateTriggersChanged.all || changeFlags.updateTriggersChanged.getTileData));\n\n if (!tileset) {\n tileset = new this.props.TilesetClass(this._getTilesetOptions());\n this.setState({tileset});\n } else if (propsChanged) {\n tileset.setOptions(this._getTilesetOptions());\n\n if (dataChanged) {\n // reload all tiles\n // use cached layers until new content is loaded\n tileset.reloadAll();\n } else {\n // some render options changed, regenerate sub layers now\n tileset.tiles.forEach(tile => {\n tile.layers = null;\n });\n }\n }\n\n this._updateTileset();\n }\n\n _getTilesetOptions(): Tileset2DProps {\n const {\n tileSize,\n maxCacheSize,\n maxCacheByteSize,\n refinementStrategy,\n extent,\n maxZoom,\n minZoom,\n maxRequests,\n zoomOffset\n } = this.props;\n\n return {\n maxCacheSize,\n maxCacheByteSize,\n maxZoom,\n minZoom,\n tileSize,\n refinementStrategy,\n extent,\n maxRequests,\n zoomOffset,\n\n getTileData: this.getTileData.bind(this),\n onTileLoad: this._onTileLoad.bind(this),\n onTileError: this._onTileError.bind(this),\n onTileUnload: this._onTileUnload.bind(this)\n };\n }\n\n private _updateTileset(): void {\n const tileset = this.state.tileset!;\n const {zRange, modelMatrix} = this.props;\n const frameNumber = tileset.update(this.context.viewport, {zRange, modelMatrix});\n const {isLoaded} = tileset;\n\n const loadingStateChanged = this.state.isLoaded !== isLoaded;\n const tilesetChanged = this.state.frameNumber !== frameNumber;\n\n if (isLoaded && (loadingStateChanged || tilesetChanged)) {\n this._onViewportLoad();\n }\n\n if (tilesetChanged) {\n // Save the tileset frame number - trigger a rerender\n this.setState({frameNumber});\n }\n // Save the loaded state - should not trigger a rerender\n this.state.isLoaded = isLoaded;\n }\n\n _onViewportLoad(): void {\n const {tileset} = this.state;\n const {onViewportLoad} = this.props;\n\n if (onViewportLoad) {\n // This method can only be called when tileset is defined and updated\n onViewportLoad(tileset!.selectedTiles!);\n }\n }\n\n _onTileLoad(tile: Tile2DHeader<DataT>): void {\n this.props.onTileLoad(tile);\n tile.layers = null;\n\n this.setNeedsUpdate();\n }\n\n _onTileError(error: any, tile: Tile2DHeader<DataT>) {\n this.props.onTileError(error);\n tile.layers = null;\n\n this.setNeedsUpdate();\n }\n\n _onTileUnload(tile: Tile2DHeader<DataT>) {\n this.props.onTileUnload(tile);\n }\n\n // Methods for subclass to override\n\n getTileData(tile: TileLoadProps): Promise<DataT> | DataT | null {\n const {data, getTileData, fetch} = this.props;\n const {signal} = tile;\n\n tile.url =\n typeof data === 'string' || Array.isArray(data) ? getURLFromTemplate(data, tile) : null;\n\n if (getTileData) {\n return getTileData(tile);\n }\n if (fetch && tile.url) {\n return fetch(tile.url, {propName: 'data', layer: this, signal});\n }\n return null;\n }\n\n renderSubLayers(\n props: TileLayer['props'] & {\n id: string;\n data: DataT;\n _offset: number;\n tile: Tile2DHeader<DataT>;\n }\n ): Layer | null | LayersList {\n return this.props.renderSubLayers(props);\n }\n\n getSubLayerPropsByTile(tile: Tile2DHeader): Partial<LayerProps> | null {\n return null;\n }\n\n getPickingInfo({info, sourceLayer}: GetPickingInfoParams): TiledPickingInfo<DataT> {\n const sourceTile = (sourceLayer as any).props.tile;\n if (info.picked) {\n (info as any).tile = sourceTile;\n }\n (info as any).sourceTile = sourceTile;\n return info;\n }\n\n protected _updateAutoHighlight(info: PickingInfo): void {\n const sourceTile = (info as any).sourceTile as Tile2DHeader;\n if (sourceTile && sourceTile.layers) {\n for (const layer of sourceTile.layers) {\n layer.updateAutoHighlight(info);\n }\n }\n }\n\n renderLayers(): Layer | null | LayersList {\n return this.state.tileset!.tiles.map((tile: Tile2DHeader) => {\n const subLayerProps = this.getSubLayerPropsByTile(tile);\n // cache the rendered layer in the tile\n if (!tile.isLoaded && !tile.content) {\n // nothing to show\n } else if (!tile.layers) {\n const layers = this.renderSubLayers({\n ...this.props,\n ...this.getSubLayerProps({\n id: tile.id,\n updateTriggers: this.props.updateTriggers\n }),\n data: tile.content,\n _offset: 0,\n tile\n });\n tile.layers = (flatten(layers, Boolean) as Layer<{tile?: Tile2DHeader}>[]).map(layer =>\n layer.clone({\n tile,\n ...subLayerProps\n })\n );\n } else if (\n subLayerProps &&\n tile.layers[0] &&\n Object.keys(subLayerProps).some(\n propName => tile.layers![0].props[propName] !== subLayerProps[propName]\n )\n ) {\n tile.layers = tile.layers.map(layer => layer.clone(subLayerProps));\n }\n return tile.layers;\n });\n }\n\n filterSubLayer({layer, cullRect}: FilterContext) {\n const {tile} = (layer as Layer<{tile: Tile2DHeader}>).props;\n return this.state.tileset!.isTileVisible(tile, cullRect);\n }\n}\n"],"file":"tile-layer.js"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/tileset-2d/tile-2d-traversal.ts"],"names":["WebMercatorViewport","_GlobeViewport","CullingVolume","Plane","AxisAlignedBoundingBox","makeOrientedBoundingBoxFromPoints","lngLatToWorld","osmTile2lngLat","TILE_SIZE","MAX_MAPS","REF_POINTS_5","REF_POINTS_9","concat","REF_POINTS_11","OSMNode","constructor","x","y","z","childVisible","selected","_children","children","update","params","viewport","cullingVolume","elevationBounds","minZ","maxZ","bounds","offset","project","boundingVolume","getBoundingVolume","insideBounds","isInside","computeVisibility","distance","distanceTo","cameraPosition","scale","height","Math","floor","log2","child","getSelected","result","push","node","minX","minY","maxX","maxY","pow","extent","zRange","worldOffset","refPoints","refPointPositions","p","lngLat","originX","originY","getOSMTileIndices","resolution","projectPosition","planes","Object","values","getFrustumPlanes","map","normal","clone","negate","unitsPerMeter","distanceScales","elevationMin","elevationMax","pitch","minLng","minLat","maxLng","maxLat","topLeft","bottomRight","root","traversalParams","subViewports","length"],"mappings":"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","sourcesContent":["import {Viewport, WebMercatorViewport, _GlobeViewport} from '@deck.gl/core';\n\nimport {\n CullingVolume,\n Plane,\n AxisAlignedBoundingBox,\n makeOrientedBoundingBoxFromPoints\n} from '@math.gl/culling';\nimport {lngLatToWorld} from '@math.gl/web-mercator';\nimport {Bounds, TileIndex, ZRange} from './types';\nimport {osmTile2lngLat} from './utils';\n\nconst TILE_SIZE = 512;\n// number of world copies to check\nconst MAX_MAPS = 3;\n// for calculating bounding volume of a tile in a non-web-mercator viewport\nconst REF_POINTS_5 = [\n [0.5, 0.5],\n [0, 0],\n [0, 1],\n [1, 0],\n [1, 1]\n]; // 4 corners and center\nconst REF_POINTS_9 = REF_POINTS_5.concat([\n [0, 0.5],\n [0.5, 0],\n [1, 0.5],\n [0.5, 1]\n]); // 4 corners, center and 4 mid points\nconst REF_POINTS_11 = REF_POINTS_9.concat([\n [0.25, 0.5],\n [0.75, 0.5]\n]); // 2 additional points on equator for top tile\n\nclass OSMNode {\n x: number;\n y: number;\n z: number;\n\n private childVisible?: boolean;\n private selected?: boolean;\n\n private _children?: OSMNode[];\n\n constructor(x, y, z) {\n this.x = x;\n this.y = y;\n this.z = z;\n }\n\n get children() {\n if (!this._children) {\n const x = this.x * 2;\n const y = this.y * 2;\n const z = this.z + 1;\n this._children = [\n new OSMNode(x, y, z),\n new OSMNode(x, y + 1, z),\n new OSMNode(x + 1, y, z),\n new OSMNode(x + 1, y + 1, z)\n ];\n }\n return this._children;\n }\n\n // eslint-disable-next-line complexity\n update(params: {\n viewport: Viewport;\n project: ((xyz: number[]) => number[]) | null;\n cullingVolume: CullingVolume;\n elevationBounds: ZRange;\n minZ: number;\n maxZ: number;\n bounds?: Bounds;\n offset: number;\n }) {\n const {viewport, cullingVolume, elevationBounds, minZ, maxZ, bounds, offset, project} = params;\n const boundingVolume = this.getBoundingVolume(elevationBounds, offset, project);\n\n // First, check if this tile is visible\n if (bounds && !this.insideBounds(bounds)) {\n return false;\n }\n\n const isInside = cullingVolume.computeVisibility(boundingVolume);\n if (isInside < 0) {\n return false;\n }\n\n // Avoid loading overlapping tiles - if a descendant is requested, do not request the ancester\n if (!this.childVisible) {\n let {z} = this;\n if (z < maxZ && z >= minZ) {\n // Adjust LOD\n // If the tile is far enough from the camera, accept a lower zoom level\n const distance =\n (boundingVolume.distanceTo(viewport.cameraPosition) * viewport.scale) / viewport.height;\n z += Math.floor(Math.log2(distance));\n }\n if (z >= maxZ) {\n // LOD is acceptable\n this.selected = true;\n return true;\n }\n }\n\n // LOD is not enough, recursively test child tiles\n this.selected = false;\n this.childVisible = true;\n for (const child of this.children) {\n child.update(params);\n }\n return true;\n }\n\n getSelected(result: OSMNode[] = []): OSMNode[] {\n if (this.selected) {\n result.push(this);\n }\n if (this._children) {\n for (const node of this._children) {\n node.getSelected(result);\n }\n }\n return result;\n }\n\n insideBounds([minX, minY, maxX, maxY]: Bounds): boolean {\n const scale = Math.pow(2, this.z);\n const extent = TILE_SIZE / scale;\n\n return (\n this.x * extent < maxX &&\n this.y * extent < maxY &&\n (this.x + 1) * extent > minX &&\n (this.y + 1) * extent > minY\n );\n }\n\n getBoundingVolume(\n zRange: ZRange,\n worldOffset: number,\n project: ((xyz: number[]) => number[]) | null\n ) {\n if (project) {\n // Custom projection\n // Estimate bounding box from sample points\n // At low zoom level we need more samples to calculate the bounding volume correctly\n const refPoints = this.z < 1 ? REF_POINTS_11 : this.z < 2 ? REF_POINTS_9 : REF_POINTS_5;\n\n // Convert from tile-relative coordinates to common space\n const refPointPositions: number[][] = [];\n for (const p of refPoints) {\n const lngLat: number[] = osmTile2lngLat(this.x + p[0], this.y + p[1], this.z);\n lngLat[2] = zRange[0];\n refPointPositions.push(project(lngLat));\n\n if (zRange[0] !== zRange[1]) {\n // Account for the elevation volume\n lngLat[2] = zRange[1];\n refPointPositions.push(project(lngLat));\n }\n }\n\n return makeOrientedBoundingBoxFromPoints(refPointPositions);\n }\n\n // Use WebMercator projection\n const scale = Math.pow(2, this.z);\n const extent = TILE_SIZE / scale;\n const originX = this.x * extent + worldOffset * TILE_SIZE;\n // deck's common space is y-flipped\n const originY = TILE_SIZE - (this.y + 1) * extent;\n\n return new AxisAlignedBoundingBox(\n [originX, originY, zRange[0]],\n [originX + extent, originY + extent, zRange[1]]\n );\n }\n}\n\n// eslint-disable-next-line complexity\nexport function getOSMTileIndices(\n viewport: Viewport,\n maxZ: number,\n zRange: ZRange | undefined,\n bounds?: Bounds\n): TileIndex[] {\n const project: ((xyz: number[]) => number[]) | null =\n viewport instanceof _GlobeViewport && viewport.resolution\n ? // eslint-disable-next-line @typescript-eslint/unbound-method\n viewport.projectPosition\n : null;\n\n // Get the culling volume of the current camera\n const planes: Plane[] = Object.values(viewport.getFrustumPlanes()).map(\n ({normal, distance}) => new Plane(normal.clone().negate(), distance)\n );\n const cullingVolume = new CullingVolume(planes);\n\n // Project zRange from meters to common space\n const unitsPerMeter = viewport.distanceScales.unitsPerMeter[2];\n const elevationMin = (zRange && zRange[0] * unitsPerMeter) || 0;\n const elevationMax = (zRange && zRange[1] * unitsPerMeter) || 0;\n\n // Always load at the current zoom level if pitch is small\n const minZ = viewport instanceof WebMercatorViewport && viewport.pitch <= 60 ? maxZ : 0;\n\n // Map extent to OSM position\n if (bounds) {\n const [minLng, minLat, maxLng, maxLat] = bounds;\n const topLeft = lngLatToWorld([minLng, maxLat]);\n const bottomRight = lngLatToWorld([maxLng, minLat]);\n bounds = [topLeft[0], TILE_SIZE - topLeft[1], bottomRight[0], TILE_SIZE - bottomRight[1]];\n }\n\n const root = new OSMNode(0, 0, 0);\n const traversalParams = {\n viewport,\n project,\n cullingVolume,\n elevationBounds: [elevationMin, elevationMax] as ZRange,\n minZ,\n maxZ,\n bounds,\n // num. of worlds from the center. For repeated maps\n offset: 0\n };\n\n root.update(traversalParams);\n\n if (\n viewport instanceof WebMercatorViewport &&\n viewport.subViewports &&\n viewport.subViewports.length > 1\n ) {\n // Check worlds in repeated maps\n traversalParams.offset = -1;\n while (root.update(traversalParams)) {\n if (--traversalParams.offset < -MAX_MAPS) {\n break;\n }\n }\n traversalParams.offset = 1;\n while (root.update(traversalParams)) {\n if (++traversalParams.offset > MAX_MAPS) {\n break;\n }\n }\n }\n\n return root.getSelected();\n}\n"],"file":"tile-2d-traversal.js"}
1
+ {"version":3,"sources":["../../../src/tileset-2d/tile-2d-traversal.ts"],"names":["WebMercatorViewport","_GlobeViewport","CullingVolume","Plane","AxisAlignedBoundingBox","makeOrientedBoundingBoxFromPoints","lngLatToWorld","osmTile2lngLat","TILE_SIZE","MAX_MAPS","REF_POINTS_5","REF_POINTS_9","concat","REF_POINTS_11","OSMNode","constructor","x","y","z","childVisible","selected","_children","children","update","params","viewport","cullingVolume","elevationBounds","minZ","maxZ","bounds","offset","project","boundingVolume","getBoundingVolume","insideBounds","isInside","computeVisibility","distance","distanceTo","cameraPosition","scale","height","Math","floor","log2","child","getSelected","result","push","node","minX","minY","maxX","maxY","pow","extent","zRange","worldOffset","refPoints","refPointPositions","p","lngLat","originX","originY","getOSMTileIndices","resolution","projectPosition","planes","Object","values","getFrustumPlanes","map","normal","clone","negate","unitsPerMeter","distanceScales","elevationMin","elevationMax","pitch","minLng","minLat","maxLng","maxLat","topLeft","bottomRight","root","traversalParams","subViewports","length"],"mappings":"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","sourcesContent":["import {Viewport, WebMercatorViewport, _GlobeViewport} from '@deck.gl/core';\n\nimport {\n CullingVolume,\n Plane,\n AxisAlignedBoundingBox,\n makeOrientedBoundingBoxFromPoints\n} from '@math.gl/culling';\nimport {lngLatToWorld} from '@math.gl/web-mercator';\nimport {Bounds, TileIndex, ZRange} from './types';\nimport {osmTile2lngLat} from './utils';\n\nconst TILE_SIZE = 512;\n// number of world copies to check\nconst MAX_MAPS = 3;\n// for calculating bounding volume of a tile in a non-web-mercator viewport\nconst REF_POINTS_5 = [\n [0.5, 0.5],\n [0, 0],\n [0, 1],\n [1, 0],\n [1, 1]\n]; // 4 corners and center\nconst REF_POINTS_9 = REF_POINTS_5.concat([\n [0, 0.5],\n [0.5, 0],\n [1, 0.5],\n [0.5, 1]\n]); // 4 corners, center and 4 mid points\nconst REF_POINTS_11 = REF_POINTS_9.concat([\n [0.25, 0.5],\n [0.75, 0.5]\n]); // 2 additional points on equator for top tile\n\nclass OSMNode {\n x: number;\n y: number;\n z: number;\n\n private childVisible?: boolean;\n private selected?: boolean;\n\n private _children?: OSMNode[];\n\n constructor(x, y, z) {\n this.x = x;\n this.y = y;\n this.z = z;\n }\n\n get children() {\n if (!this._children) {\n const x = this.x * 2;\n const y = this.y * 2;\n const z = this.z + 1;\n this._children = [\n new OSMNode(x, y, z),\n new OSMNode(x, y + 1, z),\n new OSMNode(x + 1, y, z),\n new OSMNode(x + 1, y + 1, z)\n ];\n }\n return this._children;\n }\n\n // eslint-disable-next-line complexity\n update(params: {\n viewport: Viewport;\n project: ((xyz: number[]) => number[]) | null;\n cullingVolume: CullingVolume;\n elevationBounds: ZRange;\n minZ: number;\n maxZ: number;\n bounds?: Bounds;\n offset: number;\n }) {\n const {viewport, cullingVolume, elevationBounds, minZ, maxZ, bounds, offset, project} = params;\n const boundingVolume = this.getBoundingVolume(elevationBounds, offset, project);\n\n // First, check if this tile is visible\n if (bounds && !this.insideBounds(bounds)) {\n return false;\n }\n\n const isInside = cullingVolume.computeVisibility(boundingVolume);\n if (isInside < 0) {\n return false;\n }\n\n // Avoid loading overlapping tiles - if a descendant is requested, do not request the ancester\n if (!this.childVisible) {\n let {z} = this;\n if (z < maxZ && z >= minZ) {\n // Adjust LOD\n // If the tile is far enough from the camera, accept a lower zoom level\n const distance =\n (boundingVolume.distanceTo(viewport.cameraPosition) * viewport.scale) / viewport.height;\n z += Math.floor(Math.log2(distance));\n }\n if (z >= maxZ) {\n // LOD is acceptable\n this.selected = true;\n return true;\n }\n }\n\n // LOD is not enough, recursively test child tiles\n this.selected = false;\n this.childVisible = true;\n for (const child of this.children) {\n child.update(params);\n }\n return true;\n }\n\n getSelected(result: OSMNode[] = []): OSMNode[] {\n if (this.selected) {\n result.push(this);\n }\n if (this._children) {\n for (const node of this._children) {\n node.getSelected(result);\n }\n }\n return result;\n }\n\n insideBounds([minX, minY, maxX, maxY]: Bounds): boolean {\n const scale = Math.pow(2, this.z);\n const extent = TILE_SIZE / scale;\n\n return (\n this.x * extent < maxX &&\n this.y * extent < maxY &&\n (this.x + 1) * extent > minX &&\n (this.y + 1) * extent > minY\n );\n }\n\n getBoundingVolume(\n zRange: ZRange,\n worldOffset: number,\n project: ((xyz: number[]) => number[]) | null\n ) {\n if (project) {\n // Custom projection\n // Estimate bounding box from sample points\n // At low zoom level we need more samples to calculate the bounding volume correctly\n const refPoints = this.z < 1 ? REF_POINTS_11 : this.z < 2 ? REF_POINTS_9 : REF_POINTS_5;\n\n // Convert from tile-relative coordinates to common space\n const refPointPositions: number[][] = [];\n for (const p of refPoints) {\n const lngLat: number[] = osmTile2lngLat(this.x + p[0], this.y + p[1], this.z);\n lngLat[2] = zRange[0];\n refPointPositions.push(project(lngLat));\n\n if (zRange[0] !== zRange[1]) {\n // Account for the elevation volume\n lngLat[2] = zRange[1];\n refPointPositions.push(project(lngLat));\n }\n }\n\n return makeOrientedBoundingBoxFromPoints(refPointPositions);\n }\n\n // Use WebMercator projection\n const scale = Math.pow(2, this.z);\n const extent = TILE_SIZE / scale;\n const originX = this.x * extent + worldOffset * TILE_SIZE;\n // deck's common space is y-flipped\n const originY = TILE_SIZE - (this.y + 1) * extent;\n\n return new AxisAlignedBoundingBox(\n [originX, originY, zRange[0]],\n [originX + extent, originY + extent, zRange[1]]\n );\n }\n}\n\n// eslint-disable-next-line complexity\nexport function getOSMTileIndices(\n viewport: Viewport,\n maxZ: number,\n zRange?: ZRange | null,\n bounds?: Bounds\n): TileIndex[] {\n const project: ((xyz: number[]) => number[]) | null =\n viewport instanceof _GlobeViewport && viewport.resolution\n ? // eslint-disable-next-line @typescript-eslint/unbound-method\n viewport.projectPosition\n : null;\n\n // Get the culling volume of the current camera\n const planes: Plane[] = Object.values(viewport.getFrustumPlanes()).map(\n ({normal, distance}) => new Plane(normal.clone().negate(), distance)\n );\n const cullingVolume = new CullingVolume(planes);\n\n // Project zRange from meters to common space\n const unitsPerMeter = viewport.distanceScales.unitsPerMeter[2];\n const elevationMin = (zRange && zRange[0] * unitsPerMeter) || 0;\n const elevationMax = (zRange && zRange[1] * unitsPerMeter) || 0;\n\n // Always load at the current zoom level if pitch is small\n const minZ = viewport instanceof WebMercatorViewport && viewport.pitch <= 60 ? maxZ : 0;\n\n // Map extent to OSM position\n if (bounds) {\n const [minLng, minLat, maxLng, maxLat] = bounds;\n const topLeft = lngLatToWorld([minLng, maxLat]);\n const bottomRight = lngLatToWorld([maxLng, minLat]);\n bounds = [topLeft[0], TILE_SIZE - topLeft[1], bottomRight[0], TILE_SIZE - bottomRight[1]];\n }\n\n const root = new OSMNode(0, 0, 0);\n const traversalParams = {\n viewport,\n project,\n cullingVolume,\n elevationBounds: [elevationMin, elevationMax] as ZRange,\n minZ,\n maxZ,\n bounds,\n // num. of worlds from the center. For repeated maps\n offset: 0\n };\n\n root.update(traversalParams);\n\n if (\n viewport instanceof WebMercatorViewport &&\n viewport.subViewports &&\n viewport.subViewports.length > 1\n ) {\n // Check worlds in repeated maps\n traversalParams.offset = -1;\n while (root.update(traversalParams)) {\n if (--traversalParams.offset < -MAX_MAPS) {\n break;\n }\n }\n traversalParams.offset = 1;\n while (root.update(traversalParams)) {\n if (++traversalParams.offset > MAX_MAPS) {\n break;\n }\n }\n }\n\n return root.getSelected();\n}\n"],"file":"tile-2d-traversal.js"}
@@ -136,7 +136,7 @@ export class Tileset2D {
136
136
  zRange,
137
137
  modelMatrix
138
138
  } = {}) {
139
- const modelMatrixAsMatrix4 = new Matrix4(modelMatrix);
139
+ const modelMatrixAsMatrix4 = modelMatrix ? new Matrix4(modelMatrix) : new Matrix4();
140
140
  const isModelMatrixNew = !modelMatrixAsMatrix4.equals(this._modelMatrix);
141
141
 
142
142
  if (!this._viewport || !viewport.equals(this._viewport) || !equals(this._zRange, zRange) || isModelMatrixNew) {