@deck.gl/geo-layers 8.9.0-alpha.4 → 8.9.0-beta.1
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 +25762 -66554
- package/dist/es5/h3-layers/h3-cluster-layer.js +2 -2
- package/dist/es5/h3-layers/h3-cluster-layer.js.map +1 -1
- package/dist/es5/index.js +4 -8
- 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/mvt-layer/coordinate-transform.js.map +1 -1
- package/dist/es5/mvt-layer/mvt-layer.js +9 -9
- package/dist/es5/mvt-layer/mvt-layer.js.map +1 -1
- package/dist/es5/terrain-layer/terrain-layer.js +5 -5
- package/dist/es5/terrain-layer/terrain-layer.js.map +1 -1
- package/dist/es5/tile-3d-layer/tile-3d-layer.js.map +1 -1
- package/dist/es5/tile-layer/tile-layer.js +9 -13
- package/dist/es5/tile-layer/tile-layer.js.map +1 -1
- package/dist/es5/tileset-2d/index.js +66 -0
- package/dist/es5/tileset-2d/index.js.map +1 -0
- package/dist/es5/tileset-2d/memoize.js +47 -0
- package/dist/es5/tileset-2d/memoize.js.map +1 -0
- package/dist/es5/{tile-layer → tileset-2d}/tile-2d-header.js +3 -5
- package/dist/es5/tileset-2d/tile-2d-header.js.map +1 -0
- package/dist/es5/{tile-layer → tileset-2d}/tile-2d-traversal.js +0 -0
- package/dist/es5/tileset-2d/tile-2d-traversal.js.map +1 -0
- package/dist/es5/{tile-layer → tileset-2d}/tileset-2d.js +166 -121
- package/dist/es5/tileset-2d/tileset-2d.js.map +1 -0
- package/dist/es5/{tile-layer → tileset-2d}/types.js +0 -0
- package/dist/es5/{tile-layer → tileset-2d}/types.js.map +0 -0
- package/dist/es5/{tile-layer → tileset-2d}/utils.js +15 -16
- package/dist/es5/tileset-2d/utils.js.map +1 -0
- package/dist/esm/h3-layers/h3-cluster-layer.js +1 -1
- package/dist/esm/h3-layers/h3-cluster-layer.js.map +1 -1
- package/dist/esm/index.js +3 -3
- 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-vertex.glsl.js +1 -1
- package/dist/esm/mvt-layer/coordinate-transform.js.map +1 -1
- package/dist/esm/mvt-layer/mvt-layer.js +3 -3
- package/dist/esm/mvt-layer/mvt-layer.js.map +1 -1
- package/dist/esm/terrain-layer/terrain-layer.js +1 -1
- package/dist/esm/terrain-layer/terrain-layer.js.map +1 -1
- package/dist/esm/tile-3d-layer/tile-3d-layer.js.map +1 -1
- package/dist/esm/tile-layer/tile-layer.js +6 -3
- package/dist/esm/tile-layer/tile-layer.js.map +1 -1
- package/dist/esm/tileset-2d/index.js +4 -0
- package/dist/esm/tileset-2d/index.js.map +1 -0
- package/dist/esm/tileset-2d/memoize.js +40 -0
- package/dist/esm/tileset-2d/memoize.js.map +1 -0
- package/dist/esm/{tile-layer → tileset-2d}/tile-2d-header.js +2 -3
- package/dist/esm/tileset-2d/tile-2d-header.js.map +1 -0
- package/dist/esm/{tile-layer → tileset-2d}/tile-2d-traversal.js +0 -0
- package/dist/esm/tileset-2d/tile-2d-traversal.js.map +1 -0
- package/dist/esm/{tile-layer → tileset-2d}/tileset-2d.js +48 -16
- package/dist/esm/tileset-2d/tileset-2d.js.map +1 -0
- package/dist/esm/{tile-layer → tileset-2d}/types.js +0 -0
- package/dist/esm/{tile-layer → tileset-2d}/types.js.map +0 -0
- package/dist/esm/{tile-layer → tileset-2d}/utils.js +14 -18
- package/dist/esm/tileset-2d/utils.js.map +1 -0
- package/dist.min.js +187 -6
- package/package.json +11 -11
- package/src/h3-layers/h3-cluster-layer.ts +1 -1
- package/src/index.ts +9 -5
- package/src/mvt-layer/coordinate-transform.ts +1 -1
- package/src/mvt-layer/mvt-layer.ts +14 -7
- package/src/terrain-layer/terrain-layer.ts +2 -3
- package/src/tile-3d-layer/tile-3d-layer.ts +3 -0
- package/src/tile-layer/tile-layer.ts +13 -6
- package/src/tileset-2d/index.ts +24 -0
- package/src/tileset-2d/memoize.ts +45 -0
- package/src/{tile-layer → tileset-2d}/tile-2d-header.ts +4 -4
- package/src/{tile-layer → tileset-2d}/tile-2d-traversal.ts +3 -1
- package/src/{tile-layer → tileset-2d}/tileset-2d.ts +91 -39
- package/src/{tile-layer → tileset-2d}/types.ts +0 -0
- package/src/{tile-layer → tileset-2d}/utils.ts +20 -8
- package/typed/geo-cell-layer/GeoCellLayer.js +49 -0
- package/typed/great-circle-layer/great-circle-layer.js +29 -0
- package/typed/h3-layers/h3-cluster-layer.js +33 -0
- package/typed/h3-layers/h3-hexagon-layer.js +251 -0
- package/typed/index.d.ts +5 -5
- package/typed/index.d.ts.map +1 -1
- package/typed/index.js +33 -0
- package/typed/mesh-layer/mesh-layer-fragment.glsl.js +55 -0
- package/typed/mesh-layer/mesh-layer-vertex.glsl.js +80 -0
- package/typed/mesh-layer/mesh-layer.js +110 -0
- package/typed/mvt-layer/coordinate-transform.d.ts +1 -1
- package/typed/mvt-layer/coordinate-transform.d.ts.map +1 -1
- package/typed/mvt-layer/coordinate-transform.js +41 -0
- package/typed/mvt-layer/find-index-binary.js +96 -0
- package/typed/mvt-layer/mvt-layer.d.ts +2 -3
- package/typed/mvt-layer/mvt-layer.d.ts.map +1 -1
- package/typed/mvt-layer/mvt-layer.js +297 -0
- package/typed/quadkey-layer/quadkey-layer.js +18 -0
- package/typed/quadkey-layer/quadkey-utils.js +26 -0
- package/typed/s2-layer/s2-geometry.js +123 -0
- package/typed/s2-layer/s2-layer.js +37 -0
- package/typed/s2-layer/s2-utils.js +88 -0
- package/typed/terrain-layer/terrain-layer.d.ts +2 -2
- package/typed/terrain-layer/terrain-layer.d.ts.map +1 -1
- package/typed/terrain-layer/terrain-layer.js +226 -0
- package/typed/tile-3d-layer/tile-3d-layer.d.ts.map +1 -1
- package/typed/tile-3d-layer/tile-3d-layer.js +294 -0
- package/typed/tile-layer/tile-2d-header.js +113 -0
- package/typed/tile-layer/tile-2d-traversal.js +181 -0
- package/typed/tile-layer/tile-layer.d.ts +3 -4
- package/typed/tile-layer/tile-layer.d.ts.map +1 -1
- package/typed/tile-layer/tile-layer.js +192 -0
- package/typed/tile-layer/tileset-2d.d.ts.map +1 -1
- package/typed/tile-layer/tileset-2d.js +399 -0
- package/typed/tile-layer/types.js +1 -0
- package/typed/tile-layer/utils.d.ts +1 -1
- package/typed/tile-layer/utils.d.ts.map +1 -1
- package/typed/tile-layer/utils.js +197 -0
- package/typed/tileset-2d/index.d.ts +6 -0
- package/typed/tileset-2d/index.d.ts.map +1 -0
- package/typed/tileset-2d/memoize.d.ts +7 -0
- package/typed/tileset-2d/memoize.d.ts.map +1 -0
- package/typed/tileset-2d/tile-2d-header.d.ts +39 -0
- package/typed/tileset-2d/tile-2d-header.d.ts.map +1 -0
- package/typed/tileset-2d/tile-2d-traversal.d.ts +4 -0
- package/typed/tileset-2d/tile-2d-traversal.d.ts.map +1 -0
- package/typed/tileset-2d/tileset-2d.d.ts +121 -0
- package/typed/tileset-2d/tileset-2d.d.ts.map +1 -0
- package/typed/tileset-2d/types.d.ts +30 -0
- package/typed/tileset-2d/types.d.ts.map +1 -0
- package/typed/tileset-2d/utils.d.ts +51 -0
- package/typed/tileset-2d/utils.d.ts.map +1 -0
- package/typed/trips-layer/trips-layer.js +92 -0
- package/dist/es5/tile-layer/tile-2d-header.js.map +0 -1
- package/dist/es5/tile-layer/tile-2d-traversal.js.map +0 -1
- package/dist/es5/tile-layer/tileset-2d.js.map +0 -1
- package/dist/es5/tile-layer/utils.js.map +0 -1
- package/dist/esm/tile-layer/tile-2d-header.js.map +0 -1
- package/dist/esm/tile-layer/tile-2d-traversal.js.map +0 -1
- package/dist/esm/tile-layer/tileset-2d.js.map +0 -1
- package/dist/esm/tile-layer/utils.js.map +0 -1
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@deck.gl/geo-layers",
|
|
3
3
|
"description": "deck.gl layers supporting geospatial use cases and GIS formats",
|
|
4
4
|
"license": "MIT",
|
|
5
|
-
"version": "8.9.0-
|
|
5
|
+
"version": "8.9.0-beta.1",
|
|
6
6
|
"publishConfig": {
|
|
7
7
|
"access": "public"
|
|
8
8
|
},
|
|
@@ -26,17 +26,17 @@
|
|
|
26
26
|
],
|
|
27
27
|
"sideEffects": false,
|
|
28
28
|
"scripts": {
|
|
29
|
-
"build-bundle": "
|
|
30
|
-
"prepublishOnly": "npm run build-bundle && npm run build-bundle -- --env
|
|
29
|
+
"build-bundle": "ocular-bundle ./bundle.ts",
|
|
30
|
+
"prepublishOnly": "npm run build-bundle && npm run build-bundle -- --env=dev"
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"@loaders.gl/3d-tiles": "^3.
|
|
34
|
-
"@loaders.gl/gis": "^3.
|
|
35
|
-
"@loaders.gl/loader-utils": "^3.
|
|
36
|
-
"@loaders.gl/mvt": "^3.
|
|
37
|
-
"@loaders.gl/schema": "^3.
|
|
38
|
-
"@loaders.gl/terrain": "^3.
|
|
39
|
-
"@loaders.gl/tiles": "^3.
|
|
33
|
+
"@loaders.gl/3d-tiles": "^3.3.0-alpha.10",
|
|
34
|
+
"@loaders.gl/gis": "^3.3.0-alpha.10",
|
|
35
|
+
"@loaders.gl/loader-utils": "^3.3.0-alpha.10",
|
|
36
|
+
"@loaders.gl/mvt": "^3.3.0-alpha.10",
|
|
37
|
+
"@loaders.gl/schema": "^3.3.0-alpha.10",
|
|
38
|
+
"@loaders.gl/terrain": "^3.3.0-alpha.10",
|
|
39
|
+
"@loaders.gl/tiles": "^3.3.0-alpha.10",
|
|
40
40
|
"@luma.gl/constants": "^8.5.16",
|
|
41
41
|
"@luma.gl/experimental": "^8.5.16",
|
|
42
42
|
"@math.gl/core": "^3.6.2",
|
|
@@ -54,5 +54,5 @@
|
|
|
54
54
|
"@loaders.gl/core": "^3.0.0",
|
|
55
55
|
"@luma.gl/core": "^8.0.0"
|
|
56
56
|
},
|
|
57
|
-
"gitHead": "
|
|
57
|
+
"gitHead": "47223d1ea084c3f9b0c9f0f9736682850bb5db85"
|
|
58
58
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {h3SetToMultiPolygon, H3IndexInput} from 'h3-js';
|
|
2
2
|
|
|
3
3
|
import {AccessorFunction, createIterable, UpdateParameters, DefaultProps} from '@deck.gl/core';
|
|
4
|
-
import {H3HexagonLayer} from '
|
|
4
|
+
import {default as H3HexagonLayer} from './h3-hexagon-layer';
|
|
5
5
|
import GeoCellLayer, {GeoCellLayerProps} from '../geo-cell-layer/GeoCellLayer';
|
|
6
6
|
|
|
7
7
|
const defaultProps: DefaultProps<H3ClusterLayerProps> = {
|
package/src/index.ts
CHANGED
|
@@ -32,9 +32,6 @@ export {default as MVTLayer} from './mvt-layer/mvt-layer';
|
|
|
32
32
|
export {default as GeohashLayer} from './geohash-layer/geohash-layer';
|
|
33
33
|
|
|
34
34
|
export {default as _GeoCellLayer} from './geo-cell-layer/GeoCellLayer';
|
|
35
|
-
export {getURLFromTemplate as _getURLFromTemplate} from './tile-layer/utils';
|
|
36
|
-
export {default as _Tileset2D} from './tile-layer/tileset-2d';
|
|
37
|
-
export {default as _Tile2DHeader} from './tile-layer/tile-2d-header';
|
|
38
35
|
|
|
39
36
|
// Types
|
|
40
37
|
export type {H3ClusterLayerProps} from './h3-layers/h3-cluster-layer';
|
|
@@ -42,10 +39,17 @@ export type {H3HexagonLayerProps} from './h3-layers/h3-hexagon-layer';
|
|
|
42
39
|
export type {GreatCircleLayerProps} from './great-circle-layer/great-circle-layer';
|
|
43
40
|
export type {S2LayerProps} from './s2-layer/s2-layer';
|
|
44
41
|
export type {TileLayerProps} from './tile-layer/tile-layer';
|
|
45
|
-
export type {GeoBoundingBox, NonGeoBoundingBox} from './tile-layer/types';
|
|
46
42
|
export type {QuadkeyLayerProps} from './quadkey-layer/quadkey-layer';
|
|
47
|
-
export type {TileLoadProps as _TileLoadProps} from './tile-layer/types';
|
|
48
43
|
export type {TerrainLayerProps} from './terrain-layer/terrain-layer';
|
|
49
44
|
export type {Tile3DLayerProps} from './tile-3d-layer/tile-3d-layer';
|
|
50
45
|
export type {MVTLayerProps} from './mvt-layer/mvt-layer';
|
|
51
46
|
export type {GeoCellLayerProps as _GeoCellLayerProps} from './geo-cell-layer/GeoCellLayer';
|
|
47
|
+
|
|
48
|
+
// Tileset2D
|
|
49
|
+
|
|
50
|
+
export type {GeoBoundingBox, NonGeoBoundingBox} from './tileset-2d';
|
|
51
|
+
export type {TileLoadProps as _TileLoadProps} from './tileset-2d';
|
|
52
|
+
|
|
53
|
+
export {getURLFromTemplate as _getURLFromTemplate} from './tileset-2d';
|
|
54
|
+
export {Tileset2D as _Tileset2D} from './tileset-2d';
|
|
55
|
+
export {Tile2DHeader as _Tile2DHeader} from './tileset-2d';
|
|
@@ -10,23 +10,30 @@ import {
|
|
|
10
10
|
DefaultProps
|
|
11
11
|
} from '@deck.gl/core';
|
|
12
12
|
import {GeoJsonLayer, GeoJsonLayerProps} from '@deck.gl/layers';
|
|
13
|
+
import {ClipExtension} from '@deck.gl/extensions';
|
|
14
|
+
|
|
13
15
|
import {Matrix4} from '@math.gl/core';
|
|
14
16
|
import {MVTWorkerLoader} from '@loaders.gl/mvt';
|
|
15
17
|
import {binaryToGeojson} from '@loaders.gl/gis';
|
|
16
|
-
import {ClipExtension} from '@deck.gl/extensions';
|
|
17
18
|
|
|
18
19
|
import type {Loader} from '@loaders.gl/loader-utils';
|
|
19
20
|
import type {BinaryFeatures} from '@loaders.gl/schema';
|
|
20
21
|
import type {Feature} from 'geojson';
|
|
21
22
|
|
|
22
|
-
import TileLayer, {TiledPickingInfo, TileLayerProps} from '../tile-layer/tile-layer';
|
|
23
|
-
import Tileset2D, {Tileset2DProps} from '../tile-layer/tileset-2d';
|
|
24
|
-
import {getURLFromTemplate, isGeoBoundingBox, isURLTemplate} from '../tile-layer/utils';
|
|
25
|
-
import {GeoBoundingBox, TileLoadProps} from '../tile-layer/types';
|
|
26
|
-
import Tile2DHeader from '../tile-layer/tile-2d-header';
|
|
27
23
|
import {transform} from './coordinate-transform';
|
|
28
24
|
import findIndexBinary from './find-index-binary';
|
|
29
25
|
|
|
26
|
+
import TileLayer, {TiledPickingInfo, TileLayerProps} from '../tile-layer/tile-layer';
|
|
27
|
+
|
|
28
|
+
import type {Tileset2DProps, TileLoadProps, GeoBoundingBox} from '../tileset-2d';
|
|
29
|
+
import {
|
|
30
|
+
Tileset2D,
|
|
31
|
+
Tile2DHeader,
|
|
32
|
+
getURLFromTemplate,
|
|
33
|
+
isGeoBoundingBox,
|
|
34
|
+
isURLTemplate
|
|
35
|
+
} from '../tileset-2d';
|
|
36
|
+
|
|
30
37
|
const WORLD_SIZE = 512;
|
|
31
38
|
|
|
32
39
|
const defaultProps: DefaultProps<MVTLayerProps> = {
|
|
@@ -285,7 +292,7 @@ export default class MVTLayer<DataT extends Feature = Feature, ExtraProps = {}>
|
|
|
285
292
|
if (info.object && !isWGS84) {
|
|
286
293
|
info.object = transformTileCoordsToWGS84(
|
|
287
294
|
info.object,
|
|
288
|
-
info.tile!.bbox as GeoBoundingBox,
|
|
295
|
+
info.tile!.bbox as GeoBoundingBox, // eslint-disable-line
|
|
289
296
|
this.context.viewport
|
|
290
297
|
);
|
|
291
298
|
}
|
|
@@ -35,9 +35,8 @@ import {COORDINATE_SYSTEM} from '@deck.gl/core';
|
|
|
35
35
|
import type {MeshAttributes} from '@loaders.gl/schema';
|
|
36
36
|
import {TerrainWorkerLoader} from '@loaders.gl/terrain';
|
|
37
37
|
import TileLayer, {TileLayerProps} from '../tile-layer/tile-layer';
|
|
38
|
-
import
|
|
39
|
-
import {
|
|
40
|
-
import {urlType, getURLFromTemplate} from '../tile-layer/utils';
|
|
38
|
+
import type {Bounds, GeoBoundingBox, TileBoundingBox, TileLoadProps, ZRange} from '../tileset-2d';
|
|
39
|
+
import {Tile2DHeader, urlType, getURLFromTemplate} from '../tileset-2d';
|
|
41
40
|
|
|
42
41
|
const DUMMY_DATA = [1];
|
|
43
42
|
|
|
@@ -114,6 +114,7 @@ export default class Tile3DLayer<DataT = any, ExtraPropsT = {}> extends Composit
|
|
|
114
114
|
|
|
115
115
|
updateState({props, oldProps, changeFlags}: UpdateParameters<this>): void {
|
|
116
116
|
if (props.data && props.data !== oldProps.data) {
|
|
117
|
+
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
|
117
118
|
this._loadTileset(props.data);
|
|
118
119
|
}
|
|
119
120
|
|
|
@@ -235,6 +236,8 @@ export default class Tile3DLayer<DataT = any, ExtraPropsT = {}> extends Composit
|
|
|
235
236
|
if (!timeline || !viewportsNumber || !tileset3d) {
|
|
236
237
|
return;
|
|
237
238
|
}
|
|
239
|
+
|
|
240
|
+
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
|
238
241
|
tileset3d.selectTiles(Object.values(viewports)).then(frameNumber => {
|
|
239
242
|
const tilesetChanged = this.state.frameNumber !== frameNumber;
|
|
240
243
|
if (tilesetChanged) {
|
|
@@ -12,11 +12,16 @@ import {
|
|
|
12
12
|
} from '@deck.gl/core';
|
|
13
13
|
import {GeoJsonLayer} from '@deck.gl/layers';
|
|
14
14
|
import {LayersList} from '@deck.gl/core';
|
|
15
|
-
import Tile2DHeader from './tile-2d-header';
|
|
16
15
|
|
|
17
|
-
import
|
|
18
|
-
import {
|
|
19
|
-
|
|
16
|
+
import type {TileLoadProps, ZRange} from '../tileset-2d';
|
|
17
|
+
import {
|
|
18
|
+
Tileset2D,
|
|
19
|
+
Tile2DHeader,
|
|
20
|
+
RefinementStrategy,
|
|
21
|
+
STRATEGY_DEFAULT,
|
|
22
|
+
Tileset2DProps
|
|
23
|
+
} from '../tileset-2d';
|
|
24
|
+
import {urlType, getURLFromTemplate} from '../tileset-2d';
|
|
20
25
|
|
|
21
26
|
const defaultProps: DefaultProps<TileLayerProps> = {
|
|
22
27
|
TilesetClass: Tileset2D,
|
|
@@ -77,7 +82,7 @@ type _TileLayerProps<DataT> = {
|
|
|
77
82
|
onTileUnload?: (tile: Tile2DHeader<DataT>) => void;
|
|
78
83
|
|
|
79
84
|
/** Called when a tile failed to load. */
|
|
80
|
-
onTileError?: (err: any) => void;
|
|
85
|
+
onTileError?: (err: any, tile?) => void;
|
|
81
86
|
|
|
82
87
|
/** The bounding box of the layer's data. */
|
|
83
88
|
extent?: number[] | null;
|
|
@@ -310,7 +315,9 @@ export default class TileLayer<DataT = any, ExtraPropsT = {}> extends CompositeL
|
|
|
310
315
|
}
|
|
311
316
|
|
|
312
317
|
getPickingInfo({info, sourceLayer}: GetPickingInfoParams): TiledPickingInfo<DataT> {
|
|
313
|
-
(info
|
|
318
|
+
if (info.picked) {
|
|
319
|
+
(info as any).tile = (sourceLayer as any).props.tile;
|
|
320
|
+
}
|
|
314
321
|
return info;
|
|
315
322
|
}
|
|
316
323
|
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// deck.gl, MIT license
|
|
2
|
+
|
|
3
|
+
export type {
|
|
4
|
+
TileLoadProps,
|
|
5
|
+
Bounds,
|
|
6
|
+
ZRange,
|
|
7
|
+
GeoBoundingBox,
|
|
8
|
+
NonGeoBoundingBox,
|
|
9
|
+
TileBoundingBox
|
|
10
|
+
} from './types';
|
|
11
|
+
|
|
12
|
+
export type {Tileset2DProps, RefinementStrategy} from './tileset-2d';
|
|
13
|
+
export {Tileset2D, STRATEGY_DEFAULT} from './tileset-2d';
|
|
14
|
+
|
|
15
|
+
export {Tile2DHeader} from './tile-2d-header';
|
|
16
|
+
|
|
17
|
+
export {
|
|
18
|
+
isGeoBoundingBox,
|
|
19
|
+
isURLTemplate,
|
|
20
|
+
urlType,
|
|
21
|
+
getURLFromTemplate,
|
|
22
|
+
getTileIndices,
|
|
23
|
+
tileToBoundingBox
|
|
24
|
+
} from './utils';
|
|
@@ -0,0 +1,45 @@
|
|
|
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
|
+
/**
|
|
5
|
+
* Speed up consecutive function calls by caching the result of calls with identical input
|
|
6
|
+
* https://en.wikipedia.org/wiki/Memoization
|
|
7
|
+
* @param compute - the function to be memoized
|
|
8
|
+
*/
|
|
9
|
+
export function memoize<In, Out>(compute: (args: In) => Out): (args: In) => Out {
|
|
10
|
+
let cachedArgs: any = {};
|
|
11
|
+
let cachedResult: Out;
|
|
12
|
+
|
|
13
|
+
return (args: In) => {
|
|
14
|
+
for (const key in args) {
|
|
15
|
+
if (!isEqual(args[key], cachedArgs[key])) {
|
|
16
|
+
cachedResult = compute(args);
|
|
17
|
+
cachedArgs = args;
|
|
18
|
+
break;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return cachedResult;
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function isEqual(a, b) {
|
|
26
|
+
if (a === b) {
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
if (Array.isArray(a)) {
|
|
30
|
+
// Special treatment for arrays: compare 1-level deep
|
|
31
|
+
// This is to support equality of matrix/coordinate props
|
|
32
|
+
const len = a.length;
|
|
33
|
+
if (!b || b.length !== len) {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
for (let i = 0; i < len; i++) {
|
|
38
|
+
if (a[i] !== b[i]) {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
/* eslint-env browser */
|
|
2
|
-
import {Layer, log} from '@deck.gl/core';
|
|
3
2
|
import {RequestScheduler} from '@loaders.gl/loader-utils';
|
|
4
3
|
import {TileBoundingBox, TileIndex, TileLoadProps} from './types';
|
|
5
4
|
|
|
@@ -10,7 +9,7 @@ export type TileLoadDataProps<DataT = any> = {
|
|
|
10
9
|
onError: (error: any, tile: Tile2DHeader<DataT>) => void;
|
|
11
10
|
};
|
|
12
11
|
|
|
13
|
-
export
|
|
12
|
+
export class Tile2DHeader<DataT = any> {
|
|
14
13
|
index: TileIndex;
|
|
15
14
|
isVisible: boolean;
|
|
16
15
|
isSelected: boolean;
|
|
@@ -18,7 +17,7 @@ export default class Tile2DHeader<DataT = any> {
|
|
|
18
17
|
children: Tile2DHeader[] | null;
|
|
19
18
|
content: DataT | null;
|
|
20
19
|
state?: number;
|
|
21
|
-
layers?: Layer[] | null
|
|
20
|
+
layers?: any[] | null; // Layer[] | null
|
|
22
21
|
|
|
23
22
|
id!: string; // assigned _always_ with result of `getTileId`
|
|
24
23
|
bbox!: TileBoundingBox; // assigned _always_ with result of `getTileMetadata`
|
|
@@ -68,7 +67,8 @@ export default class Tile2DHeader<DataT = any> {
|
|
|
68
67
|
get byteLength(): number {
|
|
69
68
|
const result = this.content ? (this.content as any).byteLength : 0;
|
|
70
69
|
if (!Number.isFinite(result)) {
|
|
71
|
-
|
|
70
|
+
// eslint-disable-next-line no-console
|
|
71
|
+
console.error('byteLength not defined in tile data');
|
|
72
72
|
}
|
|
73
73
|
return result;
|
|
74
74
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
/* eslint-disable complexity */
|
|
2
1
|
import {Viewport, WebMercatorViewport, _GlobeViewport} from '@deck.gl/core';
|
|
2
|
+
|
|
3
3
|
import {
|
|
4
4
|
CullingVolume,
|
|
5
5
|
Plane,
|
|
@@ -63,6 +63,7 @@ class OSMNode {
|
|
|
63
63
|
return this._children;
|
|
64
64
|
}
|
|
65
65
|
|
|
66
|
+
// eslint-disable-next-line complexity
|
|
66
67
|
update(params: {
|
|
67
68
|
viewport: Viewport;
|
|
68
69
|
project: ((xyz: number[]) => number[]) | null;
|
|
@@ -178,6 +179,7 @@ class OSMNode {
|
|
|
178
179
|
}
|
|
179
180
|
}
|
|
180
181
|
|
|
182
|
+
// eslint-disable-next-line complexity
|
|
181
183
|
export function getOSMTileIndices(
|
|
182
184
|
viewport: Viewport,
|
|
183
185
|
maxZ: number,
|
|
@@ -1,11 +1,14 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
1
|
+
import {Viewport} from '@deck.gl/core';
|
|
2
|
+
|
|
3
3
|
import {RequestScheduler} from '@loaders.gl/loader-utils';
|
|
4
4
|
import {Matrix4, equals} from '@math.gl/core';
|
|
5
|
-
|
|
5
|
+
|
|
6
|
+
import {Tile2DHeader} from './tile-2d-header';
|
|
7
|
+
|
|
8
|
+
import {getTileIndices, tileToBoundingBox, getCullBounds} from './utils';
|
|
6
9
|
import {Bounds, TileIndex, ZRange} from './types';
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
10
|
+
import {TileLoadProps} from './types';
|
|
11
|
+
import {memoize} from './memoize';
|
|
9
12
|
|
|
10
13
|
// bit masks
|
|
11
14
|
const TILE_STATE_VISITED = 1;
|
|
@@ -35,9 +38,9 @@ export const STRATEGY_DEFAULT = 'best-available';
|
|
|
35
38
|
|
|
36
39
|
export type RefinementStrategyFunction = (tiles: Tile2DHeader[]) => void;
|
|
37
40
|
export type RefinementStrategy =
|
|
38
|
-
|
|
|
39
|
-
|
|
|
40
|
-
|
|
|
41
|
+
| 'never'
|
|
42
|
+
| 'no-overlap'
|
|
43
|
+
| 'best-available'
|
|
41
44
|
| RefinementStrategyFunction;
|
|
42
45
|
|
|
43
46
|
const DEFAULT_CACHE_SCALE = 5;
|
|
@@ -48,30 +51,71 @@ const STRATEGIES = {
|
|
|
48
51
|
[STRATEGY_NEVER]: () => {}
|
|
49
52
|
};
|
|
50
53
|
|
|
51
|
-
export type Tileset2DProps =
|
|
52
|
-
|
|
53
|
-
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
54
|
+
export type Tileset2DProps<DataT = any> = {
|
|
55
|
+
/** `getTileData` is called to retrieve the data of each tile. */
|
|
56
|
+
getTileData: (props: TileLoadProps) => Promise<DataT> | DataT;
|
|
57
|
+
|
|
58
|
+
/** The bounding box of the layer's data. */
|
|
59
|
+
extent?: number[] | null;
|
|
60
|
+
/** The pixel dimension of the tiles, usually a power of 2. */
|
|
61
|
+
tileSize?: number;
|
|
62
|
+
/** The max zoom level of the layer's data. @default null */
|
|
63
|
+
maxZoom?: number | null;
|
|
64
|
+
/** The min zoom level of the layer's data. @default 0 */
|
|
65
|
+
minZoom?: number | null;
|
|
66
|
+
/** The maximum number of tiles that can be cached. */
|
|
67
|
+
maxCacheSize?: number | null;
|
|
68
|
+
/** The maximum memory used for caching tiles. @default null */
|
|
69
|
+
maxCacheByteSize?: number | null;
|
|
70
|
+
/** How the tile layer refines the visibility of tiles. @default 'best-available' */
|
|
71
|
+
refinementStrategy?: RefinementStrategy;
|
|
72
|
+
/** Range of minimum and maximum heights in the tile. */
|
|
73
|
+
zRange?: ZRange | null;
|
|
74
|
+
/** The maximum number of concurrent getTileData calls. @default 6 */
|
|
75
|
+
maxRequests?: number;
|
|
76
|
+
/** Changes the zoom level at which the tiles are fetched. Needs to be an integer. @default 0 */
|
|
77
|
+
zoomOffset?: number;
|
|
78
|
+
|
|
79
|
+
/** Called when a tile successfully loads. */
|
|
80
|
+
onTileLoad?: (tile: Tile2DHeader<DataT>) => void;
|
|
81
|
+
/** Called when a tile is cleared from cache. */
|
|
82
|
+
onTileUnload?: (tile: Tile2DHeader<DataT>) => void;
|
|
83
|
+
/** Called when a tile failed to load. */
|
|
84
|
+
onTileError?: (err: any, tile: Tile2DHeader<DataT>) => void;
|
|
85
|
+
|
|
86
|
+
// onTileLoad: (tile: Tile2DHeader) => void;
|
|
87
|
+
// onTileUnload: (tile: Tile2DHeader) => void;
|
|
88
|
+
// onTileError: (error: any, tile: Tile2DHeader) => void;
|
|
89
|
+
/** Called when all tiles in the current viewport are loaded. */
|
|
90
|
+
// sonViewportLoad?: ((tiles: Tile2DHeader<DataT>[]) => void) | null;
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
export const DEFAULT_TILESET2D_PROPS: Omit<Required<Tileset2DProps>, 'getTileData'> = {
|
|
94
|
+
extent: null,
|
|
95
|
+
tileSize: 512,
|
|
96
|
+
|
|
97
|
+
maxZoom: null,
|
|
98
|
+
minZoom: null,
|
|
99
|
+
maxCacheSize: null,
|
|
100
|
+
maxCacheByteSize: null,
|
|
101
|
+
refinementStrategy: 'best-available',
|
|
102
|
+
zRange: null,
|
|
103
|
+
maxRequests: 6,
|
|
104
|
+
zoomOffset: 0,
|
|
105
|
+
|
|
106
|
+
// onTileLoad: (tile: Tile2DHeader) => void, // onTileUnload: (tile: Tile2DHeader) => void, // onTileError: (error: any, tile: Tile2DHeader) => void, /** Called when all tiles in the current viewport are loaded. */
|
|
107
|
+
// onViewportLoad: ((tiles: Tile2DHeader<DataT>[]) => void) | null,
|
|
108
|
+
onTileLoad: () => {},
|
|
109
|
+
onTileUnload: () => {},
|
|
110
|
+
onTileError: () => {}
|
|
67
111
|
};
|
|
68
112
|
|
|
69
113
|
/**
|
|
70
114
|
* Manages loading and purging of tile data. This class caches recently visited tiles
|
|
71
115
|
* and only creates new tiles if they are present.
|
|
72
116
|
*/
|
|
73
|
-
export
|
|
74
|
-
private opts: Tileset2DProps
|
|
117
|
+
export class Tileset2D {
|
|
118
|
+
private opts: Required<Tileset2DProps>;
|
|
75
119
|
private _requestScheduler: RequestScheduler;
|
|
76
120
|
private _cache: Map<string, Tile2DHeader>;
|
|
77
121
|
private _dirty: boolean;
|
|
@@ -95,10 +139,10 @@ export default class Tileset2D {
|
|
|
95
139
|
* Cache size defaults to 5 * number of tiles in the current viewport
|
|
96
140
|
*/
|
|
97
141
|
constructor(opts: Tileset2DProps) {
|
|
98
|
-
this.opts = opts;
|
|
142
|
+
this.opts = {...DEFAULT_TILESET2D_PROPS, ...opts};
|
|
99
143
|
|
|
100
144
|
this.onTileLoad = tile => {
|
|
101
|
-
this.opts.onTileLoad(tile);
|
|
145
|
+
this.opts.onTileLoad?.(tile);
|
|
102
146
|
if (this.opts.maxCacheByteSize) {
|
|
103
147
|
this._cacheByteSize += tile.byteLength;
|
|
104
148
|
this._resizeCache();
|
|
@@ -107,7 +151,7 @@ export default class Tileset2D {
|
|
|
107
151
|
|
|
108
152
|
this._requestScheduler = new RequestScheduler({
|
|
109
153
|
maxRequests: opts.maxRequests,
|
|
110
|
-
throttleRequests: opts.maxRequests > 0
|
|
154
|
+
throttleRequests: Boolean(opts.maxRequests && opts.maxRequests > 0)
|
|
111
155
|
});
|
|
112
156
|
|
|
113
157
|
// Maps tile id in string {z}-{x}-{y} to a Tile object
|
|
@@ -242,19 +286,27 @@ export default class Tileset2D {
|
|
|
242
286
|
}
|
|
243
287
|
|
|
244
288
|
if (cullRect && this._viewport) {
|
|
245
|
-
const
|
|
289
|
+
const boundsArr = this._getCullBounds({
|
|
246
290
|
viewport: this._viewport,
|
|
247
291
|
z: this._zRange,
|
|
248
292
|
cullRect
|
|
249
293
|
});
|
|
250
294
|
const {bbox} = tile;
|
|
251
|
-
|
|
252
|
-
|
|
295
|
+
for (const [minX, minY, maxX, maxY] of boundsArr) {
|
|
296
|
+
let overlaps;
|
|
297
|
+
if ('west' in bbox) {
|
|
298
|
+
overlaps = bbox.west < maxX && bbox.east > minX && bbox.south < maxY && bbox.north > minY;
|
|
299
|
+
} else {
|
|
300
|
+
// top/bottom could be swapped depending on the indexing system
|
|
301
|
+
const y0 = Math.min(bbox.top, bbox.bottom);
|
|
302
|
+
const y1 = Math.max(bbox.top, bbox.bottom);
|
|
303
|
+
overlaps = bbox.left < maxX && bbox.right > minX && y0 < maxY && y1 > minY;
|
|
304
|
+
}
|
|
305
|
+
if (overlaps) {
|
|
306
|
+
return true;
|
|
307
|
+
}
|
|
253
308
|
}
|
|
254
|
-
|
|
255
|
-
const y0 = Math.min(bbox.top, bbox.bottom);
|
|
256
|
-
const y1 = Math.max(bbox.top, bbox.bottom);
|
|
257
|
-
return bbox.left < maxX && bbox.right > minX && y0 < maxY && y1 > minY;
|
|
309
|
+
return false;
|
|
258
310
|
}
|
|
259
311
|
return true;
|
|
260
312
|
}
|
|
@@ -358,7 +410,7 @@ export default class Tileset2D {
|
|
|
358
410
|
private _getCullBounds = memoize(getCullBounds);
|
|
359
411
|
|
|
360
412
|
private _pruneRequests(): void {
|
|
361
|
-
const {maxRequests} = this.opts;
|
|
413
|
+
const {maxRequests = 0} = this.opts;
|
|
362
414
|
|
|
363
415
|
const abortCandidates: Tile2DHeader[] = [];
|
|
364
416
|
let ongoingRequestCount = 0;
|
|
@@ -419,11 +471,11 @@ export default class Tileset2D {
|
|
|
419
471
|
|
|
420
472
|
if (overflown) {
|
|
421
473
|
for (const [id, tile] of _cache) {
|
|
422
|
-
if (!tile.isVisible) {
|
|
474
|
+
if (!tile.isVisible && !tile.isSelected) {
|
|
423
475
|
// delete tile
|
|
424
476
|
this._cacheByteSize -= opts.maxCacheByteSize ? tile.byteLength : 0;
|
|
425
477
|
_cache.delete(id);
|
|
426
|
-
this.opts.onTileUnload(tile);
|
|
478
|
+
this.opts.onTileUnload?.(tile);
|
|
427
479
|
}
|
|
428
480
|
if (_cache.size <= maxCacheSize && this._cacheByteSize <= maxCacheByteSize) {
|
|
429
481
|
break;
|
|
File without changes
|
|
@@ -130,7 +130,7 @@ function getBoundingBox(viewport: Viewport, zRange: number[] | null, extent: Bou
|
|
|
130
130
|
/** Get culling bounds in world space */
|
|
131
131
|
export function getCullBounds({
|
|
132
132
|
viewport,
|
|
133
|
-
z,
|
|
133
|
+
z = 0,
|
|
134
134
|
cullRect
|
|
135
135
|
}: {
|
|
136
136
|
/** Current viewport */
|
|
@@ -139,13 +139,25 @@ export function getCullBounds({
|
|
|
139
139
|
z: ZRange | number | undefined;
|
|
140
140
|
/** Culling rectangle in screen space */
|
|
141
141
|
cullRect: {x: number; y: number; width: number; height: number};
|
|
142
|
-
}): [number, number, number, number] {
|
|
143
|
-
const
|
|
144
|
-
|
|
145
|
-
|
|
142
|
+
}): [number, number, number, number][] {
|
|
143
|
+
const subViewports = viewport.subViewports || [viewport];
|
|
144
|
+
return subViewports.map(v => getCullBoundsInViewport(v, z, cullRect));
|
|
145
|
+
}
|
|
146
146
|
|
|
147
|
+
function getCullBoundsInViewport(
|
|
148
|
+
/** Current viewport */
|
|
149
|
+
viewport: Viewport,
|
|
150
|
+
/** At altitude */
|
|
151
|
+
z: ZRange | number,
|
|
152
|
+
/** Culling rectangle in screen space */
|
|
153
|
+
cullRect: {x: number; y: number; width: number; height: number}
|
|
154
|
+
): [number, number, number, number] {
|
|
147
155
|
if (!Array.isArray(z)) {
|
|
148
|
-
const
|
|
156
|
+
const x = cullRect.x - viewport.x;
|
|
157
|
+
const y = cullRect.y - viewport.y;
|
|
158
|
+
const {width, height} = cullRect;
|
|
159
|
+
|
|
160
|
+
const unprojectOption = {targetZ: z};
|
|
149
161
|
|
|
150
162
|
const topLeft = viewport.unproject([x, y], unprojectOption);
|
|
151
163
|
const topRight = viewport.unproject([x + width, y], unprojectOption);
|
|
@@ -160,8 +172,8 @@ export function getCullBounds({
|
|
|
160
172
|
];
|
|
161
173
|
}
|
|
162
174
|
|
|
163
|
-
const bounds0 =
|
|
164
|
-
const bounds1 =
|
|
175
|
+
const bounds0 = getCullBoundsInViewport(viewport, z[0], cullRect);
|
|
176
|
+
const bounds1 = getCullBoundsInViewport(viewport, z[1], cullRect);
|
|
165
177
|
|
|
166
178
|
return [
|
|
167
179
|
Math.min(bounds0[0], bounds1[0]),
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { CompositeLayer } from '@deck.gl/core';
|
|
2
|
+
import { PolygonLayer } from '@deck.gl/layers';
|
|
3
|
+
const defaultProps = {
|
|
4
|
+
...PolygonLayer.defaultProps
|
|
5
|
+
};
|
|
6
|
+
export default class GeoCellLayer extends CompositeLayer {
|
|
7
|
+
/** Implement to generate props to create geometry. */
|
|
8
|
+
indexToBounds() {
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
renderLayers() {
|
|
12
|
+
// Rendering props underlying layer
|
|
13
|
+
const { elevationScale, extruded, wireframe, filled, stroked, lineWidthUnits, lineWidthScale, lineWidthMinPixels, lineWidthMaxPixels, lineJointRounded, lineMiterLimit, lineDashJustified, getElevation, getFillColor, getLineColor, getLineWidth } = this.props;
|
|
14
|
+
// Accessor props for underlying layers
|
|
15
|
+
const { updateTriggers, material, transitions } = this.props;
|
|
16
|
+
// Filled Polygon Layer
|
|
17
|
+
const CellLayer = this.getSubLayerClass('cell', PolygonLayer);
|
|
18
|
+
return new CellLayer({
|
|
19
|
+
filled,
|
|
20
|
+
wireframe,
|
|
21
|
+
extruded,
|
|
22
|
+
elevationScale,
|
|
23
|
+
stroked,
|
|
24
|
+
lineWidthUnits,
|
|
25
|
+
lineWidthScale,
|
|
26
|
+
lineWidthMinPixels,
|
|
27
|
+
lineWidthMaxPixels,
|
|
28
|
+
lineJointRounded,
|
|
29
|
+
lineMiterLimit,
|
|
30
|
+
lineDashJustified,
|
|
31
|
+
material,
|
|
32
|
+
transitions,
|
|
33
|
+
getElevation,
|
|
34
|
+
getFillColor,
|
|
35
|
+
getLineColor,
|
|
36
|
+
getLineWidth
|
|
37
|
+
}, this.getSubLayerProps({
|
|
38
|
+
id: 'cell',
|
|
39
|
+
updateTriggers: updateTriggers && {
|
|
40
|
+
getElevation: updateTriggers.getElevation,
|
|
41
|
+
getFillColor: updateTriggers.getFillColor,
|
|
42
|
+
getLineColor: updateTriggers.getLineColor,
|
|
43
|
+
getLineWidth: updateTriggers.getLineWidth
|
|
44
|
+
}
|
|
45
|
+
}), this.indexToBounds());
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
GeoCellLayer.layerName = 'GeoCellLayer';
|
|
49
|
+
GeoCellLayer.defaultProps = defaultProps;
|