@deck.gl/geo-layers 9.0.0-beta.1 → 9.0.0-beta.10
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 +2574 -5077
- package/dist/geo-cell-layer/GeoCellLayer.js +51 -0
- package/{typed → dist}/geohash-layer/geohash-layer.d.ts +1 -1
- package/dist/geohash-layer/geohash-layer.d.ts.map +1 -0
- package/dist/geohash-layer/geohash-layer.js +19 -0
- package/dist/geohash-layer/geohash-utils.js +50 -0
- package/dist/great-circle-layer/great-circle-layer.js +12 -0
- package/{typed → dist}/h3-layers/h3-cluster-layer.d.ts +1 -1
- package/dist/h3-layers/h3-cluster-layer.d.ts.map +1 -0
- package/dist/h3-layers/h3-cluster-layer.js +47 -0
- package/dist/h3-layers/h3-hexagon-layer.js +204 -0
- package/dist/h3-layers/h3-utils.js +56 -0
- package/dist/index.cjs +3160 -0
- package/dist/index.cjs.map +7 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +36 -0
- package/dist/mesh-layer/mesh-layer-fragment.glsl.d.ts +3 -0
- package/{typed → dist}/mesh-layer/mesh-layer-fragment.glsl.d.ts.map +1 -1
- package/dist/mesh-layer/mesh-layer-fragment.glsl.js +33 -0
- package/dist/mesh-layer/mesh-layer-vertex.glsl.js +63 -0
- package/{typed → dist}/mesh-layer/mesh-layer.d.ts.map +1 -1
- package/dist/mesh-layer/mesh-layer.js +128 -0
- package/{typed → dist}/mvt-layer/coordinate-transform.d.ts +1 -1
- package/{typed → dist}/mvt-layer/coordinate-transform.d.ts.map +1 -1
- package/dist/mvt-layer/coordinate-transform.js +41 -0
- package/dist/mvt-layer/find-index-binary.d.ts +11 -0
- package/dist/mvt-layer/find-index-binary.d.ts.map +1 -0
- package/dist/mvt-layer/find-index-binary.js +96 -0
- package/{typed → dist}/mvt-layer/mvt-layer.d.ts +13 -11
- package/dist/mvt-layer/mvt-layer.d.ts.map +1 -0
- package/dist/mvt-layer/mvt-layer.js +305 -0
- package/{typed → dist}/quadkey-layer/quadkey-layer.d.ts +1 -1
- package/dist/quadkey-layer/quadkey-layer.d.ts.map +1 -0
- package/dist/quadkey-layer/quadkey-layer.js +22 -0
- package/dist/quadkey-layer/quadkey-utils.js +26 -0
- package/dist/s2-layer/s2-geometry.js +123 -0
- package/{typed → dist}/s2-layer/s2-layer.d.ts +1 -1
- package/dist/s2-layer/s2-layer.d.ts.map +1 -0
- package/dist/s2-layer/s2-layer.js +38 -0
- package/dist/s2-layer/s2-utils.js +87 -0
- package/{typed → dist}/terrain-layer/terrain-layer.d.ts +4 -4
- package/dist/terrain-layer/terrain-layer.d.ts.map +1 -0
- package/dist/terrain-layer/terrain-layer.js +233 -0
- package/{typed → dist}/tile-3d-layer/tile-3d-layer.d.ts +15 -1
- package/{typed → dist}/tile-3d-layer/tile-3d-layer.d.ts.map +1 -1
- package/dist/tile-3d-layer/tile-3d-layer.js +302 -0
- package/{typed → dist}/tile-layer/tile-layer.d.ts +14 -5
- package/dist/tile-layer/tile-layer.d.ts.map +1 -0
- package/dist/tile-layer/tile-layer.js +207 -0
- package/dist/tileset-2d/index.d.ts +7 -0
- package/dist/tileset-2d/index.d.ts.map +1 -0
- package/dist/tileset-2d/index.js +4 -0
- package/dist/tileset-2d/memoize.js +41 -0
- package/{typed → dist}/tileset-2d/tile-2d-header.d.ts +3 -2
- package/dist/tileset-2d/tile-2d-header.d.ts.map +1 -0
- package/dist/tileset-2d/tile-2d-header.js +135 -0
- package/dist/tileset-2d/tile-2d-traversal.d.ts +4 -0
- package/dist/tileset-2d/tile-2d-traversal.d.ts.map +1 -0
- package/dist/tileset-2d/tile-2d-traversal.js +182 -0
- package/{typed → dist}/tileset-2d/tileset-2d.d.ts +9 -7
- package/dist/tileset-2d/tileset-2d.d.ts.map +1 -0
- package/dist/tileset-2d/tileset-2d.js +458 -0
- package/dist/tileset-2d/types.js +1 -0
- package/{typed → dist}/tileset-2d/utils.d.ts +3 -3
- package/dist/tileset-2d/utils.d.ts.map +1 -0
- package/dist/tileset-2d/utils.js +234 -0
- package/{typed → dist}/trips-layer/trips-layer.d.ts +1 -1
- package/{typed → dist}/trips-layer/trips-layer.d.ts.map +1 -1
- package/dist/trips-layer/trips-layer.js +93 -0
- package/dist/wms-layer/utils.js +13 -0
- package/dist/wms-layer/wms-layer.js +192 -0
- package/dist.min.js +243 -564
- package/package.json +30 -23
- package/src/index.ts +7 -7
- package/src/mesh-layer/mesh-layer-fragment.glsl.ts +1 -9
- package/src/mesh-layer/mesh-layer.ts +1 -2
- package/src/mvt-layer/coordinate-transform.ts +1 -1
- package/src/mvt-layer/find-index-binary.ts +5 -9
- package/src/mvt-layer/mvt-layer.ts +36 -25
- package/src/terrain-layer/terrain-layer.ts +13 -3
- package/src/tile-layer/tile-layer.ts +30 -14
- package/src/tileset-2d/tile-2d-header.ts +2 -1
- package/src/tileset-2d/tile-2d-traversal.ts +1 -1
- package/src/tileset-2d/tileset-2d.ts +14 -7
- package/src/tileset-2d/utils.ts +2 -2
- package/src/trips-layer/trips-layer.ts +1 -1
- package/src/wms-layer/wms-layer.ts +1 -1
- package/dist/es5/geo-cell-layer/GeoCellLayer.js +0 -118
- package/dist/es5/geo-cell-layer/GeoCellLayer.js.map +0 -1
- package/dist/es5/geohash-layer/geohash-layer.js +0 -67
- package/dist/es5/geohash-layer/geohash-layer.js.map +0 -1
- package/dist/es5/geohash-layer/geohash-utils.js +0 -77
- package/dist/es5/geohash-layer/geohash-utils.js.map +0 -1
- package/dist/es5/great-circle-layer/great-circle-layer.js +0 -48
- package/dist/es5/great-circle-layer/great-circle-layer.js.map +0 -1
- package/dist/es5/h3-layers/h3-cluster-layer.js +0 -162
- package/dist/es5/h3-layers/h3-cluster-layer.js.map +0 -1
- package/dist/es5/h3-layers/h3-hexagon-layer.js +0 -351
- package/dist/es5/h3-layers/h3-hexagon-layer.js.map +0 -1
- package/dist/es5/h3-layers/h3-utils.js +0 -111
- package/dist/es5/h3-layers/h3-utils.js.map +0 -1
- package/dist/es5/index.js +0 -132
- package/dist/es5/index.js.map +0 -1
- package/dist/es5/mesh-layer/mesh-layer-fragment.glsl.js +0 -9
- package/dist/es5/mesh-layer/mesh-layer-fragment.glsl.js.map +0 -1
- package/dist/es5/mesh-layer/mesh-layer-vertex.glsl.js +0 -9
- package/dist/es5/mesh-layer/mesh-layer-vertex.glsl.js.map +0 -1
- package/dist/es5/mesh-layer/mesh-layer.js +0 -217
- package/dist/es5/mesh-layer/mesh-layer.js.map +0 -1
- package/dist/es5/mvt-layer/coordinate-transform.js +0 -83
- package/dist/es5/mvt-layer/coordinate-transform.js.map +0 -1
- package/dist/es5/mvt-layer/find-index-binary.js +0 -127
- package/dist/es5/mvt-layer/find-index-binary.js.map +0 -1
- package/dist/es5/mvt-layer/mvt-layer.js +0 -533
- package/dist/es5/mvt-layer/mvt-layer.js.map +0 -1
- package/dist/es5/quadkey-layer/quadkey-layer.js +0 -72
- package/dist/es5/quadkey-layer/quadkey-layer.js.map +0 -1
- package/dist/es5/quadkey-layer/quadkey-utils.js +0 -53
- package/dist/es5/quadkey-layer/quadkey-utils.js.map +0 -1
- package/dist/es5/s2-layer/s2-geometry.js +0 -158
- package/dist/es5/s2-layer/s2-geometry.js.map +0 -1
- package/dist/es5/s2-layer/s2-layer.js +0 -67
- package/dist/es5/s2-layer/s2-layer.js.map +0 -1
- package/dist/es5/s2-layer/s2-utils.js +0 -80
- package/dist/es5/s2-layer/s2-utils.js.map +0 -1
- package/dist/es5/terrain-layer/terrain-layer.js +0 -347
- package/dist/es5/terrain-layer/terrain-layer.js.map +0 -1
- package/dist/es5/tile-3d-layer/tile-3d-layer.js +0 -511
- package/dist/es5/tile-3d-layer/tile-3d-layer.js.map +0 -1
- package/dist/es5/tile-layer/tile-layer.js +0 -363
- package/dist/es5/tile-layer/tile-layer.js.map +0 -1
- package/dist/es5/tileset-2d/index.js +0 -66
- package/dist/es5/tileset-2d/index.js.map +0 -1
- package/dist/es5/tileset-2d/memoize.js +0 -47
- package/dist/es5/tileset-2d/memoize.js.map +0 -1
- package/dist/es5/tileset-2d/tile-2d-header.js +0 -250
- package/dist/es5/tileset-2d/tile-2d-header.js.map +0 -1
- package/dist/es5/tileset-2d/tile-2d-traversal.js +0 -256
- package/dist/es5/tileset-2d/tile-2d-traversal.js.map +0 -1
- package/dist/es5/tileset-2d/tileset-2d.js +0 -757
- package/dist/es5/tileset-2d/tileset-2d.js.map +0 -1
- package/dist/es5/tileset-2d/types.js +0 -2
- package/dist/es5/tileset-2d/types.js.map +0 -1
- package/dist/es5/tileset-2d/utils.js +0 -302
- package/dist/es5/tileset-2d/utils.js.map +0 -1
- package/dist/es5/trips-layer/trips-layer.js +0 -114
- package/dist/es5/trips-layer/trips-layer.js.map +0 -1
- package/dist/es5/wms-layer/utils.js +0 -18
- package/dist/es5/wms-layer/utils.js.map +0 -1
- package/dist/es5/wms-layer/wms-layer.js +0 -376
- package/dist/es5/wms-layer/wms-layer.js.map +0 -1
- package/dist/esm/geo-cell-layer/GeoCellLayer.js +0 -72
- package/dist/esm/geo-cell-layer/GeoCellLayer.js.map +0 -1
- package/dist/esm/geohash-layer/geohash-layer.js +0 -26
- package/dist/esm/geohash-layer/geohash-layer.js.map +0 -1
- package/dist/esm/geohash-layer/geohash-utils.js +0 -56
- package/dist/esm/geohash-layer/geohash-utils.js.map +0 -1
- package/dist/esm/great-circle-layer/great-circle-layer.js +0 -12
- package/dist/esm/great-circle-layer/great-circle-layer.js.map +0 -1
- package/dist/esm/h3-layers/h3-cluster-layer.js +0 -79
- package/dist/esm/h3-layers/h3-cluster-layer.js.map +0 -1
- package/dist/esm/h3-layers/h3-hexagon-layer.js +0 -280
- package/dist/esm/h3-layers/h3-hexagon-layer.js.map +0 -1
- package/dist/esm/h3-layers/h3-utils.js +0 -54
- package/dist/esm/h3-layers/h3-utils.js.map +0 -1
- package/dist/esm/index.js +0 -17
- package/dist/esm/index.js.map +0 -1
- package/dist/esm/mesh-layer/mesh-layer-fragment.glsl.js +0 -56
- package/dist/esm/mesh-layer/mesh-layer-fragment.glsl.js.map +0 -1
- package/dist/esm/mesh-layer/mesh-layer-vertex.glsl.js +0 -85
- package/dist/esm/mesh-layer/mesh-layer-vertex.glsl.js.map +0 -1
- package/dist/esm/mesh-layer/mesh-layer.js +0 -178
- package/dist/esm/mesh-layer/mesh-layer.js.map +0 -1
- package/dist/esm/mvt-layer/coordinate-transform.js +0 -49
- package/dist/esm/mvt-layer/coordinate-transform.js.map +0 -1
- package/dist/esm/mvt-layer/find-index-binary.js +0 -99
- package/dist/esm/mvt-layer/find-index-binary.js.map +0 -1
- package/dist/esm/mvt-layer/mvt-layer.js +0 -427
- package/dist/esm/mvt-layer/mvt-layer.js.map +0 -1
- package/dist/esm/quadkey-layer/quadkey-layer.js +0 -31
- package/dist/esm/quadkey-layer/quadkey-layer.js.map +0 -1
- package/dist/esm/quadkey-layer/quadkey-utils.js +0 -24
- package/dist/esm/quadkey-layer/quadkey-utils.js.map +0 -1
- package/dist/esm/s2-layer/s2-geometry.js +0 -126
- package/dist/esm/s2-layer/s2-geometry.js.map +0 -1
- package/dist/esm/s2-layer/s2-layer.js +0 -26
- package/dist/esm/s2-layer/s2-layer.js.map +0 -1
- package/dist/esm/s2-layer/s2-utils.js +0 -69
- package/dist/esm/s2-layer/s2-utils.js.map +0 -1
- package/dist/esm/terrain-layer/terrain-layer.js +0 -292
- package/dist/esm/terrain-layer/terrain-layer.js.map +0 -1
- package/dist/esm/tile-3d-layer/tile-3d-layer.js +0 -438
- package/dist/esm/tile-3d-layer/tile-3d-layer.js.map +0 -1
- package/dist/esm/tile-layer/tile-layer.js +0 -299
- package/dist/esm/tile-layer/tile-layer.js.map +0 -1
- package/dist/esm/tileset-2d/index.js +0 -4
- package/dist/esm/tileset-2d/index.js.map +0 -1
- package/dist/esm/tileset-2d/memoize.js +0 -40
- package/dist/esm/tileset-2d/memoize.js.map +0 -1
- package/dist/esm/tileset-2d/tile-2d-header.js +0 -179
- package/dist/esm/tileset-2d/tile-2d-header.js.map +0 -1
- package/dist/esm/tileset-2d/tile-2d-traversal.js +0 -184
- package/dist/esm/tileset-2d/tile-2d-traversal.js.map +0 -1
- package/dist/esm/tileset-2d/tileset-2d.js +0 -509
- package/dist/esm/tileset-2d/tileset-2d.js.map +0 -1
- package/dist/esm/tileset-2d/types.js +0 -2
- package/dist/esm/tileset-2d/types.js.map +0 -1
- package/dist/esm/tileset-2d/utils.js +0 -233
- package/dist/esm/tileset-2d/utils.js.map +0 -1
- package/dist/esm/trips-layer/trips-layer.js +0 -88
- package/dist/esm/trips-layer/trips-layer.js.map +0 -1
- package/dist/esm/wms-layer/utils.js +0 -9
- package/dist/esm/wms-layer/utils.js.map +0 -1
- package/dist/esm/wms-layer/wms-layer.js +0 -231
- package/dist/esm/wms-layer/wms-layer.js.map +0 -1
- package/typed/geohash-layer/geohash-layer.d.ts.map +0 -1
- package/typed/h3-layers/h3-cluster-layer.d.ts.map +0 -1
- package/typed/index.d.ts +0 -31
- package/typed/index.d.ts.map +0 -1
- package/typed/mesh-layer/mesh-layer-fragment.glsl.d.ts +0 -3
- package/typed/mvt-layer/find-index-binary.d.ts +0 -12
- package/typed/mvt-layer/find-index-binary.d.ts.map +0 -1
- package/typed/mvt-layer/mvt-layer.d.ts.map +0 -1
- package/typed/quadkey-layer/quadkey-layer.d.ts.map +0 -1
- package/typed/s2-layer/s2-layer.d.ts.map +0 -1
- package/typed/terrain-layer/terrain-layer.d.ts.map +0 -1
- package/typed/tile-layer/tile-layer.d.ts.map +0 -1
- package/typed/tileset-2d/index.d.ts +0 -7
- package/typed/tileset-2d/index.d.ts.map +0 -1
- package/typed/tileset-2d/tile-2d-header.d.ts.map +0 -1
- package/typed/tileset-2d/tile-2d-traversal.d.ts +0 -4
- package/typed/tileset-2d/tile-2d-traversal.d.ts.map +0 -1
- package/typed/tileset-2d/tileset-2d.d.ts.map +0 -1
- package/typed/tileset-2d/utils.d.ts.map +0 -1
- /package/{typed → dist}/geo-cell-layer/GeoCellLayer.d.ts +0 -0
- /package/{typed → dist}/geo-cell-layer/GeoCellLayer.d.ts.map +0 -0
- /package/{typed → dist}/geohash-layer/geohash-utils.d.ts +0 -0
- /package/{typed → dist}/geohash-layer/geohash-utils.d.ts.map +0 -0
- /package/{typed → dist}/great-circle-layer/great-circle-layer.d.ts +0 -0
- /package/{typed → dist}/great-circle-layer/great-circle-layer.d.ts.map +0 -0
- /package/{typed → dist}/h3-layers/h3-hexagon-layer.d.ts +0 -0
- /package/{typed → dist}/h3-layers/h3-hexagon-layer.d.ts.map +0 -0
- /package/{typed → dist}/h3-layers/h3-utils.d.ts +0 -0
- /package/{typed → dist}/h3-layers/h3-utils.d.ts.map +0 -0
- /package/{typed → dist}/mesh-layer/mesh-layer-vertex.glsl.d.ts +0 -0
- /package/{typed → dist}/mesh-layer/mesh-layer-vertex.glsl.d.ts.map +0 -0
- /package/{typed → dist}/mesh-layer/mesh-layer.d.ts +0 -0
- /package/{typed → dist}/quadkey-layer/quadkey-utils.d.ts +0 -0
- /package/{typed → dist}/quadkey-layer/quadkey-utils.d.ts.map +0 -0
- /package/{typed → dist}/s2-layer/s2-geometry.d.ts +0 -0
- /package/{typed → dist}/s2-layer/s2-geometry.d.ts.map +0 -0
- /package/{typed → dist}/s2-layer/s2-utils.d.ts +0 -0
- /package/{typed → dist}/s2-layer/s2-utils.d.ts.map +0 -0
- /package/{typed → dist}/tileset-2d/memoize.d.ts +0 -0
- /package/{typed → dist}/tileset-2d/memoize.d.ts.map +0 -0
- /package/{typed → dist}/tileset-2d/types.d.ts +0 -0
- /package/{typed → dist}/tileset-2d/types.d.ts.map +0 -0
- /package/{typed → dist}/wms-layer/utils.d.ts +0 -0
- /package/{typed → dist}/wms-layer/utils.d.ts.map +0 -0
- /package/{typed → dist}/wms-layer/wms-layer.d.ts +0 -0
- /package/{typed → dist}/wms-layer/wms-layer.d.ts.map +0 -0
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
// Copyright (c) 2015 - 2017 Uber Technologies, Inc.
|
|
2
|
+
//
|
|
3
|
+
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
4
|
+
// of this software and associated documentation files (the "Software"), to deal
|
|
5
|
+
// in the Software without restriction, including without limitation the rights
|
|
6
|
+
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
7
|
+
// copies of the Software, and to permit persons to whom the Software is
|
|
8
|
+
// furnished to do so, subject to the following conditions:
|
|
9
|
+
//
|
|
10
|
+
// The above copyright notice and this permission notice shall be included in
|
|
11
|
+
// all copies or substantial portions of the Software.
|
|
12
|
+
//
|
|
13
|
+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
14
|
+
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
15
|
+
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
16
|
+
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
17
|
+
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
18
|
+
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
19
|
+
// THE SOFTWARE.
|
|
20
|
+
import { CompositeLayer, log } from '@deck.gl/core';
|
|
21
|
+
import { SimpleMeshLayer } from '@deck.gl/mesh-layers';
|
|
22
|
+
import { COORDINATE_SYSTEM } from '@deck.gl/core';
|
|
23
|
+
import { TerrainWorkerLoader } from '@loaders.gl/terrain';
|
|
24
|
+
import TileLayer from "../tile-layer/tile-layer.js";
|
|
25
|
+
import { urlType, getURLFromTemplate } from "../tileset-2d/index.js";
|
|
26
|
+
const DUMMY_DATA = [1];
|
|
27
|
+
const defaultProps = {
|
|
28
|
+
...TileLayer.defaultProps,
|
|
29
|
+
// Image url that encodes height data
|
|
30
|
+
elevationData: urlType,
|
|
31
|
+
// Image url to use as texture
|
|
32
|
+
texture: { ...urlType, optional: true },
|
|
33
|
+
// Martini error tolerance in meters, smaller number -> more detailed mesh
|
|
34
|
+
meshMaxError: { type: 'number', value: 4.0 },
|
|
35
|
+
// Bounding box of the terrain image, [minX, minY, maxX, maxY] in world coordinates
|
|
36
|
+
bounds: { type: 'array', value: null, optional: true, compare: true },
|
|
37
|
+
// Color to use if texture is unavailable
|
|
38
|
+
color: { type: 'color', value: [255, 255, 255] },
|
|
39
|
+
// Object to decode height data, from (r, g, b) to height in meters
|
|
40
|
+
elevationDecoder: {
|
|
41
|
+
type: 'object',
|
|
42
|
+
value: {
|
|
43
|
+
rScaler: 1,
|
|
44
|
+
gScaler: 0,
|
|
45
|
+
bScaler: 0,
|
|
46
|
+
offset: 0
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
// Supply url to local terrain worker bundle. Only required if running offline and cannot access CDN.
|
|
50
|
+
workerUrl: '',
|
|
51
|
+
// Same as SimpleMeshLayer wireframe
|
|
52
|
+
wireframe: false,
|
|
53
|
+
material: true,
|
|
54
|
+
loaders: [TerrainWorkerLoader]
|
|
55
|
+
};
|
|
56
|
+
// Turns array of templates into a single string to work around shallow change
|
|
57
|
+
function urlTemplateToUpdateTrigger(template) {
|
|
58
|
+
if (Array.isArray(template)) {
|
|
59
|
+
return template.join(';');
|
|
60
|
+
}
|
|
61
|
+
return template || '';
|
|
62
|
+
}
|
|
63
|
+
/** Render mesh surfaces from height map images. */
|
|
64
|
+
export default class TerrainLayer extends CompositeLayer {
|
|
65
|
+
static { this.defaultProps = defaultProps; }
|
|
66
|
+
static { this.layerName = 'TerrainLayer'; }
|
|
67
|
+
updateState({ props, oldProps }) {
|
|
68
|
+
const elevationDataChanged = props.elevationData !== oldProps.elevationData;
|
|
69
|
+
if (elevationDataChanged) {
|
|
70
|
+
const { elevationData } = props;
|
|
71
|
+
const isTiled = elevationData &&
|
|
72
|
+
(Array.isArray(elevationData) ||
|
|
73
|
+
(elevationData.includes('{x}') && elevationData.includes('{y}')));
|
|
74
|
+
this.setState({ isTiled });
|
|
75
|
+
}
|
|
76
|
+
// Reloading for single terrain mesh
|
|
77
|
+
const shouldReload = elevationDataChanged ||
|
|
78
|
+
props.meshMaxError !== oldProps.meshMaxError ||
|
|
79
|
+
props.elevationDecoder !== oldProps.elevationDecoder ||
|
|
80
|
+
props.bounds !== oldProps.bounds;
|
|
81
|
+
if (!this.state.isTiled && shouldReload) {
|
|
82
|
+
// When state.isTiled, elevationData cannot be an array
|
|
83
|
+
const terrain = this.loadTerrain(props);
|
|
84
|
+
this.setState({ terrain });
|
|
85
|
+
}
|
|
86
|
+
// TODO - remove in v9
|
|
87
|
+
// @ts-ignore
|
|
88
|
+
if (props.workerUrl) {
|
|
89
|
+
log.removed('workerUrl', 'loadOptions.terrain.workerUrl')();
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
loadTerrain({ elevationData, bounds, elevationDecoder, meshMaxError, signal }) {
|
|
93
|
+
if (!elevationData) {
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
let loadOptions = this.getLoadOptions();
|
|
97
|
+
loadOptions = {
|
|
98
|
+
...loadOptions,
|
|
99
|
+
terrain: {
|
|
100
|
+
skirtHeight: this.state.isTiled ? meshMaxError * 2 : 0,
|
|
101
|
+
...loadOptions?.terrain,
|
|
102
|
+
bounds,
|
|
103
|
+
meshMaxError,
|
|
104
|
+
elevationDecoder
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
const { fetch } = this.props;
|
|
108
|
+
return fetch(elevationData, { propName: 'elevationData', layer: this, loadOptions, signal });
|
|
109
|
+
}
|
|
110
|
+
getTiledTerrainData(tile) {
|
|
111
|
+
const { elevationData, fetch, texture, elevationDecoder, meshMaxError } = this.props;
|
|
112
|
+
const { viewport } = this.context;
|
|
113
|
+
const dataUrl = getURLFromTemplate(elevationData, tile);
|
|
114
|
+
const textureUrl = texture && getURLFromTemplate(texture, tile);
|
|
115
|
+
const { signal } = tile;
|
|
116
|
+
let bottomLeft = [0, 0];
|
|
117
|
+
let topRight = [0, 0];
|
|
118
|
+
if (viewport.isGeospatial) {
|
|
119
|
+
const bbox = tile.bbox;
|
|
120
|
+
bottomLeft = viewport.projectFlat([bbox.west, bbox.south]);
|
|
121
|
+
topRight = viewport.projectFlat([bbox.east, bbox.north]);
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
const bbox = tile.bbox;
|
|
125
|
+
bottomLeft = [bbox.left, bbox.bottom];
|
|
126
|
+
topRight = [bbox.right, bbox.top];
|
|
127
|
+
}
|
|
128
|
+
const bounds = [bottomLeft[0], bottomLeft[1], topRight[0], topRight[1]];
|
|
129
|
+
const terrain = this.loadTerrain({
|
|
130
|
+
elevationData: dataUrl,
|
|
131
|
+
bounds,
|
|
132
|
+
elevationDecoder,
|
|
133
|
+
meshMaxError,
|
|
134
|
+
signal
|
|
135
|
+
});
|
|
136
|
+
const surface = textureUrl
|
|
137
|
+
? // If surface image fails to load, the tile should still be displayed
|
|
138
|
+
fetch(textureUrl, { propName: 'texture', layer: this, loaders: [], signal }).catch(_ => null)
|
|
139
|
+
: Promise.resolve(null);
|
|
140
|
+
return Promise.all([terrain, surface]);
|
|
141
|
+
}
|
|
142
|
+
renderSubLayers(props) {
|
|
143
|
+
const SubLayerClass = this.getSubLayerClass('mesh', SimpleMeshLayer);
|
|
144
|
+
const { color, wireframe, material } = this.props;
|
|
145
|
+
const { data } = props;
|
|
146
|
+
if (!data) {
|
|
147
|
+
return null;
|
|
148
|
+
}
|
|
149
|
+
const [mesh, texture] = data;
|
|
150
|
+
return new SubLayerClass(props, {
|
|
151
|
+
data: DUMMY_DATA,
|
|
152
|
+
mesh,
|
|
153
|
+
texture,
|
|
154
|
+
_instanced: false,
|
|
155
|
+
coordinateSystem: COORDINATE_SYSTEM.CARTESIAN,
|
|
156
|
+
getPosition: d => [0, 0, 0],
|
|
157
|
+
getColor: color,
|
|
158
|
+
wireframe,
|
|
159
|
+
material
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
// Update zRange of viewport
|
|
163
|
+
onViewportLoad(tiles) {
|
|
164
|
+
if (!tiles) {
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
const { zRange } = this.state;
|
|
168
|
+
const ranges = tiles
|
|
169
|
+
.map(tile => tile.content)
|
|
170
|
+
.filter(Boolean)
|
|
171
|
+
.map(arr => {
|
|
172
|
+
// @ts-ignore
|
|
173
|
+
const bounds = arr[0].header.boundingBox;
|
|
174
|
+
return bounds.map(bound => bound[2]);
|
|
175
|
+
});
|
|
176
|
+
if (ranges.length === 0) {
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
const minZ = Math.min(...ranges.map(x => x[0]));
|
|
180
|
+
const maxZ = Math.max(...ranges.map(x => x[1]));
|
|
181
|
+
if (!zRange || minZ < zRange[0] || maxZ > zRange[1]) {
|
|
182
|
+
this.setState({ zRange: [minZ, maxZ] });
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
renderLayers() {
|
|
186
|
+
const { color, material, elevationData, texture, wireframe, meshMaxError, elevationDecoder, tileSize, maxZoom, minZoom, extent, maxRequests, onTileLoad, onTileUnload, onTileError, maxCacheSize, maxCacheByteSize, refinementStrategy } = this.props;
|
|
187
|
+
if (this.state.isTiled) {
|
|
188
|
+
return new TileLayer(this.getSubLayerProps({
|
|
189
|
+
id: 'tiles'
|
|
190
|
+
}), {
|
|
191
|
+
getTileData: this.getTiledTerrainData.bind(this),
|
|
192
|
+
renderSubLayers: this.renderSubLayers.bind(this),
|
|
193
|
+
updateTriggers: {
|
|
194
|
+
getTileData: {
|
|
195
|
+
elevationData: urlTemplateToUpdateTrigger(elevationData),
|
|
196
|
+
texture: urlTemplateToUpdateTrigger(texture),
|
|
197
|
+
meshMaxError,
|
|
198
|
+
elevationDecoder
|
|
199
|
+
}
|
|
200
|
+
},
|
|
201
|
+
onViewportLoad: this.onViewportLoad.bind(this),
|
|
202
|
+
zRange: this.state.zRange || null,
|
|
203
|
+
tileSize,
|
|
204
|
+
maxZoom,
|
|
205
|
+
minZoom,
|
|
206
|
+
extent,
|
|
207
|
+
maxRequests,
|
|
208
|
+
onTileLoad,
|
|
209
|
+
onTileUnload,
|
|
210
|
+
onTileError,
|
|
211
|
+
maxCacheSize,
|
|
212
|
+
maxCacheByteSize,
|
|
213
|
+
refinementStrategy
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
if (!elevationData) {
|
|
217
|
+
return null;
|
|
218
|
+
}
|
|
219
|
+
const SubLayerClass = this.getSubLayerClass('mesh', SimpleMeshLayer);
|
|
220
|
+
return new SubLayerClass(this.getSubLayerProps({
|
|
221
|
+
id: 'mesh'
|
|
222
|
+
}), {
|
|
223
|
+
data: DUMMY_DATA,
|
|
224
|
+
mesh: this.state.terrain,
|
|
225
|
+
texture,
|
|
226
|
+
_instanced: false,
|
|
227
|
+
getPosition: d => [0, 0, 0],
|
|
228
|
+
getColor: color,
|
|
229
|
+
material,
|
|
230
|
+
wireframe
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
}
|
|
@@ -45,7 +45,21 @@ export default class Tile3DLayer<DataT = any, ExtraPropsT extends {} = {}> exten
|
|
|
45
45
|
shouldUpdateState({ changeFlags }: UpdateParameters<this>): boolean;
|
|
46
46
|
updateState({ props, oldProps, changeFlags }: UpdateParameters<this>): void;
|
|
47
47
|
activateViewport(viewport: Viewport): void;
|
|
48
|
-
getPickingInfo({ info, sourceLayer }: GetPickingInfoParams):
|
|
48
|
+
getPickingInfo({ info, sourceLayer }: GetPickingInfoParams): {
|
|
49
|
+
color: Uint8Array | null;
|
|
50
|
+
layer: Layer<{}> | null;
|
|
51
|
+
sourceLayer?: Layer<{}> | null | undefined;
|
|
52
|
+
viewport?: Viewport | undefined;
|
|
53
|
+
index: number;
|
|
54
|
+
picked: boolean;
|
|
55
|
+
object?: any;
|
|
56
|
+
x: number;
|
|
57
|
+
y: number;
|
|
58
|
+
pixel?: [number, number] | undefined;
|
|
59
|
+
coordinate?: number[] | undefined;
|
|
60
|
+
devicePixel?: [number, number] | undefined;
|
|
61
|
+
pixelRatio: number;
|
|
62
|
+
};
|
|
49
63
|
filterSubLayer({ layer, viewport }: FilterContext): boolean;
|
|
50
64
|
protected _updateAutoHighlight(info: PickingInfo): void;
|
|
51
65
|
private _loadTileset;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tile-3d-layer.d.ts","sourceRoot":"","sources":["../../src/tile-3d-layer/tile-3d-layer.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,QAAQ,EACR,KAAK,EACL,cAAc,EACd,mBAAmB,EAEnB,aAAa,EACb,oBAAoB,EACpB,KAAK,EACL,UAAU,EAEV,WAAW,EACX,gBAAgB,EAChB,QAAQ,EACR,YAAY,EACb,MAAM,eAAe,CAAC;AAOvB,OAAO,EAAC,SAAS,EAAE,MAAM,EAAY,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAC,aAAa,EAAC,MAAM,sBAAsB,CAAC;AAmBnD,8CAA8C;AAC9C,MAAM,MAAM,gBAAgB,CAAC,KAAK,GAAG,OAAO,IAAI,iBAAiB,CAAC,KAAK,CAAC,GAAG,mBAAmB,CAAC;AAE/F,qCAAqC;AACrC,KAAK,iBAAiB,CAAC,KAAK,IAAI;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,aAAa,CAAC,EAAE,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAEvC,8CAA8C;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,MAAM,CAAC,EAAE,OAAO,aAAa,CAAC;IAE9B,gDAAgD;IAChD,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;IAE1C,8DAA8D;IAC9D,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAEpC,uCAAuC;IACvC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAEtC,yCAAyC;IACzC,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAEnE,4EAA4E;IAC5E,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,KAAK,CAAC;CACzC,CAAC;AAEF,oLAAoL;AACpL,MAAM,CAAC,OAAO,OAAO,WAAW,CAAC,KAAK,GAAG,GAAG,EAAE,WAAW,SAAS,EAAE,GAAG,EAAE,CAAE,SAAQ,cAAc,CAC/F,WAAW,GAAG,QAAQ,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CACjD;IACC,MAAM,CAAC,YAAY,0CAAgB;IACnC,MAAM,CAAC,SAAS,SAAiB;IAEjC,KAAK,EAAG;QACN,eAAe,EAAE,EAAE,CAAC;QACpB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,oBAAoB,EAAE;YAAC,CAAC,UAAU,EAAE,MAAM,GAAG,QAAQ,CAAA;SAAC,GAAG,IAAI,CAAC;QAC9D,QAAQ,EAAE;YAAC,CAAC,OAAO,EAAE,MAAM,GAAG,GAAG,CAAA;SAAC,CAAC;QACnC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;KAC7B,CAAC;IAEF,eAAe;IAaf,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,iBAAiB,CAAC,EAAC,WAAW,EAAC,EAAE,gBAAgB,CAAC,IAAI,CAAC,GAAG,OAAO;IAIjE,WAAW,CAAC,EAAC,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAC,EAAE,gBAAgB,CAAC,IAAI,CAAC,GAAG,IAAI;IAuBzE,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAY1C,cAAc,CAAC,EAAC,IAAI,EAAE,WAAW,EAAC,EAAE,oBAAoB
|
|
1
|
+
{"version":3,"file":"tile-3d-layer.d.ts","sourceRoot":"","sources":["../../src/tile-3d-layer/tile-3d-layer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
import { Geometry } from '@luma.gl/engine';
|
|
2
|
+
import { CompositeLayer, COORDINATE_SYSTEM, log } from '@deck.gl/core';
|
|
3
|
+
import { PointCloudLayer } from '@deck.gl/layers';
|
|
4
|
+
import { ScenegraphLayer } from '@deck.gl/mesh-layers';
|
|
5
|
+
import { default as MeshLayer } from "../mesh-layer/mesh-layer.js";
|
|
6
|
+
import { load } from '@loaders.gl/core';
|
|
7
|
+
import { Tileset3D, TILE_TYPE } from '@loaders.gl/tiles';
|
|
8
|
+
import { Tiles3DLoader } from '@loaders.gl/3d-tiles';
|
|
9
|
+
const SINGLE_DATA = [0];
|
|
10
|
+
const defaultProps = {
|
|
11
|
+
getPointColor: { type: 'accessor', value: [0, 0, 0, 255] },
|
|
12
|
+
pointSize: 1.0,
|
|
13
|
+
// Disable async data loading (handling it in _loadTileSet)
|
|
14
|
+
data: '',
|
|
15
|
+
loader: Tiles3DLoader,
|
|
16
|
+
onTilesetLoad: { type: 'function', value: tileset3d => { } },
|
|
17
|
+
onTileLoad: { type: 'function', value: tileHeader => { } },
|
|
18
|
+
onTileUnload: { type: 'function', value: tileHeader => { } },
|
|
19
|
+
onTileError: { type: 'function', value: (tile, message, url) => { } },
|
|
20
|
+
_getMeshColor: { type: 'function', value: tileHeader => [255, 255, 255] }
|
|
21
|
+
};
|
|
22
|
+
/** Render 3d tiles data formatted according to the [3D Tiles Specification](https://www.opengeospatial.org/standards/3DTiles) and [`ESRI I3S`](https://github.com/Esri/i3s-spec) */
|
|
23
|
+
export default class Tile3DLayer extends CompositeLayer {
|
|
24
|
+
static { this.defaultProps = defaultProps; }
|
|
25
|
+
static { this.layerName = 'Tile3DLayer'; }
|
|
26
|
+
initializeState() {
|
|
27
|
+
if ('onTileLoadFail' in this.props) {
|
|
28
|
+
log.removed('onTileLoadFail', 'onTileError')();
|
|
29
|
+
}
|
|
30
|
+
// prop verification
|
|
31
|
+
this.state = {
|
|
32
|
+
layerMap: {},
|
|
33
|
+
tileset3d: null,
|
|
34
|
+
activeViewports: {},
|
|
35
|
+
lastUpdatedViewports: null
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
get isLoaded() {
|
|
39
|
+
return Boolean(this.state?.tileset3d?.isLoaded() && super.isLoaded);
|
|
40
|
+
}
|
|
41
|
+
shouldUpdateState({ changeFlags }) {
|
|
42
|
+
return changeFlags.somethingChanged;
|
|
43
|
+
}
|
|
44
|
+
updateState({ props, oldProps, changeFlags }) {
|
|
45
|
+
if (props.data && props.data !== oldProps.data) {
|
|
46
|
+
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
|
47
|
+
this._loadTileset(props.data);
|
|
48
|
+
}
|
|
49
|
+
if (changeFlags.viewportChanged) {
|
|
50
|
+
const { activeViewports } = this.state;
|
|
51
|
+
const viewportsNumber = Object.keys(activeViewports).length;
|
|
52
|
+
if (viewportsNumber) {
|
|
53
|
+
this._updateTileset(activeViewports);
|
|
54
|
+
this.state.lastUpdatedViewports = activeViewports;
|
|
55
|
+
this.state.activeViewports = {};
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
if (changeFlags.propsChanged) {
|
|
59
|
+
const { layerMap } = this.state;
|
|
60
|
+
for (const key in layerMap) {
|
|
61
|
+
layerMap[key].needsUpdate = true;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
activateViewport(viewport) {
|
|
66
|
+
const { activeViewports, lastUpdatedViewports } = this.state;
|
|
67
|
+
this.internalState.viewport = viewport;
|
|
68
|
+
activeViewports[viewport.id] = viewport;
|
|
69
|
+
const lastViewport = lastUpdatedViewports?.[viewport.id];
|
|
70
|
+
if (!lastViewport || !viewport.equals(lastViewport)) {
|
|
71
|
+
this.setChangeFlags({ viewportChanged: true });
|
|
72
|
+
this.setNeedsUpdate();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
getPickingInfo({ info, sourceLayer }) {
|
|
76
|
+
const sourceTile = sourceLayer && sourceLayer.props.tile;
|
|
77
|
+
if (info.picked) {
|
|
78
|
+
info.object = sourceTile;
|
|
79
|
+
}
|
|
80
|
+
info.sourceTile = sourceTile;
|
|
81
|
+
return info;
|
|
82
|
+
}
|
|
83
|
+
filterSubLayer({ layer, viewport }) {
|
|
84
|
+
// All sublayers will have a tile prop
|
|
85
|
+
const { tile } = layer.props;
|
|
86
|
+
const { id: viewportId } = viewport;
|
|
87
|
+
return tile.selected && tile.viewportIds.includes(viewportId);
|
|
88
|
+
}
|
|
89
|
+
_updateAutoHighlight(info) {
|
|
90
|
+
const sourceTile = info.sourceTile;
|
|
91
|
+
const layerCache = this.state.layerMap[sourceTile?.id];
|
|
92
|
+
if (layerCache && layerCache.layer) {
|
|
93
|
+
layerCache.layer.updateAutoHighlight(info);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
async _loadTileset(tilesetUrl) {
|
|
97
|
+
const { loadOptions = {} } = this.props;
|
|
98
|
+
// TODO: deprecate `loader` in v9.0
|
|
99
|
+
// @ts-ignore
|
|
100
|
+
const loaders = this.props.loader || this.props.loaders;
|
|
101
|
+
const loader = Array.isArray(loaders) ? loaders[0] : loaders;
|
|
102
|
+
const options = { loadOptions: { ...loadOptions } };
|
|
103
|
+
let actualTilesetUrl = tilesetUrl;
|
|
104
|
+
if (loader.preload) {
|
|
105
|
+
const preloadOptions = await loader.preload(tilesetUrl, loadOptions);
|
|
106
|
+
if (preloadOptions.url) {
|
|
107
|
+
actualTilesetUrl = preloadOptions.url;
|
|
108
|
+
}
|
|
109
|
+
if (preloadOptions.headers) {
|
|
110
|
+
options.loadOptions.fetch = {
|
|
111
|
+
...options.loadOptions.fetch,
|
|
112
|
+
headers: preloadOptions.headers
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
Object.assign(options, preloadOptions);
|
|
116
|
+
}
|
|
117
|
+
const tilesetJson = await load(actualTilesetUrl, loader, options.loadOptions);
|
|
118
|
+
const tileset3d = new Tileset3D(tilesetJson, {
|
|
119
|
+
onTileLoad: this._onTileLoad.bind(this),
|
|
120
|
+
onTileUnload: this._onTileUnload.bind(this),
|
|
121
|
+
onTileError: this.props.onTileError,
|
|
122
|
+
...options
|
|
123
|
+
});
|
|
124
|
+
this.setState({
|
|
125
|
+
tileset3d,
|
|
126
|
+
layerMap: {}
|
|
127
|
+
});
|
|
128
|
+
this._updateTileset(this.state.activeViewports);
|
|
129
|
+
this.props.onTilesetLoad(tileset3d);
|
|
130
|
+
}
|
|
131
|
+
_onTileLoad(tileHeader) {
|
|
132
|
+
const { lastUpdatedViewports } = this.state;
|
|
133
|
+
this.props.onTileLoad(tileHeader);
|
|
134
|
+
this._updateTileset(lastUpdatedViewports);
|
|
135
|
+
this.setNeedsUpdate();
|
|
136
|
+
}
|
|
137
|
+
_onTileUnload(tileHeader) {
|
|
138
|
+
// Was cleaned up from tileset cache. We no longer need to track it.
|
|
139
|
+
delete this.state.layerMap[tileHeader.id];
|
|
140
|
+
this.props.onTileUnload(tileHeader);
|
|
141
|
+
}
|
|
142
|
+
_updateTileset(viewports) {
|
|
143
|
+
if (!viewports) {
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
const { tileset3d } = this.state;
|
|
147
|
+
const { timeline } = this.context;
|
|
148
|
+
const viewportsNumber = Object.keys(viewports).length;
|
|
149
|
+
if (!timeline || !viewportsNumber || !tileset3d) {
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
|
153
|
+
tileset3d.selectTiles(Object.values(viewports)).then(frameNumber => {
|
|
154
|
+
const tilesetChanged = this.state.frameNumber !== frameNumber;
|
|
155
|
+
if (tilesetChanged) {
|
|
156
|
+
this.setState({ frameNumber });
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
_getSubLayer(tileHeader, oldLayer) {
|
|
161
|
+
if (!tileHeader.content) {
|
|
162
|
+
return null;
|
|
163
|
+
}
|
|
164
|
+
switch (tileHeader.type) {
|
|
165
|
+
case TILE_TYPE.POINTCLOUD:
|
|
166
|
+
return this._makePointCloudLayer(tileHeader, oldLayer);
|
|
167
|
+
case TILE_TYPE.SCENEGRAPH:
|
|
168
|
+
return this._make3DModelLayer(tileHeader);
|
|
169
|
+
case TILE_TYPE.MESH:
|
|
170
|
+
return this._makeSimpleMeshLayer(tileHeader, oldLayer);
|
|
171
|
+
default:
|
|
172
|
+
throw new Error(`Tile3DLayer: Failed to render layer of type ${tileHeader.content.type}`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
_makePointCloudLayer(tileHeader, oldLayer) {
|
|
176
|
+
const { attributes, pointCount, constantRGBA, cartographicOrigin, modelMatrix } = tileHeader.content;
|
|
177
|
+
const { positions, normals, colors } = attributes;
|
|
178
|
+
if (!positions) {
|
|
179
|
+
return null;
|
|
180
|
+
}
|
|
181
|
+
const data = (oldLayer && oldLayer.props.data) || {
|
|
182
|
+
header: {
|
|
183
|
+
vertexCount: pointCount
|
|
184
|
+
},
|
|
185
|
+
attributes: {
|
|
186
|
+
POSITION: positions,
|
|
187
|
+
NORMAL: normals,
|
|
188
|
+
COLOR_0: colors
|
|
189
|
+
}
|
|
190
|
+
};
|
|
191
|
+
const { pointSize, getPointColor } = this.props;
|
|
192
|
+
const SubLayerClass = this.getSubLayerClass('pointcloud', PointCloudLayer);
|
|
193
|
+
return new SubLayerClass({
|
|
194
|
+
pointSize
|
|
195
|
+
}, this.getSubLayerProps({
|
|
196
|
+
id: 'pointcloud'
|
|
197
|
+
}), {
|
|
198
|
+
id: `${this.id}-pointcloud-${tileHeader.id}`,
|
|
199
|
+
tile: tileHeader,
|
|
200
|
+
data,
|
|
201
|
+
coordinateSystem: COORDINATE_SYSTEM.METER_OFFSETS,
|
|
202
|
+
coordinateOrigin: cartographicOrigin,
|
|
203
|
+
modelMatrix,
|
|
204
|
+
getColor: constantRGBA || getPointColor,
|
|
205
|
+
_offset: 0
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
_make3DModelLayer(tileHeader) {
|
|
209
|
+
const { gltf, instances, cartographicOrigin, modelMatrix } = tileHeader.content;
|
|
210
|
+
const SubLayerClass = this.getSubLayerClass('scenegraph', ScenegraphLayer);
|
|
211
|
+
return new SubLayerClass({
|
|
212
|
+
_lighting: 'pbr'
|
|
213
|
+
}, this.getSubLayerProps({
|
|
214
|
+
id: 'scenegraph'
|
|
215
|
+
}), {
|
|
216
|
+
id: `${this.id}-scenegraph-${tileHeader.id}`,
|
|
217
|
+
tile: tileHeader,
|
|
218
|
+
data: instances || SINGLE_DATA,
|
|
219
|
+
scenegraph: gltf,
|
|
220
|
+
coordinateSystem: COORDINATE_SYSTEM.METER_OFFSETS,
|
|
221
|
+
coordinateOrigin: cartographicOrigin,
|
|
222
|
+
modelMatrix,
|
|
223
|
+
getTransformMatrix: instance => instance.modelMatrix,
|
|
224
|
+
getPosition: [0, 0, 0],
|
|
225
|
+
_offset: 0
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
_makeSimpleMeshLayer(tileHeader, oldLayer) {
|
|
229
|
+
const content = tileHeader.content;
|
|
230
|
+
const { attributes, indices, modelMatrix, cartographicOrigin, coordinateSystem = COORDINATE_SYSTEM.METER_OFFSETS, material, featureIds } = content;
|
|
231
|
+
const { _getMeshColor } = this.props;
|
|
232
|
+
const geometry = (oldLayer && oldLayer.props.mesh) ||
|
|
233
|
+
new Geometry({
|
|
234
|
+
topology: 'triangle-list',
|
|
235
|
+
attributes: getMeshGeometry(attributes),
|
|
236
|
+
indices
|
|
237
|
+
});
|
|
238
|
+
const SubLayerClass = this.getSubLayerClass('mesh', MeshLayer);
|
|
239
|
+
return new SubLayerClass(this.getSubLayerProps({
|
|
240
|
+
id: 'mesh'
|
|
241
|
+
}), {
|
|
242
|
+
id: `${this.id}-mesh-${tileHeader.id}`,
|
|
243
|
+
tile: tileHeader,
|
|
244
|
+
mesh: geometry,
|
|
245
|
+
data: SINGLE_DATA,
|
|
246
|
+
getColor: _getMeshColor(tileHeader),
|
|
247
|
+
pbrMaterial: material,
|
|
248
|
+
modelMatrix,
|
|
249
|
+
coordinateOrigin: cartographicOrigin,
|
|
250
|
+
coordinateSystem,
|
|
251
|
+
featureIds,
|
|
252
|
+
_offset: 0
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
renderLayers() {
|
|
256
|
+
const { tileset3d, layerMap } = this.state;
|
|
257
|
+
if (!tileset3d) {
|
|
258
|
+
return null;
|
|
259
|
+
}
|
|
260
|
+
// loaders.gl doesn't provide a type for tileset3d.tiles
|
|
261
|
+
return tileset3d.tiles
|
|
262
|
+
.map(tile => {
|
|
263
|
+
const layerCache = (layerMap[tile.id] = layerMap[tile.id] || { tile });
|
|
264
|
+
let { layer } = layerCache;
|
|
265
|
+
if (tile.selected) {
|
|
266
|
+
// render selected tiles
|
|
267
|
+
if (!layer) {
|
|
268
|
+
// create layer
|
|
269
|
+
layer = this._getSubLayer(tile);
|
|
270
|
+
}
|
|
271
|
+
else if (layerCache.needsUpdate) {
|
|
272
|
+
// props have changed, rerender layer
|
|
273
|
+
layer = this._getSubLayer(tile, layer);
|
|
274
|
+
layerCache.needsUpdate = false;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
layerCache.layer = layer;
|
|
278
|
+
return layer;
|
|
279
|
+
})
|
|
280
|
+
.filter(Boolean);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
function getMeshGeometry(contentAttributes) {
|
|
284
|
+
const attributes = {};
|
|
285
|
+
attributes.positions = {
|
|
286
|
+
...contentAttributes.positions,
|
|
287
|
+
value: new Float32Array(contentAttributes.positions.value)
|
|
288
|
+
};
|
|
289
|
+
if (contentAttributes.normals) {
|
|
290
|
+
attributes.normals = contentAttributes.normals;
|
|
291
|
+
}
|
|
292
|
+
if (contentAttributes.texCoords) {
|
|
293
|
+
attributes.texCoords = contentAttributes.texCoords;
|
|
294
|
+
}
|
|
295
|
+
if (contentAttributes.colors) {
|
|
296
|
+
attributes.colors = contentAttributes.colors;
|
|
297
|
+
}
|
|
298
|
+
if (contentAttributes.uvRegions) {
|
|
299
|
+
attributes.uvRegions = contentAttributes.uvRegions;
|
|
300
|
+
}
|
|
301
|
+
return attributes;
|
|
302
|
+
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { CompositeLayer, CompositeLayerProps, Layer, LayerProps, UpdateParameters, PickingInfo, GetPickingInfoParams, DefaultProps, FilterContext } from '@deck.gl/core';
|
|
2
2
|
import { LayersList } from '@deck.gl/core';
|
|
3
|
-
import type { TileLoadProps, ZRange } from
|
|
4
|
-
import { Tileset2D, Tile2DHeader, RefinementStrategy, Tileset2DProps } from
|
|
5
|
-
import { URLTemplate } from
|
|
3
|
+
import type { TileLoadProps, ZRange } from "../tileset-2d/index.js";
|
|
4
|
+
import { Tileset2D, Tile2DHeader, RefinementStrategy, Tileset2DProps } from "../tileset-2d/index.js";
|
|
5
|
+
import { URLTemplate } from "../tileset-2d/index.js";
|
|
6
6
|
/** All props supported by the TileLayer */
|
|
7
7
|
export type TileLayerProps<DataT = unknown> = CompositeLayerProps & _TileLayerProps<DataT>;
|
|
8
8
|
/** Props added by the TileLayer */
|
|
@@ -67,6 +67,12 @@ type _TileLayerProps<DataT> = {
|
|
|
67
67
|
* @default 6
|
|
68
68
|
*/
|
|
69
69
|
maxRequests?: number;
|
|
70
|
+
/**
|
|
71
|
+
* Queue tile requests until no new tiles have been requested for at least `debounceTime` milliseconds.
|
|
72
|
+
*
|
|
73
|
+
* @default 0
|
|
74
|
+
*/
|
|
75
|
+
debounceTime?: number;
|
|
70
76
|
/**
|
|
71
77
|
* This offset changes the zoom level at which the tiles are fetched.
|
|
72
78
|
*
|
|
@@ -76,8 +82,11 @@ type _TileLayerProps<DataT> = {
|
|
|
76
82
|
*/
|
|
77
83
|
zoomOffset?: number;
|
|
78
84
|
};
|
|
79
|
-
export type
|
|
85
|
+
export type TileLayerPickingInfo<DataT = any, SubLayerPickingInfo = PickingInfo> = SubLayerPickingInfo & {
|
|
86
|
+
/** The picked tile */
|
|
80
87
|
tile?: Tile2DHeader<DataT>;
|
|
88
|
+
/** the tile that emitted the picking event */
|
|
89
|
+
sourceTile: Tile2DHeader<DataT>;
|
|
81
90
|
};
|
|
82
91
|
/**
|
|
83
92
|
* The TileLayer is a composite layer that makes it possible to visualize very large datasets.
|
|
@@ -113,7 +122,7 @@ export default class TileLayer<DataT = any, ExtraPropsT extends {} = {}> extends
|
|
|
113
122
|
tile: Tile2DHeader<DataT>;
|
|
114
123
|
}): Layer | null | LayersList;
|
|
115
124
|
getSubLayerPropsByTile(tile: Tile2DHeader): Partial<LayerProps> | null;
|
|
116
|
-
getPickingInfo(
|
|
125
|
+
getPickingInfo(params: GetPickingInfoParams): TileLayerPickingInfo<DataT>;
|
|
117
126
|
protected _updateAutoHighlight(info: PickingInfo): void;
|
|
118
127
|
renderLayers(): Layer | null | LayersList;
|
|
119
128
|
filterSubLayer({ layer, cullRect }: FilterContext): boolean;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tile-layer.d.ts","sourceRoot":"","sources":["../../src/tile-layer/tile-layer.ts"],"names":[],"mappings":"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"}
|