@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,11 +1,19 @@
1
+ import type {NumericArray} from '@math.gl/core';
1
2
  import {GLTFMaterialParser} from '@luma.gl/experimental';
2
3
  import {Model, pbr} from '@luma.gl/core';
3
4
  import GL from '@luma.gl/constants';
4
- import {SimpleMeshLayer} from '@deck.gl/mesh-layers';
5
+ import type {MeshAttribute, MeshAttributes} from '@loaders.gl/schema';
6
+ import type {UpdateParameters, DefaultProps} from '@deck.gl/core';
7
+ import {SimpleMeshLayer, SimpleMeshLayerProps} from '@deck.gl/mesh-layers';
5
8
 
6
9
  import vs from './mesh-layer-vertex.glsl';
7
10
  import fs from './mesh-layer-fragment.glsl';
8
11
 
12
+ export type Mesh = {
13
+ attributes: MeshAttributes;
14
+ indices?: MeshAttribute;
15
+ };
16
+
9
17
  function validateGeometryAttributes(attributes) {
10
18
  const hasColorAttribute = attributes.COLOR_0 || attributes.colors;
11
19
  if (!hasColorAttribute) {
@@ -13,13 +21,34 @@ function validateGeometryAttributes(attributes) {
13
21
  }
14
22
  }
15
23
 
16
- const defaultProps = {
17
- // PBR material object. _lighting must be pbr for this to work
24
+ const defaultProps: DefaultProps<MeshLayerProps> = {
18
25
  pbrMaterial: {type: 'object', value: null},
19
26
  featureIds: {type: 'array', value: null, optional: true}
20
27
  };
21
28
 
22
- export default class _MeshLayer extends SimpleMeshLayer {
29
+ /** All properties supported by MeshLayer. */
30
+ export type MeshLayerProps<DataT = any> = _MeshLayerProps<DataT> & SimpleMeshLayerProps<DataT>;
31
+
32
+ /** Properties added by MeshLayer. */
33
+ type _MeshLayerProps<DataT> = {
34
+ /**
35
+ * PBR material object. _lighting must be pbr for this to work
36
+ */
37
+ pbrMaterial?: any; // TODO add type when converting Tile3DLayer
38
+
39
+ /**
40
+ * List of feature ids.
41
+ */
42
+ featureIds?: NumericArray | null;
43
+ };
44
+
45
+ export default class MeshLayer<DataT = any, ExtraProps = {}> extends SimpleMeshLayer<
46
+ DataT,
47
+ Required<_MeshLayerProps<DataT>> & ExtraProps
48
+ > {
49
+ static layerName = 'MeshLayer';
50
+ static defaultProps = defaultProps;
51
+
23
52
  getShaders() {
24
53
  const shaders = super.getShaders();
25
54
  const modules = shaders.modules;
@@ -31,20 +60,25 @@ export default class _MeshLayer extends SimpleMeshLayer {
31
60
  const {featureIds} = this.props;
32
61
  super.initializeState();
33
62
 
63
+ const attributeManager = this.getAttributeManager();
34
64
  if (featureIds) {
35
- this.state.attributeManager.add({
65
+ // attributeManager is always defined in a primitive layer
66
+ attributeManager!.add({
36
67
  featureIdsPickingColors: {
37
68
  type: GL.UNSIGNED_BYTE,
38
69
  size: 3,
39
70
  noAlloc: true,
71
+ // eslint-disable-next-line @typescript-eslint/unbound-method
40
72
  update: this.calculateFeatureIdsPickingColors
41
73
  }
42
74
  });
43
75
  }
44
76
  }
45
77
 
46
- updateState({props, oldProps, changeFlags}) {
47
- super.updateState({props, oldProps, changeFlags});
78
+ updateState(params: UpdateParameters<this>) {
79
+ super.updateState(params);
80
+
81
+ const {props, oldProps} = params;
48
82
  if (props.pbrMaterial !== oldProps.pbrMaterial) {
49
83
  this.updatePbrMaterialUniforms(props.pbrMaterial);
50
84
  }
@@ -57,14 +91,15 @@ export default class _MeshLayer extends SimpleMeshLayer {
57
91
  }
58
92
  this.state.model.setUniforms({
59
93
  // Needed for PBR (TODO: find better way to get it)
94
+ // eslint-disable-next-line camelcase
60
95
  u_Camera: this.state.model.getUniforms().project_uCameraPosition,
61
- u_pickFeatureIds: Boolean(featureIds)
96
+ pickFeatureIds: Boolean(featureIds)
62
97
  });
63
98
 
64
99
  super.draw(opts);
65
100
  }
66
101
 
67
- getModel(mesh) {
102
+ protected getModel(mesh: Mesh): Model {
68
103
  const {id, pbrMaterial} = this.props;
69
104
  const materialParser = this.parseMaterial(pbrMaterial, mesh);
70
105
  const shaders = this.getShaders();
@@ -110,7 +145,8 @@ export default class _MeshLayer extends SimpleMeshLayer {
110
145
  }
111
146
 
112
147
  calculateFeatureIdsPickingColors(attribute) {
113
- const {featureIds} = this.props;
148
+ // This updater is only called if featureIds is not null
149
+ const featureIds = this.props.featureIds!;
114
150
  const value = new Uint8ClampedArray(featureIds.length * attribute.size);
115
151
 
116
152
  const pickingColor = [];
@@ -125,6 +161,3 @@ export default class _MeshLayer extends SimpleMeshLayer {
125
161
  attribute.value = value;
126
162
  }
127
163
  }
128
-
129
- _MeshLayer.layerName = '_MeshLayer';
130
- _MeshLayer.defaultProps = defaultProps;
@@ -6,7 +6,8 @@ import {
6
6
  UpdateParameters,
7
7
  GetPickingInfoParams,
8
8
  Viewport,
9
- COORDINATE_SYSTEM
9
+ COORDINATE_SYSTEM,
10
+ DefaultProps
10
11
  } from '@deck.gl/core';
11
12
  import {GeoJsonLayer, GeoJsonLayerProps} from '@deck.gl/layers';
12
13
  import {Matrix4} from '@math.gl/core';
@@ -28,9 +29,10 @@ import findIndexBinary from './find-index-binary';
28
29
 
29
30
  const WORLD_SIZE = 512;
30
31
 
31
- const defaultProps = {
32
+ const defaultProps: DefaultProps<MVTLayerProps> = {
32
33
  ...GeoJsonLayer.defaultProps,
33
- uniqueIdProperty: {type: 'string', value: ''},
34
+ onDataLoad: {type: 'function', value: null, optional: true, compare: false},
35
+ uniqueIdProperty: '',
34
36
  highlightedFeatureId: null,
35
37
  loaders: [MVTWorkerLoader],
36
38
  binary: true
@@ -1,8 +1,8 @@
1
- import {AccessorFunction} from '@deck.gl/core';
1
+ import {AccessorFunction, DefaultProps} from '@deck.gl/core';
2
2
  import GeoCellLayer, {GeoCellLayerProps} from '../geo-cell-layer/GeoCellLayer';
3
3
  import {getQuadkeyPolygon} from './quadkey-utils';
4
4
 
5
- const defaultProps = {
5
+ const defaultProps: DefaultProps<QuadkeyLayerProps> = {
6
6
  getQuadkey: {type: 'accessor', value: d => d.quadkey}
7
7
  };
8
8
 
@@ -10,7 +10,7 @@ const defaultProps = {
10
10
  export type QuadkeyLayerProps<DataT = any> = _QuadkeyLayerProps<DataT> & GeoCellLayerProps<DataT>;
11
11
 
12
12
  /** Properties added by QuadkeyLayer. */
13
- type _QuadkeyLayerProps<DataT = any> = {
13
+ type _QuadkeyLayerProps<DataT> = {
14
14
  /**
15
15
  * Called for each data object to retrieve the quadkey string identifier.
16
16
  *
@@ -21,10 +21,10 @@ type _QuadkeyLayerProps<DataT = any> = {
21
21
 
22
22
  export default class QuadkeyLayer<DataT = any, ExtraProps = {}> extends GeoCellLayer<
23
23
  DataT,
24
- Required<_QuadkeyLayerProps> & ExtraProps
24
+ Required<_QuadkeyLayerProps<DataT>> & ExtraProps
25
25
  > {
26
26
  static layerName = 'QuadkeyLayer';
27
- static defaultProps: any = defaultProps;
27
+ static defaultProps = defaultProps;
28
28
 
29
29
  indexToBounds(): Partial<GeoCellLayer['props']> | null {
30
30
  const {data, getQuadkey} = this.props;
@@ -21,24 +21,28 @@ const MAX_LEVEL = 30;
21
21
  const POS_BITS = 2 * MAX_LEVEL + 1; // 61 (60 bits of data, 1 bit lsb marker)
22
22
  const RADIAN_TO_DEGREE = 180 / Math.PI;
23
23
 
24
- export function IJToST(ij, order, offsets) {
24
+ export function IJToST(
25
+ ij: [number, number],
26
+ order: number,
27
+ offsets: [number, number]
28
+ ): [number, number] {
25
29
  const maxSize = 1 << order;
26
30
 
27
31
  return [(ij[0] + offsets[0]) / maxSize, (ij[1] + offsets[1]) / maxSize];
28
32
  }
29
33
 
30
- function singleSTtoUV(st) {
34
+ function singleSTtoUV(st: number): number {
31
35
  if (st >= 0.5) {
32
36
  return (1 / 3.0) * (4 * st * st - 1);
33
37
  }
34
38
  return (1 / 3.0) * (1 - 4 * (1 - st) * (1 - st));
35
39
  }
36
40
 
37
- export function STToUV(st) {
41
+ export function STToUV(st: [number, number]): [number, number] {
38
42
  return [singleSTtoUV(st[0]), singleSTtoUV(st[1])];
39
43
  }
40
44
 
41
- export function FaceUVToXYZ(face, [u, v]) {
45
+ export function FaceUVToXYZ(face: number, [u, v]: [number, number]): [number, number, number] {
42
46
  switch (face) {
43
47
  case 0:
44
48
  return [1, u, v];
@@ -57,14 +61,14 @@ export function FaceUVToXYZ(face, [u, v]) {
57
61
  }
58
62
  }
59
63
 
60
- export function XYZToLngLat([x, y, z]) {
64
+ export function XYZToLngLat([x, y, z]: [number, number, number]): [number, number] {
61
65
  const lat = Math.atan2(z, Math.sqrt(x * x + y * y));
62
66
  const lng = Math.atan2(y, x);
63
67
 
64
68
  return [lng * RADIAN_TO_DEGREE, lat * RADIAN_TO_DEGREE];
65
69
  }
66
70
 
67
- export function toHilbertQuadkey(idS) {
71
+ export function toHilbertQuadkey(idS: string): string {
68
72
  let bin = Long.fromString(idS, true, 10).toString(2);
69
73
 
70
74
  while (bin.length < FACE_BITS + POS_BITS) {
@@ -92,7 +96,7 @@ export function toHilbertQuadkey(idS) {
92
96
  return `${faceS}/${posS}`;
93
97
  }
94
98
 
95
- function rotateAndFlipQuadrant(n, point, rx, ry) {
99
+ function rotateAndFlipQuadrant(n: number, point: [number, number], rx: number, ry: number): void {
96
100
  if (ry === 0) {
97
101
  if (rx === 1) {
98
102
  point[0] = n - 1 - point[0];
@@ -105,12 +109,16 @@ function rotateAndFlipQuadrant(n, point, rx, ry) {
105
109
  }
106
110
  }
107
111
 
108
- export function FromHilbertQuadKey(hilbertQuadkey) {
112
+ export function FromHilbertQuadKey(hilbertQuadkey: string): {
113
+ face: number;
114
+ ij: [number, number];
115
+ level: number;
116
+ } {
109
117
  const parts = hilbertQuadkey.split('/');
110
118
  const face = parseInt(parts[0], 10);
111
119
  const position = parts[1];
112
120
  const maxLevel = position.length;
113
- const point = [0, 0];
121
+ const point = [0, 0] as [number, number];
114
122
  let level;
115
123
 
116
124
  for (let i = maxLevel - 1; i >= 0; i--) {
@@ -18,25 +18,42 @@
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 GeoCellLayer from '../geo-cell-layer/GeoCellLayer';
21
+ import {AccessorFunction, DefaultProps} from '@deck.gl/core';
22
+ import GeoCellLayer, {GeoCellLayerProps} from '../geo-cell-layer/GeoCellLayer';
22
23
  import {getS2Polygon} from './s2-utils';
23
24
 
24
- const defaultProps = {
25
+ const defaultProps: DefaultProps<S2LayerProps> = {
25
26
  getS2Token: {type: 'accessor', value: d => d.token}
26
27
  };
27
28
 
28
- export default class S2Layer extends GeoCellLayer {
29
- indexToBounds() {
29
+ /** All properties supported by S2Layer. */
30
+ export type S2LayerProps<DataT = any> = _S2LayerProps<DataT> & GeoCellLayerProps<DataT>;
31
+
32
+ /** Properties added by S2Layer. */
33
+ type _S2LayerProps<DataT> = {
34
+ /**
35
+ * Called for each data object to retrieve the quadkey string identifier.
36
+ *
37
+ * By default, it reads `token` property of data object.
38
+ */
39
+ getS2Token?: AccessorFunction<DataT, string>;
40
+ };
41
+
42
+ export default class S2Layer<DataT = any, ExtraProps = {}> extends GeoCellLayer<
43
+ DataT,
44
+ Required<_S2LayerProps<DataT>> & ExtraProps
45
+ > {
46
+ static layerName = 'S2Layer';
47
+ static defaultProps = defaultProps;
48
+
49
+ indexToBounds(): Partial<GeoCellLayer['props']> | null {
30
50
  const {data, getS2Token} = this.props;
31
51
 
32
52
  return {
33
53
  data,
34
54
  _normalize: false,
35
55
  positionFormat: 'XY',
36
- getPolygon: (x, objectInfo) => getS2Polygon(getS2Token(x, objectInfo))
56
+ getPolygon: (x: DataT, objectInfo) => getS2Polygon(getS2Token(x, objectInfo))
37
57
  };
38
58
  }
39
59
  }
40
-
41
- S2Layer.layerName = 'S2Layer';
42
- S2Layer.defaultProps = defaultProps;
@@ -14,7 +14,7 @@ import Long from 'long';
14
14
  * Given an S2 token this function convert the token to 64 bit id
15
15
  https://github.com/google/s2-geometry-library-java/blob/c04b68bf3197a9c34082327eeb3aec7ab7c85da1/src/com/google/common/geometry/S2CellId.java#L439
16
16
  * */
17
- function getIdFromToken(token) {
17
+ function getIdFromToken(token: string): number {
18
18
  // pad token with zeros to make the length 16
19
19
  const paddedToken = token.padEnd(16, '0');
20
20
  return Long.fromString(paddedToken, 16);
@@ -24,7 +24,15 @@ const MAX_RESOLUTION = 100;
24
24
 
25
25
  /* Adapted from s2-geometry's S2Cell.getCornerLatLngs */
26
26
  /* eslint-disable max-statements */
27
- function getGeoBounds({face, ij, level}) {
27
+ function getGeoBounds({
28
+ face,
29
+ ij,
30
+ level
31
+ }: {
32
+ face: number;
33
+ ij: [number, number];
34
+ level: number;
35
+ }): Float64Array {
28
36
  const offsets = [
29
37
  [0, 0],
30
38
  [0, 1],
@@ -44,7 +52,7 @@ function getGeoBounds({face, ij, level}) {
44
52
  let prevLng = 0;
45
53
 
46
54
  for (let i = 0; i < 4; i++) {
47
- const offset = offsets[i].slice(0);
55
+ const offset = offsets[i].slice(0) as [number, number];
48
56
  const nextOffset = offsets[i + 1];
49
57
  const stepI = (nextOffset[0] - offset[0]) / resolution;
50
58
  const stepJ = (nextOffset[1] - offset[1]) / resolution;
@@ -78,7 +86,7 @@ function getGeoBounds({face, ij, level}) {
78
86
  }
79
87
  /* eslint-enable max-statements */
80
88
 
81
- export function getS2QuadKey(token) {
89
+ export function getS2QuadKey(token: string | number): string {
82
90
  if (typeof token === 'string') {
83
91
  if (token.indexOf('/') > 0) {
84
92
  // is Hilbert quad key
@@ -94,11 +102,10 @@ export function getS2QuadKey(token) {
94
102
  /**
95
103
  * Get a polygon with corner coordinates for an s2 cell
96
104
  * @param {*} cell - This can be an S2 key or token
97
- * @return {Array} - a simple polygon in array format: [[lng, lat], ...]
98
- * - each coordinate is an array [lng, lat]
105
+ * @return {Float64Array} - a simple polygon in flat array format: [lng0, lat0, lng1, lat1, ...]
99
106
  * - the polygon is closed, i.e. last coordinate is a copy of the first coordinate
100
107
  */
101
- export function getS2Polygon(token) {
108
+ export function getS2Polygon(token: string | number): Float64Array {
102
109
  const key = getS2QuadKey(token);
103
110
  const s2cell = FromHilbertQuadKey(key);
104
111
 
@@ -18,16 +18,30 @@
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 {CompositeLayer, log} from '@deck.gl/core';
21
+ import {
22
+ Color,
23
+ CompositeLayer,
24
+ CompositeLayerProps,
25
+ DefaultProps,
26
+ Layer,
27
+ LayersList,
28
+ log,
29
+ Material,
30
+ Texture,
31
+ UpdateParameters
32
+ } from '@deck.gl/core';
22
33
  import {SimpleMeshLayer} from '@deck.gl/mesh-layers';
23
34
  import {COORDINATE_SYSTEM} from '@deck.gl/core';
35
+ import type {MeshAttributes} from '@loaders.gl/schema';
24
36
  import {TerrainWorkerLoader} from '@loaders.gl/terrain';
25
- import TileLayer from '../tile-layer/tile-layer';
37
+ import TileLayer, {TileLayerProps} from '../tile-layer/tile-layer';
38
+ import Tile2DHeader from '../tile-layer/tile-2d-header';
39
+ import {Bounds, GeoBoundingBox, TileBoundingBox, TileLoadProps, ZRange} from '../tile-layer/types';
26
40
  import {urlType, getURLFromTemplate} from '../tile-layer/utils';
27
41
 
28
42
  const DUMMY_DATA = [1];
29
43
 
30
- const defaultProps = {
44
+ const defaultProps: DefaultProps<TerrainLayerProps> = {
31
45
  ...TileLayer.defaultProps,
32
46
  // Image url that encodes height data
33
47
  elevationData: urlType,
@@ -58,22 +72,72 @@ const defaultProps = {
58
72
  loaders: [TerrainWorkerLoader]
59
73
  };
60
74
 
75
+ type URLTemplate = string | string[];
76
+
61
77
  // Turns array of templates into a single string to work around shallow change
62
- function urlTemplateToUpdateTrigger(template) {
78
+ function urlTemplateToUpdateTrigger(template: URLTemplate | null): string {
63
79
  if (Array.isArray(template)) {
64
80
  return template.join(';');
65
81
  }
66
- return template;
82
+ return template || '';
67
83
  }
68
84
 
69
- /**
70
- * state: {
71
- * isTiled: True renders TileLayer of many SimpleMeshLayers, false renders one SimpleMeshLayer
72
- * terrain: Mesh object. Only defined when isTiled is false.
73
- * }
74
- */
75
- export default class TerrainLayer extends CompositeLayer {
76
- updateState({props, oldProps}) {
85
+ type ElevationDecoder = {rScaler: number; gScaler: number; bScaler: number; offset: number};
86
+ type TerrainLoadProps = {
87
+ bounds: Bounds;
88
+ elevationData: string | null;
89
+ elevationDecoder: ElevationDecoder;
90
+ meshMaxError: number;
91
+ signal?: AbortSignal;
92
+ };
93
+
94
+ type MeshAndTexture = [MeshAttributes | null, Texture | null];
95
+
96
+ /** All properties supported by TerrainLayer */
97
+ export type TerrainLayerProps = _TerrainLayerProps &
98
+ TileLayerProps<MeshAndTexture> &
99
+ CompositeLayerProps;
100
+
101
+ /** Props added by the TerrainLayer */
102
+ type _TerrainLayerProps = {
103
+ /** Image url that encodes height data. **/
104
+ elevationData: URLTemplate;
105
+
106
+ /** Image url to use as texture. **/
107
+ texture?: URLTemplate | null;
108
+
109
+ /** Martini error tolerance in meters, smaller number -> more detailed mesh. **/
110
+ meshMaxError?: number;
111
+
112
+ /** Bounding box of the terrain image, [minX, minY, maxX, maxY] in world coordinates. **/
113
+ bounds?: Bounds | null;
114
+
115
+ /** Color to use if texture is unavailable. **/
116
+ color?: Color;
117
+
118
+ /** Object to decode height data, from (r, g, b) to height in meters. **/
119
+ elevationDecoder?: ElevationDecoder;
120
+
121
+ /** Whether to render the mesh in wireframe mode. **/
122
+ wireframe?: boolean;
123
+
124
+ /** Material props for lighting effect. **/
125
+ material?: Material;
126
+ };
127
+
128
+ export default class TerrainLayer<ExtraPropsT = {}> extends CompositeLayer<
129
+ ExtraPropsT & Required<_TerrainLayerProps & Required<TileLayerProps<MeshAndTexture>>>
130
+ > {
131
+ static defaultProps = defaultProps;
132
+ static layerName = 'TerrainLayer';
133
+
134
+ state!: {
135
+ isTiled?: boolean;
136
+ terrain: MeshAttributes;
137
+ zRange?: ZRange | null;
138
+ };
139
+
140
+ updateState({props, oldProps}: UpdateParameters<this>): void {
77
141
  const elevationDataChanged = props.elevationData !== oldProps.elevationData;
78
142
  if (elevationDataChanged) {
79
143
  const {elevationData} = props;
@@ -92,17 +156,25 @@ export default class TerrainLayer extends CompositeLayer {
92
156
  props.bounds !== oldProps.bounds;
93
157
 
94
158
  if (!this.state.isTiled && shouldReload) {
95
- const terrain = this.loadTerrain(props);
159
+ // When state.isTiled, elevationData cannot be an array
160
+ const terrain = this.loadTerrain(props as TerrainLoadProps);
96
161
  this.setState({terrain});
97
162
  }
98
163
 
99
164
  // TODO - remove in v9
165
+ // @ts-ignore
100
166
  if (props.workerUrl) {
101
167
  log.removed('workerUrl', 'loadOptions.terrain.workerUrl')();
102
168
  }
103
169
  }
104
170
 
105
- loadTerrain({elevationData, bounds, elevationDecoder, meshMaxError, signal}) {
171
+ loadTerrain({
172
+ elevationData,
173
+ bounds,
174
+ elevationDecoder,
175
+ meshMaxError,
176
+ signal
177
+ }: TerrainLoadProps): Promise<MeshAttributes> | null {
106
178
  if (!elevationData) {
107
179
  return null;
108
180
  }
@@ -121,20 +193,25 @@ export default class TerrainLayer extends CompositeLayer {
121
193
  return fetch(elevationData, {propName: 'elevationData', layer: this, loadOptions, signal});
122
194
  }
123
195
 
124
- getTiledTerrainData(tile) {
196
+ getTiledTerrainData(tile: TileLoadProps): Promise<MeshAndTexture> {
125
197
  const {elevationData, fetch, texture, elevationDecoder, meshMaxError} = this.props;
126
198
  const {viewport} = this.context;
127
199
  const dataUrl = getURLFromTemplate(elevationData, tile);
128
- const textureUrl = getURLFromTemplate(texture, tile);
200
+ const textureUrl = texture && getURLFromTemplate(texture, tile);
129
201
 
130
- const {bbox, signal} = tile;
131
- const bottomLeft = viewport.isGeospatial
132
- ? viewport.projectFlat([bbox.west, bbox.south])
133
- : [bbox.left, bbox.bottom];
134
- const topRight = viewport.isGeospatial
135
- ? viewport.projectFlat([bbox.east, bbox.north])
136
- : [bbox.right, bbox.top];
137
- const bounds = [bottomLeft[0], bottomLeft[1], topRight[0], topRight[1]];
202
+ const {signal} = tile;
203
+ let bottomLeft = [0, 0] as [number, number];
204
+ let topRight = [0, 0] as [number, number];
205
+ if (viewport.isGeospatial) {
206
+ const bbox = tile.bbox as GeoBoundingBox;
207
+ bottomLeft = viewport.projectFlat([bbox.west, bbox.south]);
208
+ topRight = viewport.projectFlat([bbox.east, bbox.north]);
209
+ } else {
210
+ const bbox = tile.bbox as Exclude<TileBoundingBox, GeoBoundingBox>;
211
+ bottomLeft = [bbox.left, bbox.bottom];
212
+ topRight = [bbox.right, bbox.top];
213
+ }
214
+ const bounds: Bounds = [bottomLeft[0], bottomLeft[1], topRight[0], topRight[1]];
138
215
 
139
216
  const terrain = this.loadTerrain({
140
217
  elevationData: dataUrl,
@@ -151,9 +228,17 @@ export default class TerrainLayer extends CompositeLayer {
151
228
  return Promise.all([terrain, surface]);
152
229
  }
153
230
 
154
- renderSubLayers(props) {
231
+ renderSubLayers(
232
+ props: TileLayerProps<MeshAndTexture> & {
233
+ id: string;
234
+ data: MeshAndTexture;
235
+ tile: Tile2DHeader<MeshAndTexture>;
236
+ }
237
+ ) {
155
238
  const SubLayerClass = this.getSubLayerClass('mesh', SimpleMeshLayer);
156
- const {data, color} = props;
239
+
240
+ const {color, wireframe, material} = this.props;
241
+ const {data} = props;
157
242
 
158
243
  if (!data) {
159
244
  return null;
@@ -168,12 +253,14 @@ export default class TerrainLayer extends CompositeLayer {
168
253
  _instanced: false,
169
254
  coordinateSystem: COORDINATE_SYSTEM.CARTESIAN,
170
255
  getPosition: d => [0, 0, 0],
171
- getColor: color
256
+ getColor: color,
257
+ wireframe,
258
+ material
172
259
  });
173
260
  }
174
261
 
175
262
  // Update zRange of viewport
176
- onViewportLoad(tiles) {
263
+ onViewportLoad(tiles?: Tile2DHeader<MeshAndTexture>[]): void {
177
264
  if (!tiles) {
178
265
  return;
179
266
  }
@@ -183,6 +270,7 @@ export default class TerrainLayer extends CompositeLayer {
183
270
  .map(tile => tile.content)
184
271
  .filter(Boolean)
185
272
  .map(arr => {
273
+ // @ts-ignore
186
274
  const bounds = arr[0].header.boundingBox;
187
275
  return bounds.map(bound => bound[2]);
188
276
  });
@@ -197,7 +285,7 @@ export default class TerrainLayer extends CompositeLayer {
197
285
  }
198
286
  }
199
287
 
200
- renderLayers() {
288
+ renderLayers(): Layer | null | LayersList {
201
289
  const {
202
290
  color,
203
291
  material,
@@ -220,14 +308,11 @@ export default class TerrainLayer extends CompositeLayer {
220
308
  } = this.props;
221
309
 
222
310
  if (this.state.isTiled) {
223
- return new TileLayer(
311
+ return new TileLayer<MeshAndTexture>(
224
312
  this.getSubLayerProps({
225
313
  id: 'tiles'
226
314
  }),
227
315
  {
228
- wireframe,
229
- color,
230
- material,
231
316
  getTileData: this.getTiledTerrainData.bind(this),
232
317
  renderSubLayers: this.renderSubLayers.bind(this),
233
318
  updateTriggers: {
@@ -273,6 +358,3 @@ export default class TerrainLayer extends CompositeLayer {
273
358
  );
274
359
  }
275
360
  }
276
-
277
- TerrainLayer.layerName = 'TerrainLayer';
278
- TerrainLayer.defaultProps = defaultProps;