@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.
- package/dist/dist.dev.js +12567 -4858
- package/dist/es5/geo-cell-layer/GeoCellLayer.js.map +1 -1
- package/dist/es5/geohash-layer/geohash-layer.js.map +1 -1
- package/dist/es5/great-circle-layer/great-circle-layer.js.map +1 -1
- package/dist/es5/h3-layers/h3-cluster-layer.js.map +1 -1
- package/dist/es5/h3-layers/h3-hexagon-layer.js.map +1 -1
- package/dist/es5/index.js +8 -0
- package/dist/es5/index.js.map +1 -1
- package/dist/es5/mesh-layer/mesh-layer.js.map +1 -1
- package/dist/es5/mvt-layer/mvt-layer.js.map +1 -1
- package/dist/es5/quadkey-layer/quadkey-layer.js.map +1 -1
- package/dist/es5/s2-layer/s2-layer.js.map +1 -1
- package/dist/es5/terrain-layer/terrain-layer.js +1 -4
- package/dist/es5/terrain-layer/terrain-layer.js.map +1 -1
- package/dist/es5/tile-3d-layer/tile-3d-layer.js +9 -8
- package/dist/es5/tile-3d-layer/tile-3d-layer.js.map +1 -1
- package/dist/es5/tile-layer/tile-layer.js +26 -4
- package/dist/es5/tile-layer/tile-layer.js.map +1 -1
- package/dist/es5/tileset-2d/index.js.map +1 -1
- package/dist/es5/tileset-2d/tileset-2d.js.map +1 -1
- package/dist/es5/tileset-2d/utils.js +2 -2
- package/dist/es5/tileset-2d/utils.js.map +1 -1
- package/dist/es5/trips-layer/trips-layer.js.map +1 -1
- package/dist/es5/wms-layer/wms-layer.js +377 -0
- package/dist/es5/wms-layer/wms-layer.js.map +1 -0
- package/dist/esm/geo-cell-layer/GeoCellLayer.js.map +1 -1
- package/dist/esm/geohash-layer/geohash-layer.js.map +1 -1
- package/dist/esm/great-circle-layer/great-circle-layer.js.map +1 -1
- package/dist/esm/h3-layers/h3-cluster-layer.js.map +1 -1
- package/dist/esm/h3-layers/h3-hexagon-layer.js.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/mesh-layer/mesh-layer.js.map +1 -1
- package/dist/esm/mvt-layer/mvt-layer.js.map +1 -1
- package/dist/esm/quadkey-layer/quadkey-layer.js.map +1 -1
- package/dist/esm/s2-layer/s2-layer.js.map +1 -1
- package/dist/esm/terrain-layer/terrain-layer.js +1 -4
- package/dist/esm/terrain-layer/terrain-layer.js.map +1 -1
- package/dist/esm/tile-3d-layer/tile-3d-layer.js +9 -10
- package/dist/esm/tile-3d-layer/tile-3d-layer.js.map +1 -1
- package/dist/esm/tile-layer/tile-layer.js +11 -4
- package/dist/esm/tile-layer/tile-layer.js.map +1 -1
- package/dist/esm/tileset-2d/index.js.map +1 -1
- package/dist/esm/tileset-2d/tileset-2d.js.map +1 -1
- package/dist/esm/tileset-2d/utils.js +2 -2
- package/dist/esm/tileset-2d/utils.js.map +1 -1
- package/dist/esm/trips-layer/trips-layer.js.map +1 -1
- package/dist/esm/wms-layer/wms-layer.js +232 -0
- package/dist/esm/wms-layer/wms-layer.js.map +1 -0
- package/dist.min.js +66 -54
- package/package.json +12 -10
- package/src/geo-cell-layer/GeoCellLayer.ts +2 -2
- package/src/geohash-layer/geohash-layer.ts +4 -4
- package/src/great-circle-layer/great-circle-layer.ts +2 -2
- package/src/h3-layers/h3-cluster-layer.ts +1 -1
- package/src/h3-layers/h3-hexagon-layer.ts +4 -1
- package/src/index.ts +2 -0
- package/src/mesh-layer/mesh-layer.ts +1 -1
- package/src/mvt-layer/mvt-layer.ts +4 -4
- package/src/quadkey-layer/quadkey-layer.ts +1 -1
- package/src/s2-layer/s2-layer.ts +1 -1
- package/src/terrain-layer/terrain-layer.ts +10 -7
- package/src/tile-3d-layer/tile-3d-layer.ts +10 -11
- package/src/tile-layer/tile-layer.ts +11 -6
- package/src/tileset-2d/index.ts +1 -0
- package/src/tileset-2d/tileset-2d.ts +1 -0
- package/src/tileset-2d/utils.ts +6 -4
- package/src/trips-layer/trips-layer.ts +1 -1
- package/src/wms-layer/wms-layer.ts +246 -0
- package/typed/geo-cell-layer/GeoCellLayer.d.ts +2 -2
- package/typed/geo-cell-layer/GeoCellLayer.d.ts.map +1 -1
- package/typed/geohash-layer/geohash-layer.d.ts +3 -3
- package/typed/geohash-layer/geohash-layer.d.ts.map +1 -1
- package/typed/great-circle-layer/great-circle-layer.d.ts +3 -2
- package/typed/great-circle-layer/great-circle-layer.d.ts.map +1 -1
- package/typed/h3-layers/h3-cluster-layer.d.ts +1 -1
- package/typed/h3-layers/h3-cluster-layer.d.ts.map +1 -1
- package/typed/h3-layers/h3-hexagon-layer.d.ts +1 -1
- package/typed/h3-layers/h3-hexagon-layer.d.ts.map +1 -1
- package/typed/imagery-layer/imagery-layer.d.ts +53 -0
- package/typed/imagery-layer/imagery-layer.d.ts.map +1 -0
- package/typed/index.d.ts +2 -0
- package/typed/index.d.ts.map +1 -1
- package/typed/mesh-layer/mesh-layer.d.ts +1 -1
- package/typed/mesh-layer/mesh-layer.d.ts.map +1 -1
- package/typed/mvt-layer/mvt-layer.d.ts +1 -1
- package/typed/mvt-layer/mvt-layer.d.ts.map +1 -1
- package/typed/quadkey-layer/quadkey-layer.d.ts +1 -1
- package/typed/quadkey-layer/quadkey-layer.d.ts.map +1 -1
- package/typed/s2-layer/s2-layer.d.ts +1 -1
- package/typed/s2-layer/s2-layer.d.ts.map +1 -1
- package/typed/terrain-layer/terrain-layer.d.ts +7 -4
- package/typed/terrain-layer/terrain-layer.d.ts.map +1 -1
- package/typed/tile-3d-layer/tile-3d-layer.d.ts +3 -3
- package/typed/tile-3d-layer/tile-3d-layer.d.ts.map +1 -1
- package/typed/tile-layer/tile-layer.d.ts +3 -3
- package/typed/tile-layer/tile-layer.d.ts.map +1 -1
- package/typed/tileset-2d/index.d.ts +1 -0
- package/typed/tileset-2d/index.d.ts.map +1 -1
- package/typed/tileset-2d/tileset-2d.d.ts.map +1 -1
- package/typed/tileset-2d/utils.d.ts +5 -4
- package/typed/tileset-2d/utils.d.ts.map +1 -1
- package/typed/trips-layer/trips-layer.d.ts +1 -1
- package/typed/trips-layer/trips-layer.d.ts.map +1 -1
- package/typed/wms-layer/wms-layer.d.ts +56 -0
- 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.
|
|
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.
|
|
34
|
-
"@loaders.gl/gis": "^3.3.
|
|
35
|
-
"@loaders.gl/loader-utils": "^3.3.
|
|
36
|
-
"@loaders.gl/mvt": "^3.3.
|
|
37
|
-
"@loaders.gl/schema": "^3.3.
|
|
38
|
-
"@loaders.gl/terrain": "^3.3.
|
|
39
|
-
"@loaders.gl/tiles": "^3.3.
|
|
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.
|
|
56
|
+
"@loaders.gl/core": "^3.3.0",
|
|
55
57
|
"@luma.gl/core": "^8.0.0"
|
|
56
58
|
},
|
|
57
|
-
"gitHead": "
|
|
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
|
|
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
|
|
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<
|
|
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<
|
|
97
|
-
|
|
98
|
-
|
|
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
|
> {
|
package/src/s2-layer/s2-layer.ts
CHANGED
|
@@ -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:
|
|
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
|
|
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
|
|
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
|
|
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
|
|
152
|
-
|
|
153
|
-
|
|
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
|
-
|
|
172
|
-
|
|
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.
|
|
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
|
|
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 =
|
|
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
|
-
|
|
326
|
-
|
|
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
|
|
package/src/tileset-2d/index.ts
CHANGED
package/src/tileset-2d/utils.ts
CHANGED
|
@@ -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: '
|
|
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
|
-
|
|
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:
|
|
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
|
|
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,
|
|
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"}
|