@deck.gl/geo-layers 8.8.0-alpha.6 → 8.8.0-beta.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 (141) hide show
  1. package/dist/dist.dev.js +32245 -42466
  2. package/dist/es5/geo-cell-layer/GeoCellLayer.js.map +1 -1
  3. package/dist/es5/geohash-layer/geohash-layer.js +71 -0
  4. package/dist/es5/geohash-layer/geohash-layer.js.map +1 -0
  5. package/dist/es5/geohash-layer/geohash-utils.js +77 -0
  6. package/dist/es5/geohash-layer/geohash-utils.js.map +1 -0
  7. package/dist/es5/great-circle-layer/great-circle-layer.js +12 -8
  8. package/dist/es5/great-circle-layer/great-circle-layer.js.map +1 -1
  9. package/dist/es5/h3-layers/h3-cluster-layer.js +5 -4
  10. package/dist/es5/h3-layers/h3-cluster-layer.js.map +1 -1
  11. package/dist/es5/h3-layers/h3-hexagon-layer.js +49 -34
  12. package/dist/es5/h3-layers/h3-hexagon-layer.js.map +1 -1
  13. package/dist/es5/index.js +8 -0
  14. package/dist/es5/index.js.map +1 -1
  15. package/dist/es5/mesh-layer/mesh-layer-fragment.glsl.js +1 -1
  16. package/dist/es5/mesh-layer/mesh-layer-vertex.glsl.js +1 -1
  17. package/dist/es5/mesh-layer/mesh-layer.js +22 -26
  18. package/dist/es5/mesh-layer/mesh-layer.js.map +1 -1
  19. package/dist/es5/mvt-layer/mvt-layer.js +6 -3
  20. package/dist/es5/mvt-layer/mvt-layer.js.map +1 -1
  21. package/dist/es5/quadkey-layer/quadkey-layer.js.map +1 -1
  22. package/dist/es5/s2-layer/s2-geometry.js.map +1 -1
  23. package/dist/es5/s2-layer/s2-layer.js +4 -2
  24. package/dist/es5/s2-layer/s2-layer.js.map +1 -1
  25. package/dist/es5/s2-layer/s2-utils.js.map +1 -1
  26. package/dist/es5/terrain-layer/terrain-layer.js +57 -34
  27. package/dist/es5/terrain-layer/terrain-layer.js.map +1 -1
  28. package/dist/es5/tile-3d-layer/tile-3d-layer.js +31 -16
  29. package/dist/es5/tile-3d-layer/tile-3d-layer.js.map +1 -1
  30. package/dist/es5/tile-layer/tile-layer.js +8 -3
  31. package/dist/es5/tile-layer/tile-layer.js.map +1 -1
  32. package/dist/es5/tile-layer/tileset-2d.js +38 -1
  33. package/dist/es5/tile-layer/tileset-2d.js.map +1 -1
  34. package/dist/es5/tile-layer/utils.js +46 -12
  35. package/dist/es5/tile-layer/utils.js.map +1 -1
  36. package/dist/es5/trips-layer/trips-layer.js +9 -7
  37. package/dist/es5/trips-layer/trips-layer.js.map +1 -1
  38. package/dist/esm/geo-cell-layer/GeoCellLayer.js.map +1 -1
  39. package/dist/esm/geohash-layer/geohash-layer.js +29 -0
  40. package/dist/esm/geohash-layer/geohash-layer.js.map +1 -0
  41. package/dist/esm/geohash-layer/geohash-utils.js +56 -0
  42. package/dist/esm/geohash-layer/geohash-utils.js.map +1 -0
  43. package/dist/esm/great-circle-layer/great-circle-layer.js +7 -3
  44. package/dist/esm/great-circle-layer/great-circle-layer.js.map +1 -1
  45. package/dist/esm/h3-layers/h3-cluster-layer.js +6 -4
  46. package/dist/esm/h3-layers/h3-cluster-layer.js.map +1 -1
  47. package/dist/esm/h3-layers/h3-hexagon-layer.js +38 -24
  48. package/dist/esm/h3-layers/h3-hexagon-layer.js.map +1 -1
  49. package/dist/esm/index.js +1 -0
  50. package/dist/esm/index.js.map +1 -1
  51. package/dist/esm/mesh-layer/mesh-layer-fragment.glsl.js +1 -1
  52. package/dist/esm/mesh-layer/mesh-layer-fragment.glsl.js.map +1 -1
  53. package/dist/esm/mesh-layer/mesh-layer-vertex.glsl.js +1 -1
  54. package/dist/esm/mesh-layer/mesh-layer-vertex.glsl.js.map +1 -1
  55. package/dist/esm/mesh-layer/mesh-layer.js +15 -17
  56. package/dist/esm/mesh-layer/mesh-layer.js.map +1 -1
  57. package/dist/esm/mvt-layer/mvt-layer.js +6 -3
  58. package/dist/esm/mvt-layer/mvt-layer.js.map +1 -1
  59. package/dist/esm/quadkey-layer/quadkey-layer.js.map +1 -1
  60. package/dist/esm/s2-layer/s2-geometry.js.map +1 -1
  61. package/dist/esm/s2-layer/s2-layer.js +5 -2
  62. package/dist/esm/s2-layer/s2-layer.js.map +1 -1
  63. package/dist/esm/s2-layer/s2-utils.js.map +1 -1
  64. package/dist/esm/terrain-layer/terrain-layer.js +35 -13
  65. package/dist/esm/terrain-layer/terrain-layer.js.map +1 -1
  66. package/dist/esm/tile-3d-layer/tile-3d-layer.js +21 -10
  67. package/dist/esm/tile-3d-layer/tile-3d-layer.js.map +1 -1
  68. package/dist/esm/tile-layer/tile-layer.js +10 -3
  69. package/dist/esm/tile-layer/tile-layer.js.map +1 -1
  70. package/dist/esm/tile-layer/tileset-2d.js +36 -3
  71. package/dist/esm/tile-layer/tileset-2d.js.map +1 -1
  72. package/dist/esm/tile-layer/utils.js +36 -0
  73. package/dist/esm/tile-layer/utils.js.map +1 -1
  74. package/dist/esm/trips-layer/trips-layer.js +8 -5
  75. package/dist/esm/trips-layer/trips-layer.js.map +1 -1
  76. package/dist.min.js +2 -2
  77. package/package.json +17 -15
  78. package/src/geo-cell-layer/GeoCellLayer.ts +2 -2
  79. package/src/geohash-layer/geohash-layer.ts +38 -0
  80. package/src/geohash-layer/geohash-utils.ts +54 -0
  81. package/src/great-circle-layer/{great-circle-layer.js → great-circle-layer.ts} +17 -8
  82. package/src/h3-layers/h3-cluster-layer.ts +60 -0
  83. package/src/h3-layers/{h3-hexagon-layer.js → h3-hexagon-layer.ts} +110 -42
  84. package/src/index.ts +7 -0
  85. package/src/mesh-layer/{mesh-layer-fragment.glsl.js → mesh-layer-fragment.glsl.ts} +0 -0
  86. package/src/mesh-layer/{mesh-layer-vertex.glsl.js → mesh-layer-vertex.glsl.ts} +2 -2
  87. package/src/mesh-layer/{mesh-layer.js → mesh-layer.ts} +46 -13
  88. package/src/mvt-layer/mvt-layer.ts +5 -3
  89. package/src/quadkey-layer/quadkey-layer.ts +5 -5
  90. package/src/s2-layer/{s2-geometry.js → s2-geometry.ts} +17 -9
  91. package/src/s2-layer/{s2-layer.js → s2-layer.ts} +25 -8
  92. package/src/s2-layer/{s2-utils.js → s2-utils.ts} +14 -7
  93. package/src/terrain-layer/{terrain-layer.js → terrain-layer.ts} +119 -37
  94. package/src/tile-3d-layer/{tile-3d-layer.js → tile-3d-layer.ts} +107 -36
  95. package/src/tile-layer/tile-layer.ts +11 -8
  96. package/src/tile-layer/tileset-2d.ts +42 -6
  97. package/src/tile-layer/utils.ts +44 -0
  98. package/src/trips-layer/{trips-layer.js → trips-layer.ts} +41 -10
  99. package/typed/geo-cell-layer/GeoCellLayer.d.ts +2 -37
  100. package/typed/geo-cell-layer/GeoCellLayer.d.ts.map +1 -1
  101. package/typed/geohash-layer/geohash-layer.d.ts +20 -0
  102. package/typed/geohash-layer/geohash-layer.d.ts.map +1 -0
  103. package/typed/geohash-layer/geohash-utils.d.ts +3 -0
  104. package/typed/geohash-layer/geohash-utils.d.ts.map +1 -0
  105. package/typed/great-circle-layer/great-circle-layer.d.ts +7 -13
  106. package/typed/great-circle-layer/great-circle-layer.d.ts.map +1 -1
  107. package/typed/h3-layers/h3-cluster-layer.d.ts +20 -14
  108. package/typed/h3-layers/h3-cluster-layer.d.ts.map +1 -1
  109. package/typed/h3-layers/h3-hexagon-layer.d.ts +55 -92
  110. package/typed/h3-layers/h3-hexagon-layer.d.ts.map +1 -1
  111. package/typed/index.d.ts +7 -0
  112. package/typed/index.d.ts.map +1 -1
  113. package/typed/mesh-layer/mesh-layer-fragment.glsl.d.ts +1 -1
  114. package/typed/mesh-layer/mesh-layer-fragment.glsl.d.ts.map +1 -1
  115. package/typed/mesh-layer/mesh-layer-vertex.glsl.d.ts +1 -1
  116. package/typed/mesh-layer/mesh-layer-vertex.glsl.d.ts.map +1 -1
  117. package/typed/mesh-layer/mesh-layer.d.ts +32 -22
  118. package/typed/mesh-layer/mesh-layer.d.ts.map +1 -1
  119. package/typed/mvt-layer/mvt-layer.d.ts +2 -34
  120. package/typed/mvt-layer/mvt-layer.d.ts.map +1 -1
  121. package/typed/quadkey-layer/quadkey-layer.d.ts +4 -4
  122. package/typed/quadkey-layer/quadkey-layer.d.ts.map +1 -1
  123. package/typed/s2-layer/s2-geometry.d.ts +8 -8
  124. package/typed/s2-layer/s2-geometry.d.ts.map +1 -1
  125. package/typed/s2-layer/s2-layer.d.ts +18 -14
  126. package/typed/s2-layer/s2-layer.d.ts.map +1 -1
  127. package/typed/s2-layer/s2-utils.d.ts +3 -4
  128. package/typed/s2-layer/s2-utils.d.ts.map +1 -1
  129. package/typed/terrain-layer/terrain-layer.d.ts +61 -26
  130. package/typed/terrain-layer/terrain-layer.d.ts.map +1 -1
  131. package/typed/tile-3d-layer/tile-3d-layer.d.ts +58 -68
  132. package/typed/tile-3d-layer/tile-3d-layer.d.ts.map +1 -1
  133. package/typed/tile-layer/tile-layer.d.ts +5 -7
  134. package/typed/tile-layer/tile-layer.d.ts.map +1 -1
  135. package/typed/tile-layer/tileset-2d.d.ts +12 -3
  136. package/typed/tile-layer/tileset-2d.d.ts.map +1 -1
  137. package/typed/tile-layer/utils.d.ts +14 -0
  138. package/typed/tile-layer/utils.d.ts.map +1 -1
  139. package/typed/trips-layer/trips-layer.d.ts +34 -30
  140. package/typed/trips-layer/trips-layer.d.ts.map +1 -1
  141. package/src/h3-layers/h3-cluster-layer.js +0 -43
@@ -1,21 +1,38 @@
1
1
  import GL from '@luma.gl/constants';
2
2
  import {Geometry} from '@luma.gl/core';
3
- import {COORDINATE_SYSTEM, CompositeLayer} from '@deck.gl/core';
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';
4
20
  import {PointCloudLayer} from '@deck.gl/layers';
5
21
  import {ScenegraphLayer} from '@deck.gl/mesh-layers';
6
- import {default as _MeshLayer} from '../mesh-layer/mesh-layer';
7
- import {log} from '@deck.gl/core';
22
+ import {default as MeshLayer} from '../mesh-layer/mesh-layer';
8
23
 
9
24
  import {load} from '@loaders.gl/core';
10
- import {Tileset3D, TILE_TYPE} from '@loaders.gl/tiles';
25
+ import {MeshAttributes} from '@loaders.gl/schema';
26
+ import {Tileset3D, Tile3D, TILE_TYPE} from '@loaders.gl/tiles';
11
27
  import {Tiles3DLoader} from '@loaders.gl/3d-tiles';
12
28
 
13
29
  const SINGLE_DATA = [0];
14
30
 
15
- const defaultProps = {
31
+ const defaultProps: DefaultProps<Tile3DLayerProps> = {
16
32
  getPointColor: {type: 'accessor', value: [0, 0, 0, 255]},
17
33
  pointSize: 1.0,
18
34
 
35
+ // @ts-expect-error Disable async data loading (handling it in _loadTileSet)
19
36
  data: null,
20
37
  loader: Tiles3DLoader,
21
38
 
@@ -26,7 +43,52 @@ const defaultProps = {
26
43
  _getMeshColor: {type: 'function', value: tileHeader => [255, 255, 255], compare: false}
27
44
  };
28
45
 
29
- export default class Tile3DLayer extends CompositeLayer {
46
+ /** All properties supported by Tile3DLayer */
47
+ export type Tile3DLayerProps<DataT = any> = _Tile3DLayerProps<DataT> & CompositeLayerProps<DataT>;
48
+
49
+ /** Props added by the Tile3DLayer */
50
+ type _Tile3DLayerProps<DataT> = {
51
+ /** Color Accessor for point clouds. **/
52
+ getPointColor?: Accessor<DataT, Color>;
53
+
54
+ /** Global radius of all points in pixels. **/
55
+ pointSize?: number;
56
+
57
+ /** A loader which is used to decode the fetched tiles.
58
+ * @deprecated Use `loaders` instead
59
+ */
60
+ loader?: typeof Tiles3DLoader;
61
+
62
+ /** Called when Tileset JSON file is loaded. **/
63
+ onTilesetLoad?: (tile: Tileset3D) => void;
64
+
65
+ /** Called when a tile in the tileset hierarchy is loaded. **/
66
+ onTileLoad?: (tile: Tile3D) => void;
67
+
68
+ /** Called when a tile is unloaded. **/
69
+ onTileUnload?: (tile: Tile3D) => void;
70
+
71
+ /** Called when a tile fails to load. **/
72
+ onTileError?: (tile: Tile3D, url: string, message: string) => void;
73
+
74
+ /** (Experimental) Accessor to change color of mesh based on properties. **/
75
+ _getMeshColor?: (tile: Tile3D) => Color;
76
+ };
77
+
78
+ export default class Tile3DLayer<DataT = any, ExtraPropsT = {}> extends CompositeLayer<
79
+ ExtraPropsT & Required<_Tile3DLayerProps<DataT>>
80
+ > {
81
+ static defaultProps = defaultProps as any;
82
+ static layerName = 'Tile3DLayer';
83
+
84
+ state!: {
85
+ activeViewports: {};
86
+ frameNumber?: number;
87
+ lastUpdatedViewports: {[viewportId: string]: Viewport} | null;
88
+ layerMap: {[layerId: string]: any};
89
+ tileset3d: Tileset3D | null;
90
+ };
91
+
30
92
  initializeState() {
31
93
  if ('onTileLoadFail' in this.props) {
32
94
  log.removed('onTileLoadFail', 'onTileError')();
@@ -40,16 +102,16 @@ export default class Tile3DLayer extends CompositeLayer {
40
102
  };
41
103
  }
42
104
 
43
- get isLoaded() {
105
+ get isLoaded(): boolean {
44
106
  const {tileset3d} = this.state;
45
- return tileset3d && tileset3d.isLoaded();
107
+ return tileset3d !== null && tileset3d.isLoaded();
46
108
  }
47
109
 
48
- shouldUpdateState({changeFlags}) {
110
+ shouldUpdateState({changeFlags}: UpdateParameters<this>): boolean {
49
111
  return changeFlags.somethingChanged;
50
112
  }
51
113
 
52
- updateState({props, oldProps, changeFlags}) {
114
+ updateState({props, oldProps, changeFlags}: UpdateParameters<this>): void {
53
115
  if (props.data && props.data !== oldProps.data) {
54
116
  this._loadTileset(props.data);
55
117
  }
@@ -71,9 +133,9 @@ export default class Tile3DLayer extends CompositeLayer {
71
133
  }
72
134
  }
73
135
 
74
- activateViewport(viewport) {
136
+ activateViewport(viewport: Viewport): void {
75
137
  const {activeViewports, lastUpdatedViewports} = this.state;
76
- this.internalState.viewport = viewport;
138
+ this.internalState!.viewport = viewport;
77
139
 
78
140
  activeViewports[viewport.id] = viewport;
79
141
  const lastViewport = lastUpdatedViewports?.[viewport.id];
@@ -83,7 +145,7 @@ export default class Tile3DLayer extends CompositeLayer {
83
145
  }
84
146
  }
85
147
 
86
- getPickingInfo({info, sourceLayer}) {
148
+ getPickingInfo({info, sourceLayer}: GetPickingInfoParams) {
87
149
  const {layerMap} = this.state;
88
150
  const layerId = sourceLayer && sourceLayer.id;
89
151
  if (layerId) {
@@ -96,22 +158,24 @@ export default class Tile3DLayer extends CompositeLayer {
96
158
  return info;
97
159
  }
98
160
 
99
- filterSubLayer({layer, viewport}) {
100
- const {tile} = layer.props;
161
+ filterSubLayer({layer, viewport}: FilterContext): boolean {
162
+ // All sublayers will have a tile prop
163
+ const {tile} = layer.props as unknown as {tile: Tile3D};
101
164
  const {id: viewportId} = viewport;
102
165
  return tile.selected && tile.viewportIds.includes(viewportId);
103
166
  }
104
167
 
105
- _updateAutoHighlight(info) {
168
+ protected _updateAutoHighlight(info: PickingInfo): void {
106
169
  if (info.sourceLayer) {
107
170
  info.sourceLayer.updateAutoHighlight(info);
108
171
  }
109
172
  }
110
173
 
111
- async _loadTileset(tilesetUrl) {
174
+ private async _loadTileset(tilesetUrl) {
112
175
  const {loadOptions = {}} = this.props;
113
176
 
114
177
  // TODO: deprecate `loader` in v9.0
178
+ // @ts-ignore
115
179
  let loader = this.props.loader || this.props.loaders;
116
180
  if (Array.isArray(loader)) {
117
181
  loader = loader[0];
@@ -134,7 +198,7 @@ export default class Tile3DLayer extends CompositeLayer {
134
198
  const tileset3d = new Tileset3D(tilesetJson, {
135
199
  onTileLoad: this._onTileLoad.bind(this),
136
200
  onTileUnload: this._onTileUnload.bind(this),
137
- onTileLoadFail: this.props.onTileError,
201
+ onTileError: this.props.onTileError,
138
202
  ...options
139
203
  });
140
204
 
@@ -147,20 +211,23 @@ export default class Tile3DLayer extends CompositeLayer {
147
211
  this.props.onTilesetLoad(tileset3d);
148
212
  }
149
213
 
150
- _onTileLoad(tileHeader) {
214
+ private _onTileLoad(tileHeader: Tile3D): void {
151
215
  const {lastUpdatedViewports} = this.state;
152
216
  this.props.onTileLoad(tileHeader);
153
217
  this._updateTileset(lastUpdatedViewports);
154
218
  this.setNeedsUpdate();
155
219
  }
156
220
 
157
- _onTileUnload(tileHeader) {
221
+ private _onTileUnload(tileHeader: Tile3D): void {
158
222
  // Was cleaned up from tileset cache. We no longer need to track it.
159
223
  delete this.state.layerMap[tileHeader.id];
160
224
  this.props.onTileUnload(tileHeader);
161
225
  }
162
226
 
163
- _updateTileset(viewports) {
227
+ private _updateTileset(viewports: {[viewportId: string]: Viewport} | null): void {
228
+ if (!viewports) {
229
+ return;
230
+ }
164
231
  const {tileset3d} = this.state;
165
232
  const {timeline} = this.context;
166
233
  const viewportsNumber = Object.keys(viewports).length;
@@ -175,24 +242,30 @@ export default class Tile3DLayer extends CompositeLayer {
175
242
  });
176
243
  }
177
244
 
178
- _getSubLayer(tileHeader, oldLayer) {
245
+ private _getSubLayer(
246
+ tileHeader: Tile3D,
247
+ oldLayer?: Layer
248
+ ): MeshLayer<DataT> | PointCloudLayer<DataT> | ScenegraphLayer<DataT> | null {
179
249
  if (!tileHeader.content) {
180
250
  return null;
181
251
  }
182
252
 
183
253
  switch (tileHeader.type) {
184
254
  case TILE_TYPE.POINTCLOUD:
185
- return this._makePointCloudLayer(tileHeader, oldLayer);
255
+ return this._makePointCloudLayer(tileHeader, oldLayer as PointCloudLayer<DataT>);
186
256
  case TILE_TYPE.SCENEGRAPH:
187
- return this._make3DModelLayer(tileHeader, oldLayer);
257
+ return this._make3DModelLayer(tileHeader);
188
258
  case TILE_TYPE.MESH:
189
- return this._makeSimpleMeshLayer(tileHeader, oldLayer);
259
+ return this._makeSimpleMeshLayer(tileHeader, oldLayer as MeshLayer<DataT>);
190
260
  default:
191
261
  throw new Error(`Tile3DLayer: Failed to render layer of type ${tileHeader.content.type}`);
192
262
  }
193
263
  }
194
264
 
195
- _makePointCloudLayer(tileHeader, oldLayer) {
265
+ private _makePointCloudLayer(
266
+ tileHeader: Tile3D,
267
+ oldLayer?: PointCloudLayer<DataT>
268
+ ): PointCloudLayer<DataT> | null {
196
269
  const {attributes, pointCount, constantRGBA, cartographicOrigin, modelMatrix} =
197
270
  tileHeader.content;
198
271
  const {positions, normals, colors} = attributes;
@@ -233,7 +306,7 @@ export default class Tile3DLayer extends CompositeLayer {
233
306
  );
234
307
  }
235
308
 
236
- _make3DModelLayer(tileHeader) {
309
+ private _make3DModelLayer(tileHeader: Tile3D): ScenegraphLayer<DataT> {
237
310
  const {gltf, instances, cartographicOrigin, modelMatrix} = tileHeader.content;
238
311
 
239
312
  const SubLayerClass = this.getSubLayerClass('scenegraph', ScenegraphLayer);
@@ -261,7 +334,7 @@ export default class Tile3DLayer extends CompositeLayer {
261
334
  );
262
335
  }
263
336
 
264
- _makeSimpleMeshLayer(tileHeader, oldLayer) {
337
+ private _makeSimpleMeshLayer(tileHeader: Tile3D, oldLayer?: MeshLayer<DataT>): MeshLayer<DataT> {
265
338
  const content = tileHeader.content;
266
339
  const {
267
340
  attributes,
@@ -282,7 +355,7 @@ export default class Tile3DLayer extends CompositeLayer {
282
355
  indices
283
356
  });
284
357
 
285
- const SubLayerClass = this.getSubLayerClass('mesh', _MeshLayer);
358
+ const SubLayerClass = this.getSubLayerClass('mesh', MeshLayer);
286
359
 
287
360
  return new SubLayerClass(
288
361
  this.getSubLayerProps({
@@ -304,13 +377,14 @@ export default class Tile3DLayer extends CompositeLayer {
304
377
  );
305
378
  }
306
379
 
307
- renderLayers() {
380
+ renderLayers(): Layer | null | LayersList {
308
381
  const {tileset3d, layerMap} = this.state;
309
382
  if (!tileset3d) {
310
383
  return null;
311
384
  }
312
385
 
313
- return tileset3d.tiles
386
+ // loaders.gl doesn't provide a type for tileset3d.tiles
387
+ return (tileset3d.tiles as Tile3D[])
314
388
  .map(tile => {
315
389
  const layerCache = (layerMap[tile.id] = layerMap[tile.id] || {tile});
316
390
  let {layer} = layerCache;
@@ -332,8 +406,8 @@ export default class Tile3DLayer extends CompositeLayer {
332
406
  }
333
407
  }
334
408
 
335
- function getMeshGeometry(contentAttributes) {
336
- const attributes = {};
409
+ function getMeshGeometry(contentAttributes: MeshAttributes): MeshAttributes {
410
+ const attributes: MeshAttributes = {};
337
411
  attributes.positions = {
338
412
  ...contentAttributes.positions,
339
413
  value: new Float32Array(contentAttributes.positions.value)
@@ -352,6 +426,3 @@ function getMeshGeometry(contentAttributes) {
352
426
  }
353
427
  return attributes;
354
428
  }
355
-
356
- Tile3DLayer.layerName = 'Tile3DLayer';
357
- Tile3DLayer.defaultProps = defaultProps;
@@ -6,6 +6,8 @@ import {
6
6
  UpdateParameters,
7
7
  PickingInfo,
8
8
  GetPickingInfoParams,
9
+ DefaultProps,
10
+ FilterContext,
9
11
  _flatten as flatten
10
12
  } from '@deck.gl/core';
11
13
  import {GeoJsonLayer} from '@deck.gl/layers';
@@ -16,9 +18,9 @@ import Tileset2D, {RefinementStrategy, STRATEGY_DEFAULT, Tileset2DProps} from '.
16
18
  import {TileLoadProps, ZRange} from './types';
17
19
  import {urlType, getURLFromTemplate} from './utils';
18
20
 
19
- const defaultProps = {
21
+ const defaultProps: DefaultProps<TileLayerProps> = {
20
22
  TilesetClass: Tileset2D,
21
- data: [],
23
+ data: {type: 'data', value: []},
22
24
  dataComparator: urlType.equals,
23
25
  renderSubLayers: {type: 'function', value: props => new GeoJsonLayer(props), compare: false},
24
26
  getTileData: {type: 'function', optional: true, value: null, compare: false},
@@ -41,7 +43,7 @@ const defaultProps = {
41
43
  };
42
44
 
43
45
  /** All props supported by the TileLayer */
44
- export type TileLayerProps<DataT = any> = _TileLayerProps<DataT> & CompositeLayerProps<DataT>;
46
+ export type TileLayerProps<DataT = any> = CompositeLayerProps<any> & _TileLayerProps<DataT>;
45
47
 
46
48
  /** Props added by the TileLayer */
47
49
  type _TileLayerProps<DataT> = {
@@ -63,10 +65,10 @@ type _TileLayerProps<DataT> = {
63
65
  /**
64
66
  * If supplied, `getTileData` is called to retrieve the data of each tile.
65
67
  */
66
- getTileData?: (props: TileLoadProps) => Promise<DataT> | DataT;
68
+ getTileData?: ((props: TileLoadProps) => Promise<DataT> | DataT) | null;
67
69
 
68
70
  /** Called when all tiles in the current viewport are loaded. */
69
- onViewportLoad?: (tiles: Tile2DHeader<DataT>[]) => void;
71
+ onViewportLoad?: ((tiles: Tile2DHeader<DataT>[]) => void) | null;
70
72
 
71
73
  /** Called when a tile successfully loads. */
72
74
  onTileLoad?: (tile: Tile2DHeader<DataT>) => void;
@@ -332,7 +334,7 @@ export default class TileLayer<DataT = any, ExtraPropsT = {}> extends CompositeL
332
334
  _offset: 0,
333
335
  tile
334
336
  });
335
- tile.layers = (flatten(layers, Boolean) as Layer[]).map(layer =>
337
+ tile.layers = (flatten(layers, Boolean) as Layer<{tile?: Tile2DHeader}>[]).map(layer =>
336
338
  layer.clone({
337
339
  tile,
338
340
  ...subLayerProps
@@ -351,7 +353,8 @@ export default class TileLayer<DataT = any, ExtraPropsT = {}> extends CompositeL
351
353
  });
352
354
  }
353
355
 
354
- filterSubLayer({layer}) {
355
- return layer.props.tile.isVisible;
356
+ filterSubLayer({layer, cullRect}: FilterContext) {
357
+ const {tile} = (layer as Layer<{tile: Tile2DHeader}>).props;
358
+ return this.state.tileset.isTileVisible(tile, cullRect);
356
359
  }
357
360
  }
@@ -1,10 +1,11 @@
1
1
  import Tile2DHeader from './tile-2d-header';
2
- import {getTileIndices, tileToBoundingBox} from './utils';
2
+ import {getTileIndices, tileToBoundingBox, getCullBounds} from './utils';
3
3
  import {RequestScheduler} from '@loaders.gl/loader-utils';
4
- import {Matrix4} from '@math.gl/core';
4
+ import {Matrix4, equals} from '@math.gl/core';
5
5
  import {Viewport} from '@deck.gl/core';
6
6
  import {Bounds, TileIndex, ZRange} from './types';
7
7
  import {TileLayerProps} from './tile-layer';
8
+ import {_memoize as memoize} from '@deck.gl/core';
8
9
 
9
10
  // bit masks
10
11
  const TILE_STATE_VISITED = 1;
@@ -49,7 +50,6 @@ const STRATEGIES = {
49
50
 
50
51
  export type Tileset2DProps = Pick<
51
52
  Required<TileLayerProps>,
52
- | 'getTileData'
53
53
  | 'tileSize'
54
54
  | 'maxCacheSize'
55
55
  | 'maxCacheByteSize'
@@ -60,6 +60,7 @@ export type Tileset2DProps = Pick<
60
60
  | 'maxRequests'
61
61
  | 'zoomOffset'
62
62
  > & {
63
+ getTileData: NonNullable<TileLayerProps['getTileData']>;
63
64
  onTileLoad: (tile: Tile2DHeader) => void;
64
65
  onTileUnload: (tile: Tile2DHeader) => void;
65
66
  onTileError: (error: any, tile: Tile2DHeader) => void;
@@ -78,6 +79,7 @@ export default class Tileset2D {
78
79
 
79
80
  private _cacheByteSize: number;
80
81
  private _viewport: Viewport | null;
82
+ private _zRange?: ZRange;
81
83
  private _selectedTiles: Tile2DHeader[] | null;
82
84
  private _frameNumber: number;
83
85
  private _modelMatrix: Matrix4;
@@ -184,12 +186,18 @@ export default class Tileset2D {
184
186
  ): number {
185
187
  const modelMatrixAsMatrix4 = new Matrix4(modelMatrix);
186
188
  const isModelMatrixNew = !modelMatrixAsMatrix4.equals(this._modelMatrix);
187
- if (!this._viewport || !viewport.equals(this._viewport) || isModelMatrixNew) {
189
+ if (
190
+ !this._viewport ||
191
+ !viewport.equals(this._viewport) ||
192
+ !equals(this._zRange, zRange) ||
193
+ isModelMatrixNew
194
+ ) {
188
195
  if (isModelMatrixNew) {
189
196
  this._modelMatrixInverse = modelMatrixAsMatrix4.clone().invert();
190
197
  this._modelMatrix = modelMatrixAsMatrix4;
191
198
  }
192
199
  this._viewport = viewport;
200
+ this._zRange = zRange;
193
201
  const tileIndices = this.getTileIndices({
194
202
  viewport,
195
203
  maxZoom: this._maxZoom,
@@ -225,6 +233,32 @@ export default class Tileset2D {
225
233
  return this._frameNumber;
226
234
  }
227
235
 
236
+ isTileVisible(
237
+ tile: Tile2DHeader,
238
+ cullRect?: {x: number; y: number; width: number; height: number}
239
+ ): boolean {
240
+ if (!tile.isVisible) {
241
+ return false;
242
+ }
243
+
244
+ if (cullRect && this._viewport) {
245
+ const [minX, minY, maxX, maxY] = getCullBounds({
246
+ viewport: this._viewport,
247
+ z: this._zRange,
248
+ cullRect
249
+ });
250
+ const {bbox} = tile;
251
+ if ('west' in bbox) {
252
+ return bbox.west < maxX && bbox.east > minX && bbox.south < maxY && bbox.north > minY;
253
+ }
254
+ // top/bottom could be swapped depending on the indexing system
255
+ const y0 = Math.min(bbox.top, bbox.bottom);
256
+ const y1 = Math.max(bbox.top, bbox.bottom);
257
+ return bbox.left < maxX && bbox.right > minX && y0 < maxY && y1 > minY;
258
+ }
259
+ return true;
260
+ }
261
+
228
262
  /* Public interface for subclassing */
229
263
 
230
264
  /** Returns array of tile indices in the current viewport */
@@ -321,7 +355,9 @@ export default class Tileset2D {
321
355
 
322
356
  /* Private methods */
323
357
 
324
- _pruneRequests(): void {
358
+ private _getCullBounds = memoize(getCullBounds);
359
+
360
+ private _pruneRequests(): void {
325
361
  const {maxRequests} = this.opts;
326
362
 
327
363
  const abortCandidates: Tile2DHeader[] = [];
@@ -345,7 +381,7 @@ export default class Tileset2D {
345
381
  }
346
382
 
347
383
  // This needs to be called every time some tiles have been added/removed from cache
348
- _rebuildTree() {
384
+ private _rebuildTree() {
349
385
  const {_cache} = this;
350
386
 
351
387
  // Reset states
@@ -127,6 +127,50 @@ function getBoundingBox(viewport: Viewport, zRange: number[] | null, extent: Bou
127
127
  ];
128
128
  }
129
129
 
130
+ /** Get culling bounds in world space */
131
+ export function getCullBounds({
132
+ viewport,
133
+ z,
134
+ cullRect
135
+ }: {
136
+ /** Current viewport */
137
+ viewport: Viewport;
138
+ /** Current z range */
139
+ z: ZRange | number | undefined;
140
+ /** Culling rectangle in screen space */
141
+ cullRect: {x: number; y: number; width: number; height: number};
142
+ }): [number, number, number, number] {
143
+ const x = cullRect.x - viewport.x;
144
+ const y = cullRect.y - viewport.y;
145
+ const {width, height} = cullRect;
146
+
147
+ if (!Array.isArray(z)) {
148
+ const unprojectOption = {targetZ: z || 0};
149
+
150
+ const topLeft = viewport.unproject([x, y], unprojectOption);
151
+ const topRight = viewport.unproject([x + width, y], unprojectOption);
152
+ const bottomLeft = viewport.unproject([x, y + height], unprojectOption);
153
+ const bottomRight = viewport.unproject([x + width, y + height], unprojectOption);
154
+
155
+ return [
156
+ Math.min(topLeft[0], topRight[0], bottomLeft[0], bottomRight[0]),
157
+ Math.min(topLeft[1], topRight[1], bottomLeft[1], bottomRight[1]),
158
+ Math.max(topLeft[0], topRight[0], bottomLeft[0], bottomRight[0]),
159
+ Math.max(topLeft[1], topRight[1], bottomLeft[1], bottomRight[1])
160
+ ];
161
+ }
162
+
163
+ const bounds0 = getCullBounds({viewport, z: z[0], cullRect});
164
+ const bounds1 = getCullBounds({viewport, z: z[1], cullRect});
165
+
166
+ return [
167
+ Math.min(bounds0[0], bounds1[0]),
168
+ Math.min(bounds0[1], bounds1[1]),
169
+ Math.max(bounds0[2], bounds1[2]),
170
+ Math.max(bounds0[3], bounds1[3])
171
+ ];
172
+ }
173
+
130
174
  function getIndexingCoords(bbox: Bounds, scale: number, modelMatrixInverse?: Matrix4): Bounds {
131
175
  if (modelMatrixInverse) {
132
176
  const transformedTileIndex = transformBox(bbox, modelMatrixInverse).map(
@@ -18,16 +18,50 @@
18
18
  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
19
  // THE SOFTWARE.
20
20
 
21
- import {PathLayer} from '@deck.gl/layers';
21
+ import type {NumericArray} from '@math.gl/core';
22
+ import {AccessorFunction, DefaultProps} from '@deck.gl/core';
23
+ import {PathLayer, PathLayerProps} from '@deck.gl/layers';
22
24
 
23
- const defaultProps = {
25
+ const defaultProps: DefaultProps<TripsLayerProps> = {
24
26
  fadeTrail: true,
25
27
  trailLength: {type: 'number', value: 120, min: 0},
26
28
  currentTime: {type: 'number', value: 0, min: 0},
27
- getTimestamps: {type: 'accessor', value: null}
29
+ getTimestamps: {type: 'accessor', value: d => d.timestamps}
28
30
  };
29
31
 
30
- export default class TripsLayer extends PathLayer {
32
+ /** All properties supported by TripsLayer. */
33
+ export type TripsLayerProps<DataT = any> = _TripsLayerProps<DataT> & PathLayerProps<DataT>;
34
+
35
+ /** Properties added by TripsLayer. */
36
+ type _TripsLayerProps<DataT = any> = {
37
+ /**
38
+ * Whether or not the path fades out.
39
+ * @default true
40
+ */
41
+ fadeTrail?: boolean;
42
+ /**
43
+ * Trail length.
44
+ * @default 120
45
+ */
46
+ trailLength?: number;
47
+ /**
48
+ * The current time of the frame.
49
+ * @default 0
50
+ */
51
+ currentTime?: number;
52
+ /**
53
+ * Timestamp accessor.
54
+ */
55
+ getTimestamps?: AccessorFunction<DataT, NumericArray>;
56
+ };
57
+
58
+ export default class TripsLayer<DataT = any, ExtraProps = {}> extends PathLayer<
59
+ DataT,
60
+ Required<_TripsLayerProps> & ExtraProps
61
+ > {
62
+ static layerName = 'TripsLayer';
63
+ static defaultProps = defaultProps;
64
+
31
65
  getShaders() {
32
66
  const shaders = super.getShaders();
33
67
  shaders.inject = {
@@ -63,11 +97,11 @@ if(fadeTrail) {
63
97
  return shaders;
64
98
  }
65
99
 
66
- initializeState(params) {
67
- super.initializeState(params);
100
+ initializeState() {
101
+ super.initializeState();
68
102
 
69
103
  const attributeManager = this.getAttributeManager();
70
- attributeManager.addInstanced({
104
+ attributeManager!.addInstanced({
71
105
  timestamps: {
72
106
  size: 1,
73
107
  accessor: 'getTimestamps',
@@ -96,6 +130,3 @@ if(fadeTrail) {
96
130
  super.draw(params);
97
131
  }
98
132
  }
99
-
100
- TripsLayer.layerName = 'TripsLayer';
101
- TripsLayer.defaultProps = defaultProps;
@@ -1,45 +1,10 @@
1
- import { CompositeLayer, CompositeLayerProps, Layer, LayersList } from '@deck.gl/core/typed';
1
+ import { CompositeLayer, CompositeLayerProps, Layer, LayersList, DefaultProps } from '@deck.gl/core/typed';
2
2
  import { PolygonLayerProps } from '@deck.gl/layers/typed';
3
3
  /** All properties supported by GeoCellLayer. */
4
4
  export declare type GeoCellLayerProps<DataT = any> = PolygonLayerProps<DataT> & CompositeLayerProps<DataT>;
5
5
  export default class GeoCellLayer<DataT = any, ExtraProps = {}> extends CompositeLayer<Required<GeoCellLayerProps<DataT>> & ExtraProps> {
6
6
  static layerName: string;
7
- static defaultProps: {
8
- stroked: boolean;
9
- filled: boolean;
10
- extruded: boolean;
11
- elevationScale: number;
12
- wireframe: boolean;
13
- _normalize: boolean;
14
- _windingOrder: string;
15
- lineWidthUnits: string;
16
- lineWidthScale: number;
17
- lineWidthMinPixels: number;
18
- lineWidthMaxPixels: number;
19
- lineJointRounded: boolean;
20
- lineMiterLimit: number;
21
- getPolygon: {
22
- type: string;
23
- value: (f: any) => any;
24
- };
25
- getFillColor: {
26
- type: string;
27
- value: number[];
28
- };
29
- getLineColor: {
30
- type: string;
31
- value: number[];
32
- };
33
- getLineWidth: {
34
- type: string;
35
- value: number;
36
- };
37
- getElevation: {
38
- type: string;
39
- value: number;
40
- };
41
- material: boolean;
42
- };
7
+ static defaultProps: DefaultProps<GeoCellLayerProps<any>>;
43
8
  /** Implement to generate props to create geometry. */
44
9
  indexToBounds(): Partial<GeoCellLayer['props']> | null;
45
10
  renderLayers(): Layer | null | LayersList;
@@ -1 +1 @@
1
- {"version":3,"file":"GeoCellLayer.d.ts","sourceRoot":"","sources":["../../src/geo-cell-layer/GeoCellLayer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,EAAE,mBAAmB,EAAE,KAAK,EAAE,UAAU,EAAC,MAAM,eAAe,CAAC;AACrF,OAAO,EAAe,iBAAiB,EAAC,MAAM,iBAAiB,CAAC;AAMhE,gDAAgD;AAChD,oBAAY,iBAAiB,CAAC,KAAK,GAAG,GAAG,IAAI,iBAAiB,CAAC,KAAK,CAAC,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;AAEnG,MAAM,CAAC,OAAO,OAAO,YAAY,CAAC,KAAK,GAAG,GAAG,EAAE,UAAU,GAAG,EAAE,CAAE,SAAQ,cAAc,CACpF,QAAQ,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,GAAG,UAAU,CAChD;IACC,MAAM,CAAC,SAAS,SAAkB;IAClC,MAAM,CAAC,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAAgB;IAEnC,sDAAsD;IACtD,aAAa,IAAI,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI;IAItD,YAAY,IAAI,KAAK,GAAG,IAAI,GAAG,UAAU;CA+D1C"}
1
+ {"version":3,"file":"GeoCellLayer.d.ts","sourceRoot":"","sources":["../../src/geo-cell-layer/GeoCellLayer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,EAAE,mBAAmB,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAC,MAAM,eAAe,CAAC;AACnG,OAAO,EAAe,iBAAiB,EAAC,MAAM,iBAAiB,CAAC;AAMhE,gDAAgD;AAChD,oBAAY,iBAAiB,CAAC,KAAK,GAAG,GAAG,IAAI,iBAAiB,CAAC,KAAK,CAAC,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;AAEnG,MAAM,CAAC,OAAO,OAAO,YAAY,CAAC,KAAK,GAAG,GAAG,EAAE,UAAU,GAAG,EAAE,CAAE,SAAQ,cAAc,CACpF,QAAQ,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,GAAG,UAAU,CAChD;IACC,MAAM,CAAC,SAAS,SAAkB;IAClC,MAAM,CAAC,YAAY,uCAAgB;IAEnC,sDAAsD;IACtD,aAAa,IAAI,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI;IAItD,YAAY,IAAI,KAAK,GAAG,IAAI,GAAG,UAAU;CA+D1C"}
@@ -0,0 +1,20 @@
1
+ import { AccessorFunction } from '@deck.gl/core/typed';
2
+ import GeoCellLayer from '../geo-cell-layer/GeoCellLayer';
3
+ /**
4
+ * Properties of `GeohashLayer`.
5
+ */
6
+ declare type GeohashLayerProps<DataT = any> = {
7
+ /**
8
+ * Called for each data object to retrieve the geohash string identifier.
9
+ *
10
+ * By default, it reads `geohash` property of data object.
11
+ */
12
+ getGeohash?: AccessorFunction<DataT, string>;
13
+ };
14
+ export default class GeohashLayer<DataT = any, ExtraProps = {}> extends GeoCellLayer<DataT, Required<GeohashLayerProps> & ExtraProps> {
15
+ static layerName: string;
16
+ static defaultProps: any;
17
+ indexToBounds(): Partial<GeoCellLayer['props']> | null;
18
+ }
19
+ export {};
20
+ //# sourceMappingURL=geohash-layer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geohash-layer.d.ts","sourceRoot":"","sources":["../../src/geohash-layer/geohash-layer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,gBAAgB,EAAC,MAAM,eAAe,CAAC;AAC/C,OAAO,YAAY,MAAM,gCAAgC,CAAC;AAO1D;;GAEG;AACH,aAAK,iBAAiB,CAAC,KAAK,GAAG,GAAG,IAAI;IACpC;;;;OAIG;IACH,UAAU,CAAC,EAAE,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;CAC9C,CAAC;AAEF,MAAM,CAAC,OAAO,OAAO,YAAY,CAAC,KAAK,GAAG,GAAG,EAAE,UAAU,GAAG,EAAE,CAAE,SAAQ,YAAY,CAClF,KAAK,EACL,QAAQ,CAAC,iBAAiB,CAAC,GAAG,UAAU,CACzC;IACC,MAAM,CAAC,SAAS,SAAkB;IAClC,MAAM,CAAC,YAAY,EAAE,GAAG,CAAgB;IAExC,aAAa,IAAI,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI;CAUvD"}
@@ -0,0 +1,3 @@
1
+ export declare function getGeohashBounds(geohash: string): number[];
2
+ export declare function getGeohashPolygon(geohash: string): number[];
3
+ //# sourceMappingURL=geohash-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geohash-utils.d.ts","sourceRoot":"","sources":["../../src/geohash-layer/geohash-utils.ts"],"names":[],"mappings":"AAYA,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAmC1D;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAI3D"}