@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.
Files changed (134) hide show
  1. package/dist/dist.dev.js +25762 -66554
  2. package/dist/es5/h3-layers/h3-cluster-layer.js +2 -2
  3. package/dist/es5/h3-layers/h3-cluster-layer.js.map +1 -1
  4. package/dist/es5/index.js +4 -8
  5. package/dist/es5/index.js.map +1 -1
  6. package/dist/es5/mesh-layer/mesh-layer-fragment.glsl.js +1 -1
  7. package/dist/es5/mesh-layer/mesh-layer-vertex.glsl.js +1 -1
  8. package/dist/es5/mvt-layer/coordinate-transform.js.map +1 -1
  9. package/dist/es5/mvt-layer/mvt-layer.js +9 -9
  10. package/dist/es5/mvt-layer/mvt-layer.js.map +1 -1
  11. package/dist/es5/terrain-layer/terrain-layer.js +5 -5
  12. package/dist/es5/terrain-layer/terrain-layer.js.map +1 -1
  13. package/dist/es5/tile-3d-layer/tile-3d-layer.js.map +1 -1
  14. package/dist/es5/tile-layer/tile-layer.js +9 -13
  15. package/dist/es5/tile-layer/tile-layer.js.map +1 -1
  16. package/dist/es5/tileset-2d/index.js +66 -0
  17. package/dist/es5/tileset-2d/index.js.map +1 -0
  18. package/dist/es5/tileset-2d/memoize.js +47 -0
  19. package/dist/es5/tileset-2d/memoize.js.map +1 -0
  20. package/dist/es5/{tile-layer → tileset-2d}/tile-2d-header.js +3 -5
  21. package/dist/es5/tileset-2d/tile-2d-header.js.map +1 -0
  22. package/dist/es5/{tile-layer → tileset-2d}/tile-2d-traversal.js +0 -0
  23. package/dist/es5/tileset-2d/tile-2d-traversal.js.map +1 -0
  24. package/dist/es5/{tile-layer → tileset-2d}/tileset-2d.js +166 -121
  25. package/dist/es5/tileset-2d/tileset-2d.js.map +1 -0
  26. package/dist/es5/{tile-layer → tileset-2d}/types.js +0 -0
  27. package/dist/es5/{tile-layer → tileset-2d}/types.js.map +0 -0
  28. package/dist/es5/{tile-layer → tileset-2d}/utils.js +15 -16
  29. package/dist/es5/tileset-2d/utils.js.map +1 -0
  30. package/dist/esm/h3-layers/h3-cluster-layer.js +1 -1
  31. package/dist/esm/h3-layers/h3-cluster-layer.js.map +1 -1
  32. package/dist/esm/index.js +3 -3
  33. package/dist/esm/index.js.map +1 -1
  34. package/dist/esm/mesh-layer/mesh-layer-fragment.glsl.js +1 -1
  35. package/dist/esm/mesh-layer/mesh-layer-vertex.glsl.js +1 -1
  36. package/dist/esm/mvt-layer/coordinate-transform.js.map +1 -1
  37. package/dist/esm/mvt-layer/mvt-layer.js +3 -3
  38. package/dist/esm/mvt-layer/mvt-layer.js.map +1 -1
  39. package/dist/esm/terrain-layer/terrain-layer.js +1 -1
  40. package/dist/esm/terrain-layer/terrain-layer.js.map +1 -1
  41. package/dist/esm/tile-3d-layer/tile-3d-layer.js.map +1 -1
  42. package/dist/esm/tile-layer/tile-layer.js +6 -3
  43. package/dist/esm/tile-layer/tile-layer.js.map +1 -1
  44. package/dist/esm/tileset-2d/index.js +4 -0
  45. package/dist/esm/tileset-2d/index.js.map +1 -0
  46. package/dist/esm/tileset-2d/memoize.js +40 -0
  47. package/dist/esm/tileset-2d/memoize.js.map +1 -0
  48. package/dist/esm/{tile-layer → tileset-2d}/tile-2d-header.js +2 -3
  49. package/dist/esm/tileset-2d/tile-2d-header.js.map +1 -0
  50. package/dist/esm/{tile-layer → tileset-2d}/tile-2d-traversal.js +0 -0
  51. package/dist/esm/tileset-2d/tile-2d-traversal.js.map +1 -0
  52. package/dist/esm/{tile-layer → tileset-2d}/tileset-2d.js +48 -16
  53. package/dist/esm/tileset-2d/tileset-2d.js.map +1 -0
  54. package/dist/esm/{tile-layer → tileset-2d}/types.js +0 -0
  55. package/dist/esm/{tile-layer → tileset-2d}/types.js.map +0 -0
  56. package/dist/esm/{tile-layer → tileset-2d}/utils.js +14 -18
  57. package/dist/esm/tileset-2d/utils.js.map +1 -0
  58. package/dist.min.js +187 -6
  59. package/package.json +11 -11
  60. package/src/h3-layers/h3-cluster-layer.ts +1 -1
  61. package/src/index.ts +9 -5
  62. package/src/mvt-layer/coordinate-transform.ts +1 -1
  63. package/src/mvt-layer/mvt-layer.ts +14 -7
  64. package/src/terrain-layer/terrain-layer.ts +2 -3
  65. package/src/tile-3d-layer/tile-3d-layer.ts +3 -0
  66. package/src/tile-layer/tile-layer.ts +13 -6
  67. package/src/tileset-2d/index.ts +24 -0
  68. package/src/tileset-2d/memoize.ts +45 -0
  69. package/src/{tile-layer → tileset-2d}/tile-2d-header.ts +4 -4
  70. package/src/{tile-layer → tileset-2d}/tile-2d-traversal.ts +3 -1
  71. package/src/{tile-layer → tileset-2d}/tileset-2d.ts +91 -39
  72. package/src/{tile-layer → tileset-2d}/types.ts +0 -0
  73. package/src/{tile-layer → tileset-2d}/utils.ts +20 -8
  74. package/typed/geo-cell-layer/GeoCellLayer.js +49 -0
  75. package/typed/great-circle-layer/great-circle-layer.js +29 -0
  76. package/typed/h3-layers/h3-cluster-layer.js +33 -0
  77. package/typed/h3-layers/h3-hexagon-layer.js +251 -0
  78. package/typed/index.d.ts +5 -5
  79. package/typed/index.d.ts.map +1 -1
  80. package/typed/index.js +33 -0
  81. package/typed/mesh-layer/mesh-layer-fragment.glsl.js +55 -0
  82. package/typed/mesh-layer/mesh-layer-vertex.glsl.js +80 -0
  83. package/typed/mesh-layer/mesh-layer.js +110 -0
  84. package/typed/mvt-layer/coordinate-transform.d.ts +1 -1
  85. package/typed/mvt-layer/coordinate-transform.d.ts.map +1 -1
  86. package/typed/mvt-layer/coordinate-transform.js +41 -0
  87. package/typed/mvt-layer/find-index-binary.js +96 -0
  88. package/typed/mvt-layer/mvt-layer.d.ts +2 -3
  89. package/typed/mvt-layer/mvt-layer.d.ts.map +1 -1
  90. package/typed/mvt-layer/mvt-layer.js +297 -0
  91. package/typed/quadkey-layer/quadkey-layer.js +18 -0
  92. package/typed/quadkey-layer/quadkey-utils.js +26 -0
  93. package/typed/s2-layer/s2-geometry.js +123 -0
  94. package/typed/s2-layer/s2-layer.js +37 -0
  95. package/typed/s2-layer/s2-utils.js +88 -0
  96. package/typed/terrain-layer/terrain-layer.d.ts +2 -2
  97. package/typed/terrain-layer/terrain-layer.d.ts.map +1 -1
  98. package/typed/terrain-layer/terrain-layer.js +226 -0
  99. package/typed/tile-3d-layer/tile-3d-layer.d.ts.map +1 -1
  100. package/typed/tile-3d-layer/tile-3d-layer.js +294 -0
  101. package/typed/tile-layer/tile-2d-header.js +113 -0
  102. package/typed/tile-layer/tile-2d-traversal.js +181 -0
  103. package/typed/tile-layer/tile-layer.d.ts +3 -4
  104. package/typed/tile-layer/tile-layer.d.ts.map +1 -1
  105. package/typed/tile-layer/tile-layer.js +192 -0
  106. package/typed/tile-layer/tileset-2d.d.ts.map +1 -1
  107. package/typed/tile-layer/tileset-2d.js +399 -0
  108. package/typed/tile-layer/types.js +1 -0
  109. package/typed/tile-layer/utils.d.ts +1 -1
  110. package/typed/tile-layer/utils.d.ts.map +1 -1
  111. package/typed/tile-layer/utils.js +197 -0
  112. package/typed/tileset-2d/index.d.ts +6 -0
  113. package/typed/tileset-2d/index.d.ts.map +1 -0
  114. package/typed/tileset-2d/memoize.d.ts +7 -0
  115. package/typed/tileset-2d/memoize.d.ts.map +1 -0
  116. package/typed/tileset-2d/tile-2d-header.d.ts +39 -0
  117. package/typed/tileset-2d/tile-2d-header.d.ts.map +1 -0
  118. package/typed/tileset-2d/tile-2d-traversal.d.ts +4 -0
  119. package/typed/tileset-2d/tile-2d-traversal.d.ts.map +1 -0
  120. package/typed/tileset-2d/tileset-2d.d.ts +121 -0
  121. package/typed/tileset-2d/tileset-2d.d.ts.map +1 -0
  122. package/typed/tileset-2d/types.d.ts +30 -0
  123. package/typed/tileset-2d/types.d.ts.map +1 -0
  124. package/typed/tileset-2d/utils.d.ts +51 -0
  125. package/typed/tileset-2d/utils.d.ts.map +1 -0
  126. package/typed/trips-layer/trips-layer.js +92 -0
  127. package/dist/es5/tile-layer/tile-2d-header.js.map +0 -1
  128. package/dist/es5/tile-layer/tile-2d-traversal.js.map +0 -1
  129. package/dist/es5/tile-layer/tileset-2d.js.map +0 -1
  130. package/dist/es5/tile-layer/utils.js.map +0 -1
  131. package/dist/esm/tile-layer/tile-2d-header.js.map +0 -1
  132. package/dist/esm/tile-layer/tile-2d-traversal.js.map +0 -1
  133. package/dist/esm/tile-layer/tileset-2d.js.map +0 -1
  134. 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-alpha.4",
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": "webpack --config ../../scripts/bundle.config.js",
30
- "prepublishOnly": "npm run build-bundle && npm run build-bundle -- --env.dev"
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.2.5",
34
- "@loaders.gl/gis": "^3.2.5",
35
- "@loaders.gl/loader-utils": "^3.2.5",
36
- "@loaders.gl/mvt": "^3.2.5",
37
- "@loaders.gl/schema": "^3.2.5",
38
- "@loaders.gl/terrain": "^3.2.5",
39
- "@loaders.gl/tiles": "^3.2.5",
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": "f34f77e2b050306ade160a5628ea2844a4ceabc2"
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 '@deck.gl/geo-layers';
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';
@@ -1,6 +1,6 @@
1
1
  import {Viewport} from '@deck.gl/core';
2
2
  import {lerp} from '@math.gl/core';
3
- import {GeoBoundingBox} from '../tile-layer/types';
3
+ import {GeoBoundingBox} from '../tileset-2d';
4
4
 
5
5
  const availableTransformations = {
6
6
  Point,
@@ -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 Tile2DHeader from '../tile-layer/tile-2d-header';
39
- import {Bounds, GeoBoundingBox, TileBoundingBox, TileLoadProps, ZRange} from '../tile-layer/types';
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 Tileset2D, {RefinementStrategy, STRATEGY_DEFAULT, Tileset2DProps} from './tileset-2d';
18
- import {TileLoadProps, ZRange} from './types';
19
- import {urlType, getURLFromTemplate} from './utils';
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 as any).tile = (sourceLayer as any).props.tile;
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 default class Tile2DHeader<DataT = any> {
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
- log.error('byteLength not defined in tile data')();
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 Tile2DHeader from './tile-2d-header';
2
- import {getTileIndices, tileToBoundingBox, getCullBounds} from './utils';
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
- import {Viewport} from '@deck.gl/core';
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 {TileLayerProps} from './tile-layer';
8
- import {_memoize as memoize} from '@deck.gl/core';
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
- | typeof STRATEGY_NEVER
39
- | typeof STRATEGY_REPLACE
40
- | typeof STRATEGY_DEFAULT
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 = Pick<
52
- Required<TileLayerProps>,
53
- | 'tileSize'
54
- | 'maxCacheSize'
55
- | 'maxCacheByteSize'
56
- | 'refinementStrategy'
57
- | 'extent'
58
- | 'maxZoom'
59
- | 'minZoom'
60
- | 'maxRequests'
61
- | 'zoomOffset'
62
- > & {
63
- getTileData: NonNullable<TileLayerProps['getTileData']>;
64
- onTileLoad: (tile: Tile2DHeader) => void;
65
- onTileUnload: (tile: Tile2DHeader) => void;
66
- onTileError: (error: any, tile: Tile2DHeader) => void;
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 default class Tileset2D {
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 [minX, minY, maxX, maxY] = getCullBounds({
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
- if ('west' in bbox) {
252
- return bbox.west < maxX && bbox.east > minX && bbox.south < maxY && bbox.north > minY;
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
- // top/bottom could be swapped depending on the indexing system
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 x = cullRect.x - viewport.x;
144
- const y = cullRect.y - viewport.y;
145
- const {width, height} = cullRect;
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 unprojectOption = {targetZ: z || 0};
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 = getCullBounds({viewport, z: z[0], cullRect});
164
- const bounds1 = getCullBounds({viewport, z: z[1], cullRect});
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;