@deck.gl/geo-layers 8.8.0-beta.1 → 8.8.0-beta.4
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.
- package/dist/dist.dev.js +449 -156
- package/dist/es5/geo-cell-layer/GeoCellLayer.js.map +1 -1
- package/dist/es5/geohash-layer/geohash-layer.js +71 -0
- package/dist/es5/geohash-layer/geohash-layer.js.map +1 -0
- package/dist/es5/geohash-layer/geohash-utils.js +77 -0
- package/dist/es5/geohash-layer/geohash-utils.js.map +1 -0
- package/dist/es5/great-circle-layer/great-circle-layer.js +12 -8
- package/dist/es5/great-circle-layer/great-circle-layer.js.map +1 -1
- package/dist/es5/h3-layers/h3-cluster-layer.js +12 -4
- package/dist/es5/h3-layers/h3-cluster-layer.js.map +1 -1
- package/dist/es5/h3-layers/h3-hexagon-layer.js +52 -34
- package/dist/es5/h3-layers/h3-hexagon-layer.js.map +1 -1
- package/dist/es5/index.js +8 -0
- package/dist/es5/index.js.map +1 -1
- package/dist/es5/mesh-layer/mesh-layer-fragment.glsl.js +1 -1
- package/dist/es5/mesh-layer/mesh-layer-vertex.glsl.js +1 -1
- package/dist/es5/mesh-layer/mesh-layer.js +22 -26
- package/dist/es5/mesh-layer/mesh-layer.js.map +1 -1
- package/dist/es5/mvt-layer/mvt-layer.js +6 -3
- package/dist/es5/mvt-layer/mvt-layer.js.map +1 -1
- package/dist/es5/quadkey-layer/quadkey-layer.js.map +1 -1
- package/dist/es5/s2-layer/s2-geometry.js.map +1 -1
- package/dist/es5/s2-layer/s2-layer.js +4 -2
- package/dist/es5/s2-layer/s2-layer.js.map +1 -1
- package/dist/es5/s2-layer/s2-utils.js.map +1 -1
- package/dist/es5/terrain-layer/terrain-layer.js +57 -34
- package/dist/es5/terrain-layer/terrain-layer.js.map +1 -1
- package/dist/es5/tile-3d-layer/tile-3d-layer.js +31 -16
- package/dist/es5/tile-3d-layer/tile-3d-layer.js.map +1 -1
- package/dist/es5/tile-layer/tile-layer.js +8 -3
- package/dist/es5/tile-layer/tile-layer.js.map +1 -1
- package/dist/es5/tile-layer/tileset-2d.js +38 -1
- package/dist/es5/tile-layer/tileset-2d.js.map +1 -1
- package/dist/es5/tile-layer/utils.js +46 -12
- package/dist/es5/tile-layer/utils.js.map +1 -1
- package/dist/es5/trips-layer/trips-layer.js +3 -1
- package/dist/es5/trips-layer/trips-layer.js.map +1 -1
- package/dist/esm/geo-cell-layer/GeoCellLayer.js.map +1 -1
- package/dist/esm/geohash-layer/geohash-layer.js +29 -0
- package/dist/esm/geohash-layer/geohash-layer.js.map +1 -0
- package/dist/esm/geohash-layer/geohash-utils.js +56 -0
- package/dist/esm/geohash-layer/geohash-utils.js.map +1 -0
- package/dist/esm/great-circle-layer/great-circle-layer.js +7 -3
- package/dist/esm/great-circle-layer/great-circle-layer.js.map +1 -1
- package/dist/esm/h3-layers/h3-cluster-layer.js +11 -4
- package/dist/esm/h3-layers/h3-cluster-layer.js.map +1 -1
- package/dist/esm/h3-layers/h3-hexagon-layer.js +42 -24
- package/dist/esm/h3-layers/h3-hexagon-layer.js.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/mesh-layer/mesh-layer-fragment.glsl.js +1 -1
- package/dist/esm/mesh-layer/mesh-layer-fragment.glsl.js.map +1 -1
- package/dist/esm/mesh-layer/mesh-layer-vertex.glsl.js +1 -1
- package/dist/esm/mesh-layer/mesh-layer-vertex.glsl.js.map +1 -1
- package/dist/esm/mesh-layer/mesh-layer.js +15 -17
- package/dist/esm/mesh-layer/mesh-layer.js.map +1 -1
- package/dist/esm/mvt-layer/mvt-layer.js +6 -3
- package/dist/esm/mvt-layer/mvt-layer.js.map +1 -1
- package/dist/esm/quadkey-layer/quadkey-layer.js.map +1 -1
- package/dist/esm/s2-layer/s2-geometry.js.map +1 -1
- package/dist/esm/s2-layer/s2-layer.js +5 -2
- package/dist/esm/s2-layer/s2-layer.js.map +1 -1
- package/dist/esm/s2-layer/s2-utils.js.map +1 -1
- package/dist/esm/terrain-layer/terrain-layer.js +35 -13
- package/dist/esm/terrain-layer/terrain-layer.js.map +1 -1
- package/dist/esm/tile-3d-layer/tile-3d-layer.js +21 -10
- package/dist/esm/tile-3d-layer/tile-3d-layer.js.map +1 -1
- package/dist/esm/tile-layer/tile-layer.js +10 -3
- package/dist/esm/tile-layer/tile-layer.js.map +1 -1
- package/dist/esm/tile-layer/tileset-2d.js +36 -3
- package/dist/esm/tile-layer/tileset-2d.js.map +1 -1
- package/dist/esm/tile-layer/utils.js +36 -0
- package/dist/esm/tile-layer/utils.js.map +1 -1
- package/dist/esm/trips-layer/trips-layer.js +1 -1
- package/dist/esm/trips-layer/trips-layer.js.map +1 -1
- package/dist.min.js +2 -2
- package/package.json +6 -4
- package/src/geo-cell-layer/GeoCellLayer.ts +2 -2
- package/src/geohash-layer/geohash-layer.ts +38 -0
- package/src/geohash-layer/geohash-utils.ts +54 -0
- package/src/great-circle-layer/{great-circle-layer.js → great-circle-layer.ts} +17 -8
- package/src/h3-layers/h3-cluster-layer.ts +65 -0
- package/src/h3-layers/{h3-hexagon-layer.js → h3-hexagon-layer.ts} +114 -42
- package/src/index.ts +7 -0
- package/src/mesh-layer/{mesh-layer-fragment.glsl.js → mesh-layer-fragment.glsl.ts} +0 -0
- package/src/mesh-layer/{mesh-layer-vertex.glsl.js → mesh-layer-vertex.glsl.ts} +2 -2
- package/src/mesh-layer/{mesh-layer.js → mesh-layer.ts} +46 -13
- package/src/mvt-layer/mvt-layer.ts +5 -3
- package/src/quadkey-layer/quadkey-layer.ts +5 -5
- package/src/s2-layer/{s2-geometry.js → s2-geometry.ts} +17 -9
- package/src/s2-layer/{s2-layer.js → s2-layer.ts} +25 -8
- package/src/s2-layer/{s2-utils.js → s2-utils.ts} +14 -7
- package/src/terrain-layer/{terrain-layer.js → terrain-layer.ts} +119 -37
- package/src/tile-3d-layer/{tile-3d-layer.js → tile-3d-layer.ts} +107 -36
- package/src/tile-layer/tile-layer.ts +10 -7
- package/src/tile-layer/tileset-2d.ts +42 -6
- package/src/tile-layer/utils.ts +44 -0
- package/src/trips-layer/trips-layer.ts +4 -4
- package/typed/geo-cell-layer/GeoCellLayer.d.ts +2 -37
- package/typed/geo-cell-layer/GeoCellLayer.d.ts.map +1 -1
- package/typed/geohash-layer/geohash-layer.d.ts +20 -0
- package/typed/geohash-layer/geohash-layer.d.ts.map +1 -0
- package/typed/geohash-layer/geohash-utils.d.ts +3 -0
- package/typed/geohash-layer/geohash-utils.d.ts.map +1 -0
- package/typed/great-circle-layer/great-circle-layer.d.ts +7 -14
- package/typed/great-circle-layer/great-circle-layer.d.ts.map +1 -1
- package/typed/h3-layers/h3-cluster-layer.d.ts +21 -14
- package/typed/h3-layers/h3-cluster-layer.d.ts.map +1 -1
- package/typed/h3-layers/h3-hexagon-layer.d.ts +56 -92
- package/typed/h3-layers/h3-hexagon-layer.d.ts.map +1 -1
- package/typed/index.d.ts +7 -0
- package/typed/index.d.ts.map +1 -1
- package/typed/mesh-layer/mesh-layer-fragment.glsl.d.ts +1 -1
- package/typed/mesh-layer/mesh-layer-fragment.glsl.d.ts.map +1 -1
- package/typed/mesh-layer/mesh-layer-vertex.glsl.d.ts +1 -1
- package/typed/mesh-layer/mesh-layer-vertex.glsl.d.ts.map +1 -1
- package/typed/mesh-layer/mesh-layer.d.ts +32 -22
- package/typed/mesh-layer/mesh-layer.d.ts.map +1 -1
- package/typed/mvt-layer/mvt-layer.d.ts +2 -34
- package/typed/mvt-layer/mvt-layer.d.ts.map +1 -1
- package/typed/quadkey-layer/quadkey-layer.d.ts +4 -4
- package/typed/quadkey-layer/quadkey-layer.d.ts.map +1 -1
- package/typed/s2-layer/s2-geometry.d.ts +8 -8
- package/typed/s2-layer/s2-geometry.d.ts.map +1 -1
- package/typed/s2-layer/s2-layer.d.ts +18 -14
- package/typed/s2-layer/s2-layer.d.ts.map +1 -1
- package/typed/s2-layer/s2-utils.d.ts +3 -4
- package/typed/s2-layer/s2-utils.d.ts.map +1 -1
- package/typed/terrain-layer/terrain-layer.d.ts +61 -26
- package/typed/terrain-layer/terrain-layer.d.ts.map +1 -1
- package/typed/tile-3d-layer/tile-3d-layer.d.ts +58 -68
- package/typed/tile-3d-layer/tile-3d-layer.d.ts.map +1 -1
- package/typed/tile-layer/tile-layer.d.ts +5 -7
- package/typed/tile-layer/tile-layer.d.ts.map +1 -1
- package/typed/tile-layer/tileset-2d.d.ts +12 -3
- package/typed/tile-layer/tileset-2d.d.ts.map +1 -1
- package/typed/tile-layer/utils.d.ts +14 -0
- package/typed/tile-layer/utils.d.ts.map +1 -1
- package/typed/trips-layer/trips-layer.d.ts +2 -2
- package/typed/trips-layer/trips-layer.d.ts.map +1 -1
- 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 {
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
47
|
-
super.updateState(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
24
|
+
Required<_QuadkeyLayerProps<DataT>> & ExtraProps
|
|
25
25
|
> {
|
|
26
26
|
static layerName = 'QuadkeyLayer';
|
|
27
|
-
static 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(
|
|
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
|
|
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
|
-
|
|
29
|
-
|
|
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({
|
|
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 {
|
|
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 {
|
|
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
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
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
|
-
|
|
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({
|
|
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 {
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
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(
|
|
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
|
-
|
|
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;
|