@deck.gl/geo-layers 8.9.0-beta.1 → 8.9.0-beta.3

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 (106) hide show
  1. package/dist/dist.dev.js +12567 -4858
  2. package/dist/es5/geo-cell-layer/GeoCellLayer.js.map +1 -1
  3. package/dist/es5/geohash-layer/geohash-layer.js.map +1 -1
  4. package/dist/es5/great-circle-layer/great-circle-layer.js.map +1 -1
  5. package/dist/es5/h3-layers/h3-cluster-layer.js.map +1 -1
  6. package/dist/es5/h3-layers/h3-hexagon-layer.js.map +1 -1
  7. package/dist/es5/index.js +8 -0
  8. package/dist/es5/index.js.map +1 -1
  9. package/dist/es5/mesh-layer/mesh-layer.js.map +1 -1
  10. package/dist/es5/mvt-layer/mvt-layer.js.map +1 -1
  11. package/dist/es5/quadkey-layer/quadkey-layer.js.map +1 -1
  12. package/dist/es5/s2-layer/s2-layer.js.map +1 -1
  13. package/dist/es5/terrain-layer/terrain-layer.js +1 -4
  14. package/dist/es5/terrain-layer/terrain-layer.js.map +1 -1
  15. package/dist/es5/tile-3d-layer/tile-3d-layer.js +9 -8
  16. package/dist/es5/tile-3d-layer/tile-3d-layer.js.map +1 -1
  17. package/dist/es5/tile-layer/tile-layer.js +26 -4
  18. package/dist/es5/tile-layer/tile-layer.js.map +1 -1
  19. package/dist/es5/tileset-2d/index.js.map +1 -1
  20. package/dist/es5/tileset-2d/tileset-2d.js.map +1 -1
  21. package/dist/es5/tileset-2d/utils.js +2 -2
  22. package/dist/es5/tileset-2d/utils.js.map +1 -1
  23. package/dist/es5/trips-layer/trips-layer.js.map +1 -1
  24. package/dist/es5/wms-layer/wms-layer.js +377 -0
  25. package/dist/es5/wms-layer/wms-layer.js.map +1 -0
  26. package/dist/esm/geo-cell-layer/GeoCellLayer.js.map +1 -1
  27. package/dist/esm/geohash-layer/geohash-layer.js.map +1 -1
  28. package/dist/esm/great-circle-layer/great-circle-layer.js.map +1 -1
  29. package/dist/esm/h3-layers/h3-cluster-layer.js.map +1 -1
  30. package/dist/esm/h3-layers/h3-hexagon-layer.js.map +1 -1
  31. package/dist/esm/index.js +1 -0
  32. package/dist/esm/index.js.map +1 -1
  33. package/dist/esm/mesh-layer/mesh-layer.js.map +1 -1
  34. package/dist/esm/mvt-layer/mvt-layer.js.map +1 -1
  35. package/dist/esm/quadkey-layer/quadkey-layer.js.map +1 -1
  36. package/dist/esm/s2-layer/s2-layer.js.map +1 -1
  37. package/dist/esm/terrain-layer/terrain-layer.js +1 -4
  38. package/dist/esm/terrain-layer/terrain-layer.js.map +1 -1
  39. package/dist/esm/tile-3d-layer/tile-3d-layer.js +9 -10
  40. package/dist/esm/tile-3d-layer/tile-3d-layer.js.map +1 -1
  41. package/dist/esm/tile-layer/tile-layer.js +11 -4
  42. package/dist/esm/tile-layer/tile-layer.js.map +1 -1
  43. package/dist/esm/tileset-2d/index.js.map +1 -1
  44. package/dist/esm/tileset-2d/tileset-2d.js.map +1 -1
  45. package/dist/esm/tileset-2d/utils.js +2 -2
  46. package/dist/esm/tileset-2d/utils.js.map +1 -1
  47. package/dist/esm/trips-layer/trips-layer.js.map +1 -1
  48. package/dist/esm/wms-layer/wms-layer.js +232 -0
  49. package/dist/esm/wms-layer/wms-layer.js.map +1 -0
  50. package/dist.min.js +66 -54
  51. package/package.json +12 -10
  52. package/src/geo-cell-layer/GeoCellLayer.ts +2 -2
  53. package/src/geohash-layer/geohash-layer.ts +4 -4
  54. package/src/great-circle-layer/great-circle-layer.ts +2 -2
  55. package/src/h3-layers/h3-cluster-layer.ts +1 -1
  56. package/src/h3-layers/h3-hexagon-layer.ts +4 -1
  57. package/src/index.ts +2 -0
  58. package/src/mesh-layer/mesh-layer.ts +1 -1
  59. package/src/mvt-layer/mvt-layer.ts +4 -4
  60. package/src/quadkey-layer/quadkey-layer.ts +1 -1
  61. package/src/s2-layer/s2-layer.ts +1 -1
  62. package/src/terrain-layer/terrain-layer.ts +10 -7
  63. package/src/tile-3d-layer/tile-3d-layer.ts +10 -11
  64. package/src/tile-layer/tile-layer.ts +11 -6
  65. package/src/tileset-2d/index.ts +1 -0
  66. package/src/tileset-2d/tileset-2d.ts +1 -0
  67. package/src/tileset-2d/utils.ts +6 -4
  68. package/src/trips-layer/trips-layer.ts +1 -1
  69. package/src/wms-layer/wms-layer.ts +246 -0
  70. package/typed/geo-cell-layer/GeoCellLayer.d.ts +2 -2
  71. package/typed/geo-cell-layer/GeoCellLayer.d.ts.map +1 -1
  72. package/typed/geohash-layer/geohash-layer.d.ts +3 -3
  73. package/typed/geohash-layer/geohash-layer.d.ts.map +1 -1
  74. package/typed/great-circle-layer/great-circle-layer.d.ts +3 -2
  75. package/typed/great-circle-layer/great-circle-layer.d.ts.map +1 -1
  76. package/typed/h3-layers/h3-cluster-layer.d.ts +1 -1
  77. package/typed/h3-layers/h3-cluster-layer.d.ts.map +1 -1
  78. package/typed/h3-layers/h3-hexagon-layer.d.ts +1 -1
  79. package/typed/h3-layers/h3-hexagon-layer.d.ts.map +1 -1
  80. package/typed/imagery-layer/imagery-layer.d.ts +53 -0
  81. package/typed/imagery-layer/imagery-layer.d.ts.map +1 -0
  82. package/typed/index.d.ts +2 -0
  83. package/typed/index.d.ts.map +1 -1
  84. package/typed/mesh-layer/mesh-layer.d.ts +1 -1
  85. package/typed/mesh-layer/mesh-layer.d.ts.map +1 -1
  86. package/typed/mvt-layer/mvt-layer.d.ts +1 -1
  87. package/typed/mvt-layer/mvt-layer.d.ts.map +1 -1
  88. package/typed/quadkey-layer/quadkey-layer.d.ts +1 -1
  89. package/typed/quadkey-layer/quadkey-layer.d.ts.map +1 -1
  90. package/typed/s2-layer/s2-layer.d.ts +1 -1
  91. package/typed/s2-layer/s2-layer.d.ts.map +1 -1
  92. package/typed/terrain-layer/terrain-layer.d.ts +7 -4
  93. package/typed/terrain-layer/terrain-layer.d.ts.map +1 -1
  94. package/typed/tile-3d-layer/tile-3d-layer.d.ts +3 -3
  95. package/typed/tile-3d-layer/tile-3d-layer.d.ts.map +1 -1
  96. package/typed/tile-layer/tile-layer.d.ts +3 -3
  97. package/typed/tile-layer/tile-layer.d.ts.map +1 -1
  98. package/typed/tileset-2d/index.d.ts +1 -0
  99. package/typed/tileset-2d/index.d.ts.map +1 -1
  100. package/typed/tileset-2d/tileset-2d.d.ts.map +1 -1
  101. package/typed/tileset-2d/utils.d.ts +5 -4
  102. package/typed/tileset-2d/utils.d.ts.map +1 -1
  103. package/typed/trips-layer/trips-layer.d.ts +1 -1
  104. package/typed/trips-layer/trips-layer.d.ts.map +1 -1
  105. package/typed/wms-layer/wms-layer.d.ts +56 -0
  106. package/typed/wms-layer/wms-layer.d.ts.map +1 -0
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-beta.1",
5
+ "version": "8.9.0-beta.3",
6
6
  "publishConfig": {
7
7
  "access": "public"
8
8
  },
@@ -30,17 +30,19 @@
30
30
  "prepublishOnly": "npm run build-bundle && npm run build-bundle -- --env=dev"
31
31
  },
32
32
  "dependencies": {
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",
33
+ "@loaders.gl/3d-tiles": "^3.3.1",
34
+ "@loaders.gl/gis": "^3.3.1",
35
+ "@loaders.gl/loader-utils": "^3.3.1",
36
+ "@loaders.gl/mvt": "^3.3.1",
37
+ "@loaders.gl/schema": "^3.3.1",
38
+ "@loaders.gl/terrain": "^3.3.1",
39
+ "@loaders.gl/tiles": "^3.3.1",
40
+ "@loaders.gl/wms": "^3.3.1",
40
41
  "@luma.gl/constants": "^8.5.16",
41
42
  "@luma.gl/experimental": "^8.5.16",
42
43
  "@math.gl/core": "^3.6.2",
43
44
  "@math.gl/culling": "^3.6.2",
45
+ "@math.gl/proj4": "^3.6.3",
44
46
  "@math.gl/web-mercator": "^3.6.2",
45
47
  "@types/geojson": "^7946.0.8",
46
48
  "h3-js": "^3.7.0",
@@ -51,8 +53,8 @@
51
53
  "@deck.gl/extensions": "^8.0.0",
52
54
  "@deck.gl/layers": "^8.0.0",
53
55
  "@deck.gl/mesh-layers": "^8.0.0",
54
- "@loaders.gl/core": "^3.0.0",
56
+ "@loaders.gl/core": "^3.3.0",
55
57
  "@luma.gl/core": "^8.0.0"
56
58
  },
57
- "gitHead": "47223d1ea084c3f9b0c9f0f9736682850bb5db85"
59
+ "gitHead": "da509f9b00415a8d0700951663b65b59077c0cae"
58
60
  }
@@ -8,11 +8,11 @@ const defaultProps: DefaultProps<GeoCellLayerProps> = {
8
8
  /** All properties supported by GeoCellLayer. */
9
9
  export type GeoCellLayerProps<DataT = any> = PolygonLayerProps<DataT> & CompositeLayerProps<DataT>;
10
10
 
11
- export default class GeoCellLayer<DataT = any, ExtraProps = {}> extends CompositeLayer<
11
+ export default class GeoCellLayer<DataT = any, ExtraProps extends {} = {}> extends CompositeLayer<
12
12
  Required<GeoCellLayerProps<DataT>> & ExtraProps
13
13
  > {
14
14
  static layerName = 'GeoCellLayer';
15
- static defaultProps = defaultProps;
15
+ static defaultProps: DefaultProps = defaultProps;
16
16
 
17
17
  /** Implement to generate props to create geometry. */
18
18
  indexToBounds(): Partial<GeoCellLayer['props']> | null {
@@ -1,8 +1,8 @@
1
- import {AccessorFunction} from '@deck.gl/core';
1
+ import {AccessorFunction, DefaultProps} from '@deck.gl/core';
2
2
  import GeoCellLayer from '../geo-cell-layer/GeoCellLayer';
3
3
  import {getGeohashPolygon} from './geohash-utils';
4
4
 
5
- const defaultProps = {
5
+ const defaultProps: DefaultProps<GeohashLayerProps> = {
6
6
  getGeohash: {type: 'accessor', value: d => d.geohash}
7
7
  };
8
8
 
@@ -19,12 +19,12 @@ type GeohashLayerProps<DataT = any> = {
19
19
  };
20
20
 
21
21
  /** Render filled and/or stroked polygons based on the [Geohash](https://en.wikipedia.org/wiki/Geohash) geospatial indexing system. */
22
- export default class GeohashLayer<DataT = any, ExtraProps = {}> extends GeoCellLayer<
22
+ export default class GeohashLayer<DataT = any, ExtraProps extends {} = {}> extends GeoCellLayer<
23
23
  DataT,
24
24
  Required<GeohashLayerProps> & ExtraProps
25
25
  > {
26
26
  static layerName = 'GeohashLayer';
27
- static defaultProps: any = defaultProps;
27
+ static defaultProps = defaultProps;
28
28
 
29
29
  indexToBounds(): Partial<GeoCellLayer['props']> | null {
30
30
  const {data, getGeohash} = this.props;
@@ -31,10 +31,10 @@ export type GreatCircleLayerProps<DataT = any> = ArcLayerProps<DataT>;
31
31
  // This layer has been merged into the core ArcLayer
32
32
  // Keeping for backward-compatibility
33
33
  /** @deprecated Use ArcLayer with `greatCircle: true` instead */
34
- export default class GreatCircleLayer<DataT = any, ExtraProps = {}> extends ArcLayer<
34
+ export default class GreatCircleLayer<DataT = any, ExtraProps extends {} = {}> extends ArcLayer<
35
35
  DataT,
36
36
  ExtraProps
37
37
  > {
38
38
  static layerName = 'GreatCircleLayer';
39
- static defaultProps: any = defaultProps;
39
+ static defaultProps = defaultProps;
40
40
  }
@@ -22,7 +22,7 @@ type _H3ClusterLayerProps<DataT> = {
22
22
  getHexagons?: AccessorFunction<DataT, H3IndexInput[]>;
23
23
  };
24
24
 
25
- export default class H3ClusterLayer<DataT = any, ExtraProps = {}> extends GeoCellLayer<
25
+ export default class H3ClusterLayer<DataT = any, ExtraProps extends {} = {}> extends GeoCellLayer<
26
26
  DataT,
27
27
  Required<_H3ClusterLayerProps<DataT>> & ExtraProps
28
28
  > {
@@ -145,7 +145,10 @@ type _H3HexagonLayerProps<DataT> = {
145
145
  /**
146
146
  * Render hexagons from the [H3](https://h3geo.org/) geospatial indexing system.
147
147
  */
148
- export default class H3HexagonLayer<DataT = any, ExtraPropsT = {}> extends CompositeLayer<
148
+ export default class H3HexagonLayer<
149
+ DataT = any,
150
+ ExtraPropsT extends {} = {}
151
+ > extends CompositeLayer<
149
152
  ExtraPropsT & Required<_H3HexagonLayerProps<DataT> & Required<PolygonLayerProps<DataT>>>
150
153
  > {
151
154
  static defaultProps = defaultProps;
package/src/index.ts CHANGED
@@ -19,6 +19,7 @@
19
19
  // THE SOFTWARE.
20
20
  /* eslint-disable max-len */
21
21
 
22
+ export {WMSLayer as _WMSLayer} from './wms-layer/wms-layer';
22
23
  export {default as GreatCircleLayer} from './great-circle-layer/great-circle-layer';
23
24
  export {default as S2Layer} from './s2-layer/s2-layer';
24
25
  export {default as QuadkeyLayer} from './quadkey-layer/quadkey-layer';
@@ -34,6 +35,7 @@ export {default as GeohashLayer} from './geohash-layer/geohash-layer';
34
35
  export {default as _GeoCellLayer} from './geo-cell-layer/GeoCellLayer';
35
36
 
36
37
  // Types
38
+ export type {WMSLayerProps} from './wms-layer/wms-layer';
37
39
  export type {H3ClusterLayerProps} from './h3-layers/h3-cluster-layer';
38
40
  export type {H3HexagonLayerProps} from './h3-layers/h3-hexagon-layer';
39
41
  export type {GreatCircleLayerProps} from './great-circle-layer/great-circle-layer';
@@ -42,7 +42,7 @@ type _MeshLayerProps<DataT> = {
42
42
  featureIds?: NumericArray | null;
43
43
  };
44
44
 
45
- export default class MeshLayer<DataT = any, ExtraProps = {}> extends SimpleMeshLayer<
45
+ export default class MeshLayer<DataT = any, ExtraProps extends {} = {}> extends SimpleMeshLayer<
46
46
  DataT,
47
47
  Required<_MeshLayerProps<DataT>> & ExtraProps
48
48
  > {
@@ -93,10 +93,10 @@ export type _MVTLayerProps = {
93
93
  type ContentWGS84Cache = {_contentWGS84?: Feature[]};
94
94
 
95
95
  /** Render data formatted as [Mapbox Vector Tiles](https://docs.mapbox.com/vector-tiles/specification/). */
96
- export default class MVTLayer<DataT extends Feature = Feature, ExtraProps = {}> extends TileLayer<
97
- ParsedMvtTile,
98
- Required<_MVTLayerProps> & ExtraProps
99
- > {
96
+ export default class MVTLayer<
97
+ DataT extends Feature = Feature,
98
+ ExtraProps extends {} = {}
99
+ > extends TileLayer<ParsedMvtTile, Required<_MVTLayerProps> & ExtraProps> {
100
100
  static layerName = 'MVTLayer';
101
101
  static defaultProps = defaultProps;
102
102
 
@@ -20,7 +20,7 @@ type _QuadkeyLayerProps<DataT> = {
20
20
  };
21
21
 
22
22
  /** Render filled and/or stroked polygons based on the [Quadkey](https://towardsdatascience.com/geospatial-indexing-with-quadkeys-d933dff01496) geospatial indexing system. */
23
- export default class QuadkeyLayer<DataT = any, ExtraProps = {}> extends GeoCellLayer<
23
+ export default class QuadkeyLayer<DataT = any, ExtraProps extends {} = {}> extends GeoCellLayer<
24
24
  DataT,
25
25
  Required<_QuadkeyLayerProps<DataT>> & ExtraProps
26
26
  > {
@@ -40,7 +40,7 @@ type _S2LayerProps<DataT> = {
40
40
  };
41
41
 
42
42
  /** Render filled and/or stroked polygons based on the [S2](http://s2geometry.io/) geospatial indexing system. */
43
- export default class S2Layer<DataT = any, ExtraProps = {}> extends GeoCellLayer<
43
+ export default class S2Layer<DataT = any, ExtraProps extends {} = {}> extends GeoCellLayer<
44
44
  DataT,
45
45
  Required<_S2LayerProps<DataT>> & ExtraProps
46
46
  > {
@@ -36,7 +36,7 @@ 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
38
  import type {Bounds, GeoBoundingBox, TileBoundingBox, TileLoadProps, ZRange} from '../tileset-2d';
39
- import {Tile2DHeader, urlType, getURLFromTemplate} from '../tileset-2d';
39
+ import {Tile2DHeader, urlType, getURLFromTemplate, URLTemplate} from '../tileset-2d';
40
40
 
41
41
  const DUMMY_DATA = [1];
42
42
 
@@ -63,7 +63,7 @@ const defaultProps: DefaultProps<TerrainLayerProps> = {
63
63
  }
64
64
  },
65
65
  // Supply url to local terrain worker bundle. Only required if running offline and cannot access CDN.
66
- workerUrl: {type: 'string', value: null},
66
+ workerUrl: '',
67
67
  // Same as SimpleMeshLayer wireframe
68
68
  wireframe: false,
69
69
  material: true,
@@ -71,10 +71,8 @@ const defaultProps: DefaultProps<TerrainLayerProps> = {
71
71
  loaders: [TerrainWorkerLoader]
72
72
  };
73
73
 
74
- type URLTemplate = string | string[];
75
-
76
74
  // Turns array of templates into a single string to work around shallow change
77
- function urlTemplateToUpdateTrigger(template: URLTemplate | null): string {
75
+ function urlTemplateToUpdateTrigger(template: URLTemplate): string {
78
76
  if (Array.isArray(template)) {
79
77
  return template.join(';');
80
78
  }
@@ -103,7 +101,7 @@ type _TerrainLayerProps = {
103
101
  elevationData: URLTemplate;
104
102
 
105
103
  /** Image url to use as texture. **/
106
- texture?: URLTemplate | null;
104
+ texture?: URLTemplate;
107
105
 
108
106
  /** Martini error tolerance in meters, smaller number -> more detailed mesh. **/
109
107
  meshMaxError?: number;
@@ -122,10 +120,15 @@ type _TerrainLayerProps = {
122
120
 
123
121
  /** Material props for lighting effect. **/
124
122
  material?: Material;
123
+
124
+ /**
125
+ * @deprecated Use `loadOptions.terrain.workerUrl` instead
126
+ */
127
+ workerUrl?: string;
125
128
  };
126
129
 
127
130
  /** Render mesh surfaces from height map images. */
128
- export default class TerrainLayer<ExtraPropsT = {}> extends CompositeLayer<
131
+ export default class TerrainLayer<ExtraPropsT extends {} = {}> extends CompositeLayer<
129
132
  ExtraPropsT & Required<_TerrainLayerProps & Required<TileLayerProps<MeshAndTexture>>>
130
133
  > {
131
134
  static defaultProps = defaultProps;
@@ -76,10 +76,10 @@ type _Tile3DLayerProps<DataT> = {
76
76
  };
77
77
 
78
78
  /** 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) */
79
- export default class Tile3DLayer<DataT = any, ExtraPropsT = {}> extends CompositeLayer<
79
+ export default class Tile3DLayer<DataT = any, ExtraPropsT extends {} = {}> extends CompositeLayer<
80
80
  ExtraPropsT & Required<_Tile3DLayerProps<DataT>>
81
81
  > {
82
- static defaultProps = defaultProps as any;
82
+ static defaultProps = defaultProps;
83
83
  static layerName = 'Tile3DLayer';
84
84
 
85
85
  state!: {
@@ -148,14 +148,11 @@ export default class Tile3DLayer<DataT = any, ExtraPropsT = {}> extends Composit
148
148
  }
149
149
 
150
150
  getPickingInfo({info, sourceLayer}: GetPickingInfoParams) {
151
- const {layerMap} = this.state;
152
- const layerId = sourceLayer && sourceLayer.id;
153
- if (layerId) {
154
- // layerId: this.id-[scenegraph|pointcloud]-tileId
155
- const substr = layerId.substring(this.id.length + 1);
156
- const tileId = substr.substring(substr.indexOf('-') + 1);
157
- info.object = layerMap[tileId] && layerMap[tileId].tile;
151
+ const sourceTile = sourceLayer && (sourceLayer.props as any).tile;
152
+ if (info.picked) {
153
+ info.object = sourceTile;
158
154
  }
155
+ (info as any).sourceTile = sourceTile;
159
156
 
160
157
  return info;
161
158
  }
@@ -168,8 +165,10 @@ export default class Tile3DLayer<DataT = any, ExtraPropsT = {}> extends Composit
168
165
  }
169
166
 
170
167
  protected _updateAutoHighlight(info: PickingInfo): void {
171
- if (info.sourceLayer) {
172
- info.sourceLayer.updateAutoHighlight(info);
168
+ const sourceTile = (info as any).sourceTile;
169
+ const layerCache = this.state.layerMap[sourceTile?.id];
170
+ if (layerCache && layerCache.layer) {
171
+ layerCache.layer.updateAutoHighlight(info);
173
172
  }
174
173
  }
175
174
 
@@ -26,7 +26,7 @@ import {urlType, getURLFromTemplate} from '../tileset-2d';
26
26
  const defaultProps: DefaultProps<TileLayerProps> = {
27
27
  TilesetClass: Tileset2D,
28
28
  data: {type: 'data', value: []},
29
- dataComparator: urlType.equals,
29
+ dataComparator: urlType.equal,
30
30
  renderSubLayers: {type: 'function', value: props => new GeoJsonLayer(props), compare: false},
31
31
  getTileData: {type: 'function', optional: true, value: null, compare: false},
32
32
  // TODO - change to onViewportLoad to align with Tile3DLayer
@@ -146,10 +146,10 @@ export type TiledPickingInfo<DataT = any> = PickingInfo & {
146
146
  *
147
147
  * Instead of fetching the entire dataset, it only loads and renders what's visible in the current viewport.
148
148
  */
149
- export default class TileLayer<DataT = any, ExtraPropsT = {}> extends CompositeLayer<
149
+ export default class TileLayer<DataT = any, ExtraPropsT extends {} = {}> extends CompositeLayer<
150
150
  ExtraPropsT & Required<_TileLayerProps<DataT>>
151
151
  > {
152
- static defaultProps = defaultProps as any;
152
+ static defaultProps: DefaultProps = defaultProps;
153
153
  static layerName = 'TileLayer';
154
154
 
155
155
  initializeState() {
@@ -315,15 +315,20 @@ export default class TileLayer<DataT = any, ExtraPropsT = {}> extends CompositeL
315
315
  }
316
316
 
317
317
  getPickingInfo({info, sourceLayer}: GetPickingInfoParams): TiledPickingInfo<DataT> {
318
+ const sourceTile = (sourceLayer as any).props.tile;
318
319
  if (info.picked) {
319
- (info as any).tile = (sourceLayer as any).props.tile;
320
+ (info as any).tile = sourceTile;
320
321
  }
322
+ (info as any).sourceTile = sourceTile;
321
323
  return info;
322
324
  }
323
325
 
324
326
  protected _updateAutoHighlight(info: PickingInfo): void {
325
- if (info.sourceLayer) {
326
- info.sourceLayer.updateAutoHighlight(info);
327
+ const sourceTile = (info as any).sourceTile as Tile2DHeader;
328
+ if (sourceTile && sourceTile.layers) {
329
+ for (const layer of sourceTile.layers) {
330
+ layer.updateAutoHighlight(info);
331
+ }
327
332
  }
328
333
  }
329
334
 
@@ -14,6 +14,7 @@ export {Tileset2D, STRATEGY_DEFAULT} from './tileset-2d';
14
14
 
15
15
  export {Tile2DHeader} from './tile-2d-header';
16
16
 
17
+ export type {URLTemplate} from './utils';
17
18
  export {
18
19
  isGeoBoundingBox,
19
20
  isURLTemplate,
@@ -277,6 +277,7 @@ export class Tileset2D {
277
277
  return this._frameNumber;
278
278
  }
279
279
 
280
+ // eslint-disable-next-line complexity
280
281
  isTileVisible(
281
282
  tile: Tile2DHeader,
282
283
  cullRect?: {x: number; y: number; width: number; height: number}
@@ -6,14 +6,16 @@ import {Bounds, GeoBoundingBox, TileBoundingBox, TileIndex, ZRange} from './type
6
6
  const TILE_SIZE = 512;
7
7
  const DEFAULT_EXTENT: Bounds = [-Infinity, -Infinity, Infinity, Infinity];
8
8
 
9
+ export type URLTemplate = string | string[] | null;
10
+
9
11
  export const urlType = {
10
- type: 'url',
11
- value: null,
12
+ type: 'object' as const,
13
+ value: null as URLTemplate,
12
14
  validate: (value, propType) =>
13
15
  (propType.optional && value === null) ||
14
16
  typeof value === 'string' ||
15
17
  (Array.isArray(value) && value.every(url => typeof url === 'string')),
16
- equals: (value1, value2) => {
18
+ equal: (value1, value2) => {
17
19
  if (value1 === value2) {
18
20
  return true;
19
21
  }
@@ -62,7 +64,7 @@ function stringHash(s: string): number {
62
64
  }
63
65
 
64
66
  export function getURLFromTemplate(
65
- template: string | string[],
67
+ template: URLTemplate,
66
68
  tile: {
67
69
  index: TileIndex;
68
70
  id: string;
@@ -56,7 +56,7 @@ type _TripsLayerProps<DataT = any> = {
56
56
  };
57
57
 
58
58
  /** Render animated paths that represent vehicle trips. */
59
- export default class TripsLayer<DataT = any, ExtraProps = {}> extends PathLayer<
59
+ export default class TripsLayer<DataT = any, ExtraProps extends {} = {}> extends PathLayer<
60
60
  DataT,
61
61
  Required<_TripsLayerProps> & ExtraProps
62
62
  > {
@@ -0,0 +1,246 @@
1
+ // deck.gl, MIT license
2
+ // Attributions:
3
+ // Copyright 2022 Foursquare Labs, Inc.
4
+
5
+ /* eslint-disable camelcase */ // Some WMS parameters are not in camel case
6
+ /* global setTimeout, clearTimeout */
7
+
8
+ import {
9
+ Layer,
10
+ CompositeLayer,
11
+ CompositeLayerProps,
12
+ UpdateParameters,
13
+ DefaultProps,
14
+ Viewport,
15
+ COORDINATE_SYSTEM,
16
+ _deepEqual as deepEqual
17
+ } from '@deck.gl/core';
18
+ import {BitmapLayer} from '@deck.gl/layers';
19
+ import type {ImageSourceMetadata, ImageType, ImageServiceType} from '@loaders.gl/wms';
20
+ import {ImageSource, createImageSource} from '@loaders.gl/wms';
21
+ import {Proj4Projection} from '@math.gl/proj4';
22
+
23
+ /** All props supported by the TileLayer */
24
+ export type WMSLayerProps = CompositeLayerProps<any> & _WMSLayerProps;
25
+
26
+ /** Props added by the TileLayer */
27
+ type _WMSLayerProps = {
28
+ serviceType?: ImageServiceType | 'auto';
29
+ layers?: string[];
30
+ srs?: 'EPSG:4326' | 'EPSG:3857' | 'auto';
31
+ onMetadataLoad?: (metadata: ImageSourceMetadata) => void;
32
+ onMetadataLoadError?: (error: Error) => void;
33
+ onImageLoadStart?: (requestId: unknown) => void;
34
+ onImageLoad?: (requestId: unknown) => void;
35
+ onImageLoadError?: (requestId: unknown, error: Error) => void;
36
+ };
37
+
38
+ const defaultProps: DefaultProps<WMSLayerProps> = {
39
+ id: 'imagery-layer',
40
+ data: '',
41
+ serviceType: 'auto',
42
+ srs: 'auto',
43
+ layers: {type: 'array', compare: true, value: []},
44
+ onMetadataLoad: {type: 'function', compare: false, value: () => {}},
45
+ // eslint-disable-next-line
46
+ onMetadataLoadError: {type: 'function', compare: false, value: console.error},
47
+ onImageLoadStart: {type: 'function', compare: false, value: () => {}},
48
+ onImageLoad: {type: 'function', compare: false, value: () => {}},
49
+ onImageLoadError: {
50
+ type: 'function',
51
+ compare: false,
52
+ // eslint-disable-next-line
53
+ value: (requestId: unknown, error: Error) => console.error(error, requestId)
54
+ }
55
+ };
56
+
57
+ const projConverter = new Proj4Projection({from: 'EPSG:4326', to: 'EPSG:3857'});
58
+
59
+ /**
60
+ * The layer is used in Hex Tile layer in order to properly discard invisible elements during animation
61
+ */
62
+ export class WMSLayer<ExtraPropsT extends {} = {}> extends CompositeLayer<
63
+ ExtraPropsT & Required<_WMSLayerProps>
64
+ > {
65
+ static layerName = 'WMSLayer';
66
+ static defaultProps: DefaultProps = defaultProps;
67
+
68
+ state!: {
69
+ imageSource: ImageSource;
70
+ image: ImageType;
71
+ bounds: [number, number, number, number];
72
+ lastRequestParameters: {
73
+ bbox: [number, number, number, number];
74
+ layers: string[];
75
+ srs: 'EPSG:4326' | 'EPSG:3857';
76
+ width: number;
77
+ height: number;
78
+ };
79
+ lastRequestId: number;
80
+
81
+ _nextRequestId: number;
82
+ _timeoutId: any;
83
+ };
84
+
85
+ /** Lets deck.gl know that we want viewport change events */
86
+ override shouldUpdateState(): boolean {
87
+ return true;
88
+ }
89
+
90
+ override initializeState(): void {
91
+ // intentionally empty, initialization is done in updateState
92
+ this.state._nextRequestId = 0;
93
+ this.state.lastRequestId = -1;
94
+ }
95
+
96
+ override updateState({changeFlags, props, oldProps}: UpdateParameters<this>): void {
97
+ const {viewport} = this.context;
98
+
99
+ // Check if data source has changed
100
+ if (changeFlags.dataChanged || props.serviceType !== oldProps.serviceType) {
101
+ this.state.imageSource = this._createImageSource(props);
102
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
103
+ this._loadMetadata();
104
+ this.debounce(() => this.loadImage(viewport, 'image source changed'), 0);
105
+ } else if (!deepEqual(props.layers, oldProps.layers, 1)) {
106
+ this.debounce(() => this.loadImage(viewport, 'layers changed'), 0);
107
+ } else if (changeFlags.viewportChanged) {
108
+ this.debounce(() => this.loadImage(viewport, 'viewport changed'));
109
+ }
110
+ }
111
+
112
+ override finalizeState(): void {
113
+ // TODO - we could cancel outstanding requests
114
+ }
115
+
116
+ override renderLayers(): Layer {
117
+ // TODO - which bitmap layer is rendered should depend on the current viewport
118
+ // Currently Studio only uses one viewport
119
+ const {bounds, image, lastRequestParameters} = this.state;
120
+
121
+ return (
122
+ image &&
123
+ new BitmapLayer({
124
+ ...this.getSubLayerProps({id: 'bitmap'}),
125
+ _imageCoordinateSystem:
126
+ lastRequestParameters.srs === 'EPSG:4326'
127
+ ? COORDINATE_SYSTEM.LNGLAT
128
+ : COORDINATE_SYSTEM.CARTESIAN,
129
+ bounds,
130
+ image
131
+ })
132
+ );
133
+ }
134
+
135
+ async getFeatureInfoText(x: number, y: number): Promise<string | null> {
136
+ const {lastRequestParameters} = this.state;
137
+ if (lastRequestParameters) {
138
+ // @ts-expect-error Undocumented method
139
+ const featureInfo = await this.state.imageSource.getFeatureInfoText?.({
140
+ ...lastRequestParameters,
141
+ query_layers: lastRequestParameters.layers,
142
+ x,
143
+ y,
144
+ info_format: 'application/vnd.ogc.gml'
145
+ });
146
+ return featureInfo;
147
+ }
148
+ return '';
149
+ }
150
+
151
+ _createImageSource(props: WMSLayerProps): ImageSource {
152
+ if (props.data instanceof ImageSource) {
153
+ return props.data;
154
+ }
155
+
156
+ if (typeof props.data === 'string') {
157
+ return createImageSource({
158
+ url: props.data,
159
+ loadOptions: props.loadOptions,
160
+ type: props.serviceType
161
+ });
162
+ }
163
+
164
+ throw new Error('invalid image source in props.data');
165
+ }
166
+
167
+ /** Run a getMetadata on the image service */
168
+ async _loadMetadata(): Promise<void> {
169
+ const {imageSource} = this.state;
170
+ try {
171
+ const metadata = await imageSource.getMetadata();
172
+
173
+ // If a request takes a long time, it may no longer be expected
174
+ if (this.state.imageSource === imageSource) {
175
+ this.getCurrentLayer()?.props.onMetadataLoad(metadata);
176
+ }
177
+ } catch (error) {
178
+ this.getCurrentLayer()?.props.onMetadataLoadError(error as Error);
179
+ }
180
+ }
181
+
182
+ /** Load an image */
183
+ async loadImage(viewport: Viewport, reason: string): Promise<void> {
184
+ const {layers, serviceType} = this.props;
185
+
186
+ // TODO - move to ImageSource?
187
+ if (serviceType === 'wms' && layers.length === 0) {
188
+ return;
189
+ }
190
+
191
+ const bounds = viewport.getBounds();
192
+ const {width, height} = viewport;
193
+ const requestId = this.getRequestId();
194
+ let {srs} = this.props;
195
+ if (srs === 'auto') {
196
+ // BitmapLayer only supports LNGLAT or CARTESIAN (Web-Mercator)
197
+ srs = viewport.resolution ? 'EPSG:4326' : 'EPSG:3857';
198
+ }
199
+ const requestParams = {
200
+ width,
201
+ height,
202
+ bbox: bounds,
203
+ layers,
204
+ srs
205
+ };
206
+ if (srs === 'EPSG:3857') {
207
+ const [minX, minY] = projConverter.project([bounds[0], bounds[1]]);
208
+ const [maxX, maxY] = projConverter.project([bounds[2], bounds[3]]);
209
+ requestParams.bbox = [minX, minY, maxX, maxY];
210
+ }
211
+
212
+ try {
213
+ this.props.onImageLoadStart(requestId);
214
+
215
+ const image = await this.state.imageSource.getImage(requestParams);
216
+
217
+ // If a request takes a long time, later requests may have already loaded.
218
+ if (this.state.lastRequestId < requestId) {
219
+ this.getCurrentLayer()?.props.onImageLoad(requestId);
220
+ // Not type safe...
221
+ this.setState({
222
+ image,
223
+ bounds,
224
+ lastRequestParameters: requestParams,
225
+ lastRequestId: requestId
226
+ });
227
+ }
228
+ } catch (error) {
229
+ this.raiseError(error as Error, 'Load image');
230
+ this.getCurrentLayer()?.props.onImageLoadError(requestId, error as Error);
231
+ }
232
+ }
233
+
234
+ // HELPERS
235
+
236
+ /** Global counter for issuing unique request ids */
237
+ private getRequestId(): number {
238
+ return this.state._nextRequestId++;
239
+ }
240
+
241
+ /** Runs an action in the future, cancels it if the new action is issued before it executes */
242
+ private debounce(fn: Function, ms = 500): void {
243
+ clearTimeout(this.state._timeoutId);
244
+ this.state._timeoutId = setTimeout(() => fn(), ms);
245
+ }
246
+ }
@@ -2,9 +2,9 @@ import { CompositeLayer, CompositeLayerProps, Layer, LayersList, DefaultProps }
2
2
  import { PolygonLayerProps } from '@deck.gl/layers/typed';
3
3
  /** All properties supported by GeoCellLayer. */
4
4
  export declare type GeoCellLayerProps<DataT = any> = PolygonLayerProps<DataT> & CompositeLayerProps<DataT>;
5
- export default class GeoCellLayer<DataT = any, ExtraProps = {}> extends CompositeLayer<Required<GeoCellLayerProps<DataT>> & ExtraProps> {
5
+ export default class GeoCellLayer<DataT = any, ExtraProps extends {} = {}> extends CompositeLayer<Required<GeoCellLayerProps<DataT>> & ExtraProps> {
6
6
  static layerName: string;
7
- static defaultProps: DefaultProps<GeoCellLayerProps<any>>;
7
+ static defaultProps: DefaultProps;
8
8
  /** Implement to generate props to create geometry. */
9
9
  indexToBounds(): Partial<GeoCellLayer['props']> | null;
10
10
  renderLayers(): Layer | null | LayersList;
@@ -1 +1 @@
1
- {"version":3,"file":"GeoCellLayer.d.ts","sourceRoot":"","sources":["../../src/geo-cell-layer/GeoCellLayer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,EAAE,mBAAmB,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAC,MAAM,eAAe,CAAC;AACnG,OAAO,EAAe,iBAAiB,EAAC,MAAM,iBAAiB,CAAC;AAMhE,gDAAgD;AAChD,oBAAY,iBAAiB,CAAC,KAAK,GAAG,GAAG,IAAI,iBAAiB,CAAC,KAAK,CAAC,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;AAEnG,MAAM,CAAC,OAAO,OAAO,YAAY,CAAC,KAAK,GAAG,GAAG,EAAE,UAAU,GAAG,EAAE,CAAE,SAAQ,cAAc,CACpF,QAAQ,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,GAAG,UAAU,CAChD;IACC,MAAM,CAAC,SAAS,SAAkB;IAClC,MAAM,CAAC,YAAY,uCAAgB;IAEnC,sDAAsD;IACtD,aAAa,IAAI,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI;IAItD,YAAY,IAAI,KAAK,GAAG,IAAI,GAAG,UAAU;CA+D1C"}
1
+ {"version":3,"file":"GeoCellLayer.d.ts","sourceRoot":"","sources":["../../src/geo-cell-layer/GeoCellLayer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,EAAE,mBAAmB,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAC,MAAM,eAAe,CAAC;AACnG,OAAO,EAAe,iBAAiB,EAAC,MAAM,iBAAiB,CAAC;AAMhE,gDAAgD;AAChD,oBAAY,iBAAiB,CAAC,KAAK,GAAG,GAAG,IAAI,iBAAiB,CAAC,KAAK,CAAC,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;AAEnG,MAAM,CAAC,OAAO,OAAO,YAAY,CAAC,KAAK,GAAG,GAAG,EAAE,UAAU,SAAS,EAAE,GAAG,EAAE,CAAE,SAAQ,cAAc,CAC/F,QAAQ,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,GAAG,UAAU,CAChD;IACC,MAAM,CAAC,SAAS,SAAkB;IAClC,MAAM,CAAC,YAAY,EAAE,YAAY,CAAgB;IAEjD,sDAAsD;IACtD,aAAa,IAAI,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI;IAItD,YAAY,IAAI,KAAK,GAAG,IAAI,GAAG,UAAU;CA+D1C"}