@deck.gl/geo-layers 9.0.0-beta.2 → 9.0.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 +2798 -7198
- 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 +3202 -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/{esm/mesh-layer → mesh-layer}/mesh-layer-fragment.glsl.js +0 -1
- package/dist/{esm/mesh-layer → mesh-layer}/mesh-layer-vertex.glsl.js +0 -1
- package/dist/mesh-layer/mesh-layer.js +129 -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 +8 -6
- package/dist/mvt-layer/mvt-layer.d.ts.map +1 -0
- package/dist/mvt-layer/mvt-layer.js +310 -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/dist/tile-3d-layer/tile-3d-layer.js +302 -0
- package/{typed → dist}/tile-layer/tile-layer.d.ts +3 -3
- package/dist/tile-layer/tile-layer.d.ts.map +1 -0
- package/dist/tile-layer/tile-layer.js +204 -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 +7 -7
- package/dist/tileset-2d/tileset-2d.d.ts.map +1 -0
- package/dist/tileset-2d/tileset-2d.js +456 -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/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 +27 -162
- package/package.json +32 -18
- package/src/index.ts +5 -5
- 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 +25 -15
- package/src/terrain-layer/terrain-layer.ts +13 -3
- package/src/tile-layer/tile-layer.ts +8 -9
- 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 +7 -3
- package/src/tileset-2d/utils.ts +2 -2
- 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.map +0 -1
- 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/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-fragment.glsl.d.ts +0 -0
- /package/{typed → dist}/mesh-layer/mesh-layer-fragment.glsl.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}/mesh-layer/mesh-layer.d.ts.map +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}/tile-3d-layer/tile-3d-layer.d.ts +0 -0
- /package/{typed → dist}/tile-3d-layer/tile-3d-layer.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}/trips-layer/trips-layer.d.ts +0 -0
- /package/{typed → dist}/trips-layer/trips-layer.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,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 */
|
|
@@ -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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"}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import { CompositeLayer, _flatten as flatten } from '@deck.gl/core';
|
|
2
|
+
import { GeoJsonLayer } from '@deck.gl/layers';
|
|
3
|
+
import { Tileset2D, STRATEGY_DEFAULT } from "../tileset-2d/index.js";
|
|
4
|
+
import { urlType, getURLFromTemplate } from "../tileset-2d/index.js";
|
|
5
|
+
const defaultProps = {
|
|
6
|
+
TilesetClass: Tileset2D,
|
|
7
|
+
data: { type: 'data', value: [] },
|
|
8
|
+
dataComparator: urlType.equal,
|
|
9
|
+
renderSubLayers: { type: 'function', value: (props) => new GeoJsonLayer(props) },
|
|
10
|
+
getTileData: { type: 'function', optional: true, value: null },
|
|
11
|
+
// TODO - change to onViewportLoad to align with Tile3DLayer
|
|
12
|
+
onViewportLoad: { type: 'function', optional: true, value: null },
|
|
13
|
+
onTileLoad: { type: 'function', value: tile => { } },
|
|
14
|
+
onTileUnload: { type: 'function', value: tile => { } },
|
|
15
|
+
// eslint-disable-next-line
|
|
16
|
+
onTileError: { type: 'function', value: err => console.error(err) },
|
|
17
|
+
extent: { type: 'array', optional: true, value: null, compare: true },
|
|
18
|
+
tileSize: 512,
|
|
19
|
+
maxZoom: null,
|
|
20
|
+
minZoom: 0,
|
|
21
|
+
maxCacheSize: null,
|
|
22
|
+
maxCacheByteSize: null,
|
|
23
|
+
refinementStrategy: STRATEGY_DEFAULT,
|
|
24
|
+
zRange: null,
|
|
25
|
+
maxRequests: 6,
|
|
26
|
+
zoomOffset: 0
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* The TileLayer is a composite layer that makes it possible to visualize very large datasets.
|
|
30
|
+
*
|
|
31
|
+
* Instead of fetching the entire dataset, it only loads and renders what's visible in the current viewport.
|
|
32
|
+
*/
|
|
33
|
+
export default class TileLayer extends CompositeLayer {
|
|
34
|
+
static { this.defaultProps = defaultProps; }
|
|
35
|
+
static { this.layerName = 'TileLayer'; }
|
|
36
|
+
initializeState() {
|
|
37
|
+
this.state = {
|
|
38
|
+
tileset: null,
|
|
39
|
+
isLoaded: false
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
finalizeState() {
|
|
43
|
+
this.state?.tileset?.finalize();
|
|
44
|
+
}
|
|
45
|
+
get isLoaded() {
|
|
46
|
+
return Boolean(this.state?.tileset?.selectedTiles?.every(tile => tile.isLoaded && tile.layers && tile.layers.every(layer => layer.isLoaded)));
|
|
47
|
+
}
|
|
48
|
+
shouldUpdateState({ changeFlags }) {
|
|
49
|
+
return changeFlags.somethingChanged;
|
|
50
|
+
}
|
|
51
|
+
updateState({ changeFlags }) {
|
|
52
|
+
let { tileset } = this.state;
|
|
53
|
+
const propsChanged = changeFlags.propsOrDataChanged || changeFlags.updateTriggersChanged;
|
|
54
|
+
const dataChanged = changeFlags.dataChanged ||
|
|
55
|
+
(changeFlags.updateTriggersChanged &&
|
|
56
|
+
(changeFlags.updateTriggersChanged.all || changeFlags.updateTriggersChanged.getTileData));
|
|
57
|
+
if (!tileset) {
|
|
58
|
+
tileset = new this.props.TilesetClass(this._getTilesetOptions());
|
|
59
|
+
this.setState({ tileset });
|
|
60
|
+
}
|
|
61
|
+
else if (propsChanged) {
|
|
62
|
+
tileset.setOptions(this._getTilesetOptions());
|
|
63
|
+
if (dataChanged) {
|
|
64
|
+
// reload all tiles
|
|
65
|
+
// use cached layers until new content is loaded
|
|
66
|
+
tileset.reloadAll();
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
// some render options changed, regenerate sub layers now
|
|
70
|
+
tileset.tiles.forEach(tile => {
|
|
71
|
+
tile.layers = null;
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
this._updateTileset();
|
|
76
|
+
}
|
|
77
|
+
_getTilesetOptions() {
|
|
78
|
+
const { tileSize, maxCacheSize, maxCacheByteSize, refinementStrategy, extent, maxZoom, minZoom, maxRequests, zoomOffset } = this.props;
|
|
79
|
+
return {
|
|
80
|
+
maxCacheSize,
|
|
81
|
+
maxCacheByteSize,
|
|
82
|
+
maxZoom,
|
|
83
|
+
minZoom,
|
|
84
|
+
tileSize,
|
|
85
|
+
refinementStrategy,
|
|
86
|
+
extent,
|
|
87
|
+
maxRequests,
|
|
88
|
+
zoomOffset,
|
|
89
|
+
getTileData: this.getTileData.bind(this),
|
|
90
|
+
onTileLoad: this._onTileLoad.bind(this),
|
|
91
|
+
onTileError: this._onTileError.bind(this),
|
|
92
|
+
onTileUnload: this._onTileUnload.bind(this)
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
_updateTileset() {
|
|
96
|
+
const tileset = this.state.tileset;
|
|
97
|
+
const { zRange, modelMatrix } = this.props;
|
|
98
|
+
const frameNumber = tileset.update(this.context.viewport, { zRange, modelMatrix });
|
|
99
|
+
const { isLoaded } = tileset;
|
|
100
|
+
const loadingStateChanged = this.state.isLoaded !== isLoaded;
|
|
101
|
+
const tilesetChanged = this.state.frameNumber !== frameNumber;
|
|
102
|
+
if (isLoaded && (loadingStateChanged || tilesetChanged)) {
|
|
103
|
+
this._onViewportLoad();
|
|
104
|
+
}
|
|
105
|
+
if (tilesetChanged) {
|
|
106
|
+
// Save the tileset frame number - trigger a rerender
|
|
107
|
+
this.setState({ frameNumber });
|
|
108
|
+
}
|
|
109
|
+
// Save the loaded state - should not trigger a rerender
|
|
110
|
+
this.state.isLoaded = isLoaded;
|
|
111
|
+
}
|
|
112
|
+
_onViewportLoad() {
|
|
113
|
+
const { tileset } = this.state;
|
|
114
|
+
const { onViewportLoad } = this.props;
|
|
115
|
+
if (onViewportLoad) {
|
|
116
|
+
// This method can only be called when tileset is defined and updated
|
|
117
|
+
onViewportLoad(tileset.selectedTiles);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
_onTileLoad(tile) {
|
|
121
|
+
this.props.onTileLoad(tile);
|
|
122
|
+
tile.layers = null;
|
|
123
|
+
this.setNeedsUpdate();
|
|
124
|
+
}
|
|
125
|
+
_onTileError(error, tile) {
|
|
126
|
+
this.props.onTileError(error);
|
|
127
|
+
tile.layers = null;
|
|
128
|
+
this.setNeedsUpdate();
|
|
129
|
+
}
|
|
130
|
+
_onTileUnload(tile) {
|
|
131
|
+
this.props.onTileUnload(tile);
|
|
132
|
+
}
|
|
133
|
+
// Methods for subclass to override
|
|
134
|
+
getTileData(tile) {
|
|
135
|
+
const { data, getTileData, fetch } = this.props;
|
|
136
|
+
const { signal } = tile;
|
|
137
|
+
tile.url =
|
|
138
|
+
typeof data === 'string' || Array.isArray(data) ? getURLFromTemplate(data, tile) : null;
|
|
139
|
+
if (getTileData) {
|
|
140
|
+
return getTileData(tile);
|
|
141
|
+
}
|
|
142
|
+
if (fetch && tile.url) {
|
|
143
|
+
return fetch(tile.url, { propName: 'data', layer: this, signal });
|
|
144
|
+
}
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
renderSubLayers(props) {
|
|
148
|
+
return this.props.renderSubLayers(props);
|
|
149
|
+
}
|
|
150
|
+
getSubLayerPropsByTile(tile) {
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
getPickingInfo({ info, sourceLayer }) {
|
|
154
|
+
const sourceTile = sourceLayer.props.tile;
|
|
155
|
+
if (info.picked) {
|
|
156
|
+
info.tile = sourceTile;
|
|
157
|
+
}
|
|
158
|
+
info.sourceTile = sourceTile;
|
|
159
|
+
return info;
|
|
160
|
+
}
|
|
161
|
+
_updateAutoHighlight(info) {
|
|
162
|
+
const sourceTile = info.sourceTile;
|
|
163
|
+
if (sourceTile && sourceTile.layers) {
|
|
164
|
+
for (const layer of sourceTile.layers) {
|
|
165
|
+
layer.updateAutoHighlight(info);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
renderLayers() {
|
|
170
|
+
return this.state.tileset.tiles.map((tile) => {
|
|
171
|
+
const subLayerProps = this.getSubLayerPropsByTile(tile);
|
|
172
|
+
// cache the rendered layer in the tile
|
|
173
|
+
if (!tile.isLoaded && !tile.content) {
|
|
174
|
+
// nothing to show
|
|
175
|
+
}
|
|
176
|
+
else if (!tile.layers) {
|
|
177
|
+
const layers = this.renderSubLayers({
|
|
178
|
+
...this.props,
|
|
179
|
+
...this.getSubLayerProps({
|
|
180
|
+
id: tile.id,
|
|
181
|
+
updateTriggers: this.props.updateTriggers
|
|
182
|
+
}),
|
|
183
|
+
data: tile.content,
|
|
184
|
+
_offset: 0,
|
|
185
|
+
tile
|
|
186
|
+
});
|
|
187
|
+
tile.layers = flatten(layers, Boolean).map(layer => layer.clone({
|
|
188
|
+
tile,
|
|
189
|
+
...subLayerProps
|
|
190
|
+
}));
|
|
191
|
+
}
|
|
192
|
+
else if (subLayerProps &&
|
|
193
|
+
tile.layers[0] &&
|
|
194
|
+
Object.keys(subLayerProps).some(propName => tile.layers[0].props[propName] !== subLayerProps[propName])) {
|
|
195
|
+
tile.layers = tile.layers.map(layer => layer.clone(subLayerProps));
|
|
196
|
+
}
|
|
197
|
+
return tile.layers;
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
filterSubLayer({ layer, cullRect }) {
|
|
201
|
+
const { tile } = layer.props;
|
|
202
|
+
return this.state.tileset.isTileVisible(tile, cullRect);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type { TileLoadProps, Bounds, ZRange, GeoBoundingBox, NonGeoBoundingBox, TileBoundingBox } from "./types.js";
|
|
2
|
+
export type { Tileset2DProps, RefinementStrategy } from "./tileset-2d.js";
|
|
3
|
+
export { Tileset2D, STRATEGY_DEFAULT } from "./tileset-2d.js";
|
|
4
|
+
export { Tile2DHeader } from "./tile-2d-header.js";
|
|
5
|
+
export type { URLTemplate } from "./utils.js";
|
|
6
|
+
export { isGeoBoundingBox, isURLTemplate, urlType, getURLFromTemplate, getTileIndices, tileToBoundingBox } from "./utils.js";
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tileset-2d/index.ts"],"names":[],"mappings":"AAEA,YAAY,EACV,aAAa,EACb,MAAM,EACN,MAAM,EACN,cAAc,EACd,iBAAiB,EACjB,eAAe,EAChB,mBAAgB;AAEjB,YAAY,EAAC,cAAc,EAAE,kBAAkB,EAAC,wBAAqB;AACrE,OAAO,EAAC,SAAS,EAAE,gBAAgB,EAAC,wBAAqB;AAEzD,OAAO,EAAC,YAAY,EAAC,4BAAyB;AAE9C,YAAY,EAAC,WAAW,EAAC,mBAAgB;AACzC,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,OAAO,EACP,kBAAkB,EAClB,cAAc,EACd,iBAAiB,EAClB,mBAAgB"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// deck.gl, MIT license
|
|
2
|
+
// @note - this is a duplicate of the deck.gl core export (because Tileset2D should be deck.gl independent)
|
|
3
|
+
/**
|
|
4
|
+
* Speed up consecutive function calls by caching the result of calls with identical input
|
|
5
|
+
* https://en.wikipedia.org/wiki/Memoization
|
|
6
|
+
* @param compute - the function to be memoized
|
|
7
|
+
*/
|
|
8
|
+
export function memoize(compute) {
|
|
9
|
+
let cachedArgs = {};
|
|
10
|
+
let cachedResult;
|
|
11
|
+
return (args) => {
|
|
12
|
+
for (const key in args) {
|
|
13
|
+
if (!isEqual(args[key], cachedArgs[key])) {
|
|
14
|
+
cachedResult = compute(args);
|
|
15
|
+
cachedArgs = args;
|
|
16
|
+
break;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return cachedResult;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function isEqual(a, b) {
|
|
23
|
+
if (a === b) {
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
if (Array.isArray(a)) {
|
|
27
|
+
// Special treatment for arrays: compare 1-level deep
|
|
28
|
+
// This is to support equality of matrix/coordinate props
|
|
29
|
+
const len = a.length;
|
|
30
|
+
if (!b || b.length !== len) {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
for (let i = 0; i < len; i++) {
|
|
34
|
+
if (a[i] !== b[i]) {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { RequestScheduler } from '@loaders.gl/loader-utils';
|
|
2
|
-
import { TileBoundingBox, TileIndex, TileLoadProps } from
|
|
2
|
+
import { TileBoundingBox, TileIndex, TileLoadProps } from "./types.js";
|
|
3
|
+
import type { Layer } from '@deck.gl/core';
|
|
3
4
|
export type TileLoadDataProps<DataT = any> = {
|
|
4
5
|
requestScheduler: RequestScheduler;
|
|
5
6
|
getData: (props: TileLoadProps) => Promise<DataT>;
|
|
@@ -14,7 +15,7 @@ export declare class Tile2DHeader<DataT = any> {
|
|
|
14
15
|
children: Tile2DHeader[] | null;
|
|
15
16
|
content: DataT | null;
|
|
16
17
|
state?: number;
|
|
17
|
-
layers?:
|
|
18
|
+
layers?: Layer[] | null;
|
|
18
19
|
id: string;
|
|
19
20
|
zoom: number;
|
|
20
21
|
userData?: Record<string, any>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tile-2d-header.d.ts","sourceRoot":"","sources":["../../src/tileset-2d/tile-2d-header.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,gBAAgB,EAAC,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAC,eAAe,EAAE,SAAS,EAAE,aAAa,EAAC,mBAAgB;AAClE,OAAO,KAAK,EAAC,KAAK,EAAC,MAAM,eAAe,CAAC;AAEzC,MAAM,MAAM,iBAAiB,CAAC,KAAK,GAAG,GAAG,IAAI;IAC3C,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,OAAO,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,EAAE,CAAC,IAAI,EAAE,YAAY,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC;IAC5C,OAAO,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,YAAY,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC;CAC1D,CAAC;AAEF,qBAAa,YAAY,CAAC,KAAK,GAAG,GAAG;IACnC,KAAK,EAAE,SAAS,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;IAC5B,QAAQ,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC;IAChC,OAAO,EAAE,KAAK,GAAG,IAAI,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IAExB,EAAE,EAAG,MAAM,CAAC;IACZ,IAAI,EAAG,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/B,WAAW,EAAG,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;IAE7C,OAAO,CAAC,gBAAgB,CAAyB;IACjD,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAU;IAC3B,OAAO,CAAC,YAAY,CAAU;IAC9B,OAAO,CAAC,YAAY,CAAU;IAC9B,OAAO,CAAC,KAAK,CAAmB;gBAEpB,KAAK,EAAE,SAAS;IAiB5B,4CAA4C;IAC5C,IAAI,IAAI,IAAI,eAAe,CAE1B;IAGD,IAAI,IAAI,CAAC,KAAK,EAAE,eAAe,EAgB9B;IAED,IAAI,IAAI,IAAI,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,KAAK,GAAG,IAAI,CAE/C;IAED,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,IAAI,UAAU,IAAI,MAAM,CAOvB;YAGa,SAAS;IA8DvB,QAAQ,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAShD,cAAc,IAAI,IAAI;IAQtB,KAAK,IAAI,IAAI;CAQd"}
|