@deck.gl/geo-layers 8.8.0-alpha.2 → 8.8.0-alpha.5
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 +2286 -2542
- package/dist/es5/geo-cell-layer/GeoCellLayer.js +3 -3
- package/dist/es5/geo-cell-layer/GeoCellLayer.js.map +1 -1
- package/dist/es5/index.js +8 -0
- package/dist/es5/index.js.map +1 -1
- package/dist/es5/mvt-layer/coordinate-transform.js.map +1 -1
- package/dist/es5/mvt-layer/find-index-binary.js +7 -5
- package/dist/es5/mvt-layer/find-index-binary.js.map +1 -1
- package/dist/es5/mvt-layer/mvt-layer.js +45 -32
- package/dist/es5/mvt-layer/mvt-layer.js.map +1 -1
- package/dist/es5/quadkey-layer/quadkey-layer.js +4 -2
- package/dist/es5/quadkey-layer/quadkey-layer.js.map +1 -1
- package/dist/es5/quadkey-layer/quadkey-utils.js.map +1 -1
- package/dist/es5/tile-layer/tile-2d-header.js.map +1 -1
- package/dist/es5/tile-layer/tile-layer.js +21 -25
- package/dist/es5/tile-layer/tile-layer.js.map +1 -1
- package/dist/es5/tile-layer/tileset-2d.js +1 -6
- package/dist/es5/tile-layer/tileset-2d.js.map +1 -1
- package/dist/es5/tile-layer/utils.js +5 -0
- package/dist/es5/tile-layer/utils.js.map +1 -1
- package/dist/esm/geo-cell-layer/GeoCellLayer.js +6 -3
- package/dist/esm/geo-cell-layer/GeoCellLayer.js.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/mvt-layer/coordinate-transform.js.map +1 -1
- package/dist/esm/mvt-layer/find-index-binary.js +1 -1
- package/dist/esm/mvt-layer/find-index-binary.js.map +1 -1
- package/dist/esm/mvt-layer/mvt-layer.js +47 -36
- package/dist/esm/mvt-layer/mvt-layer.js.map +1 -1
- package/dist/esm/quadkey-layer/quadkey-layer.js +5 -2
- package/dist/esm/quadkey-layer/quadkey-layer.js.map +1 -1
- package/dist/esm/quadkey-layer/quadkey-utils.js.map +1 -1
- package/dist/esm/tile-layer/tile-2d-header.js.map +1 -1
- package/dist/esm/tile-layer/tile-layer.js +5 -10
- package/dist/esm/tile-layer/tile-layer.js.map +1 -1
- package/dist/esm/tile-layer/tileset-2d.js +1 -5
- package/dist/esm/tile-layer/tileset-2d.js.map +1 -1
- package/dist/esm/tile-layer/utils.js +3 -0
- package/dist/esm/tile-layer/utils.js.map +1 -1
- package/dist.min.js +2 -2
- package/package.json +6 -3
- package/src/geo-cell-layer/{GeoCellLayer.js → GeoCellLayer.ts} +14 -10
- package/src/index.ts +4 -1
- package/src/mvt-layer/{coordinate-transform.js → coordinate-transform.ts} +10 -8
- package/src/mvt-layer/{find-index-binary.js → find-index-binary.ts} +41 -10
- package/src/mvt-layer/{mvt-layer.js → mvt-layer.ts} +145 -59
- package/src/quadkey-layer/quadkey-layer.ts +39 -0
- package/src/quadkey-layer/{quadkey-utils.js → quadkey-utils.ts} +2 -2
- package/src/tile-layer/tile-2d-header.ts +15 -14
- package/src/tile-layer/tile-layer.ts +64 -62
- package/src/tile-layer/tileset-2d.ts +13 -13
- package/src/tile-layer/types.ts +5 -1
- package/src/tile-layer/utils.ts +17 -3
- package/src/quadkey-layer/quadkey-layer.js +0 -22
|
@@ -2,7 +2,7 @@ import {worldToLngLat} from '@math.gl/web-mercator';
|
|
|
2
2
|
|
|
3
3
|
const TILE_SIZE = 512;
|
|
4
4
|
|
|
5
|
-
export function quadkeyToWorldBounds(quadkey) {
|
|
5
|
+
export function quadkeyToWorldBounds(quadkey: string): [number[], number[]] {
|
|
6
6
|
let x = 0;
|
|
7
7
|
let y = 0;
|
|
8
8
|
let mask = 1 << quadkey.length;
|
|
@@ -20,7 +20,7 @@ export function quadkeyToWorldBounds(quadkey) {
|
|
|
20
20
|
];
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
-
export function getQuadkeyPolygon(quadkey) {
|
|
23
|
+
export function getQuadkeyPolygon(quadkey: string): number[] {
|
|
24
24
|
const [topLeft, bottomRight] = quadkeyToWorldBounds(quadkey);
|
|
25
25
|
const [w, n] = worldToLngLat(topLeft);
|
|
26
26
|
const [e, s] = worldToLngLat(bottomRight);
|
|
@@ -3,19 +3,20 @@ import {Layer, log} from '@deck.gl/core';
|
|
|
3
3
|
import {RequestScheduler} from '@loaders.gl/loader-utils';
|
|
4
4
|
import {TileBoundingBox, TileIndex, TileLoadProps} from './types';
|
|
5
5
|
|
|
6
|
-
export type TileLoadDataProps = {
|
|
6
|
+
export type TileLoadDataProps<DataT = any> = {
|
|
7
7
|
requestScheduler: RequestScheduler;
|
|
8
|
-
getData: (props: TileLoadProps) => Promise<
|
|
9
|
-
onLoad: (tile: Tile2DHeader) => void;
|
|
10
|
-
onError: (error: any, tile: Tile2DHeader) => void;
|
|
8
|
+
getData: (props: TileLoadProps) => Promise<DataT>;
|
|
9
|
+
onLoad: (tile: Tile2DHeader<DataT>) => void;
|
|
10
|
+
onError: (error: any, tile: Tile2DHeader<DataT>) => void;
|
|
11
11
|
};
|
|
12
|
-
|
|
12
|
+
|
|
13
|
+
export default class Tile2DHeader<DataT = any> {
|
|
13
14
|
index: TileIndex;
|
|
14
15
|
isVisible: boolean;
|
|
15
16
|
isSelected: boolean;
|
|
16
17
|
parent: Tile2DHeader | null;
|
|
17
18
|
children: Tile2DHeader[] | null;
|
|
18
|
-
content:
|
|
19
|
+
content: DataT | null;
|
|
19
20
|
state?: number;
|
|
20
21
|
layers?: Layer[] | null;
|
|
21
22
|
|
|
@@ -48,24 +49,24 @@ export default class Tile2DHeader {
|
|
|
48
49
|
this._needsReload = false;
|
|
49
50
|
}
|
|
50
51
|
|
|
51
|
-
get data() {
|
|
52
|
+
get data(): Promise<DataT | null> | DataT | null {
|
|
52
53
|
return this.isLoading && this._loader ? this._loader.then(() => this.data) : this.content;
|
|
53
54
|
}
|
|
54
55
|
|
|
55
|
-
get isLoaded() {
|
|
56
|
+
get isLoaded(): boolean {
|
|
56
57
|
return this._isLoaded && !this._needsReload;
|
|
57
58
|
}
|
|
58
59
|
|
|
59
|
-
get isLoading() {
|
|
60
|
+
get isLoading(): boolean {
|
|
60
61
|
return Boolean(this._loader) && !this._isCancelled;
|
|
61
62
|
}
|
|
62
63
|
|
|
63
|
-
get needsReload() {
|
|
64
|
+
get needsReload(): boolean {
|
|
64
65
|
return this._needsReload || this._isCancelled;
|
|
65
66
|
}
|
|
66
67
|
|
|
67
|
-
get byteLength() {
|
|
68
|
-
const result = this.content ? this.content.byteLength : 0;
|
|
68
|
+
get byteLength(): number {
|
|
69
|
+
const result = this.content ? (this.content as any).byteLength : 0;
|
|
69
70
|
if (!Number.isFinite(result)) {
|
|
70
71
|
log.error('byteLength not defined in tile data')();
|
|
71
72
|
}
|
|
@@ -78,7 +79,7 @@ export default class Tile2DHeader {
|
|
|
78
79
|
requestScheduler,
|
|
79
80
|
onLoad,
|
|
80
81
|
onError
|
|
81
|
-
}: TileLoadDataProps): Promise<void> {
|
|
82
|
+
}: TileLoadDataProps<DataT>): Promise<void> {
|
|
82
83
|
const {index, id, bbox, userData, zoom} = this;
|
|
83
84
|
const loaderId = this._loaderId;
|
|
84
85
|
|
|
@@ -100,7 +101,7 @@ export default class Tile2DHeader {
|
|
|
100
101
|
return;
|
|
101
102
|
}
|
|
102
103
|
|
|
103
|
-
let tileData = null;
|
|
104
|
+
let tileData: DataT | null = null;
|
|
104
105
|
let error;
|
|
105
106
|
try {
|
|
106
107
|
tileData = await getData({index, id, bbox, userData, zoom, signal});
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
|
-
assert,
|
|
3
|
-
ChangeFlags,
|
|
4
2
|
CompositeLayer,
|
|
5
3
|
CompositeLayerProps,
|
|
6
4
|
Layer,
|
|
7
5
|
LayerProps,
|
|
6
|
+
UpdateParameters,
|
|
7
|
+
PickingInfo,
|
|
8
|
+
GetPickingInfoParams,
|
|
8
9
|
_flatten as flatten
|
|
9
10
|
} from '@deck.gl/core';
|
|
10
11
|
import {GeoJsonLayer} from '@deck.gl/layers';
|
|
@@ -39,73 +40,85 @@ const defaultProps = {
|
|
|
39
40
|
zoomOffset: 0
|
|
40
41
|
};
|
|
41
42
|
|
|
42
|
-
|
|
43
|
+
/** All props supported by the TileLayer */
|
|
44
|
+
export type TileLayerProps<DataT = any> = _TileLayerProps<DataT> & CompositeLayerProps<DataT>;
|
|
45
|
+
|
|
46
|
+
/** Props added by the TileLayer */
|
|
47
|
+
type _TileLayerProps<DataT> = {
|
|
48
|
+
/**
|
|
49
|
+
* Optionally implement a custom indexing scheme.
|
|
50
|
+
*/
|
|
51
|
+
TilesetClass: typeof Tileset2D;
|
|
43
52
|
/**
|
|
44
53
|
* Renders one or an array of Layer instances.
|
|
45
54
|
*/
|
|
46
|
-
renderSubLayers
|
|
47
|
-
props: TileLayerProps & {
|
|
55
|
+
renderSubLayers?: (
|
|
56
|
+
props: TileLayerProps<DataT> & {
|
|
48
57
|
id: string;
|
|
49
|
-
data:
|
|
58
|
+
data: DataT;
|
|
50
59
|
_offset: number;
|
|
51
|
-
tile: Tile2DHeader
|
|
60
|
+
tile: Tile2DHeader<DataT>;
|
|
52
61
|
}
|
|
53
62
|
) => LayersList;
|
|
54
63
|
/**
|
|
55
64
|
* If supplied, `getTileData` is called to retrieve the data of each tile.
|
|
56
65
|
*/
|
|
57
|
-
getTileData
|
|
66
|
+
getTileData?: (props: TileLoadProps) => Promise<DataT> | DataT;
|
|
58
67
|
|
|
59
68
|
/** Called when all tiles in the current viewport are loaded. */
|
|
60
|
-
onViewportLoad?: (tiles: Tile2DHeader[]) => void;
|
|
69
|
+
onViewportLoad?: (tiles: Tile2DHeader<DataT>[]) => void;
|
|
61
70
|
|
|
62
71
|
/** Called when a tile successfully loads. */
|
|
63
|
-
onTileLoad
|
|
72
|
+
onTileLoad?: (tile: Tile2DHeader<DataT>) => void;
|
|
64
73
|
|
|
65
74
|
/** Called when a tile is cleared from cache. */
|
|
66
|
-
onTileUnload
|
|
75
|
+
onTileUnload?: (tile: Tile2DHeader<DataT>) => void;
|
|
67
76
|
|
|
68
77
|
/** Called when a tile failed to load. */
|
|
69
|
-
onTileError
|
|
78
|
+
onTileError?: (err: any) => void;
|
|
70
79
|
|
|
71
80
|
/** The bounding box of the layer's data. */
|
|
72
|
-
extent
|
|
81
|
+
extent?: number[] | null;
|
|
73
82
|
|
|
74
83
|
/** The pixel dimension of the tiles, usually a power of 2. */
|
|
75
|
-
tileSize
|
|
84
|
+
tileSize?: number;
|
|
76
85
|
|
|
77
|
-
/** The max zoom level of the layer's data.
|
|
78
|
-
|
|
86
|
+
/** The max zoom level of the layer's data.
|
|
87
|
+
* @default null
|
|
88
|
+
*/
|
|
89
|
+
maxZoom?: number | null;
|
|
79
90
|
|
|
80
|
-
/** The min zoom level of the layer's data.
|
|
81
|
-
|
|
91
|
+
/** The min zoom level of the layer's data.
|
|
92
|
+
* @default 0
|
|
93
|
+
*/
|
|
94
|
+
minZoom?: number | null;
|
|
82
95
|
|
|
83
96
|
/** The maximum number of tiles that can be cached. */
|
|
84
|
-
maxCacheSize
|
|
97
|
+
maxCacheSize?: number | null;
|
|
85
98
|
|
|
86
99
|
/**
|
|
87
100
|
* The maximum memory used for caching tiles.
|
|
88
101
|
*
|
|
89
102
|
* @default null
|
|
90
103
|
*/
|
|
91
|
-
maxCacheByteSize
|
|
104
|
+
maxCacheByteSize?: number | null;
|
|
92
105
|
|
|
93
106
|
/**
|
|
94
107
|
* How the tile layer refines the visibility of tiles.
|
|
95
108
|
*
|
|
96
109
|
* @default 'best-available'
|
|
97
110
|
*/
|
|
98
|
-
refinementStrategy
|
|
111
|
+
refinementStrategy?: RefinementStrategy;
|
|
99
112
|
|
|
100
113
|
/** Range of minimum and maximum heights in the tile. */
|
|
101
|
-
zRange
|
|
114
|
+
zRange?: ZRange | null;
|
|
102
115
|
|
|
103
116
|
/**
|
|
104
117
|
* The maximum number of concurrent getTileData calls.
|
|
105
118
|
*
|
|
106
119
|
* @default 6
|
|
107
120
|
*/
|
|
108
|
-
maxRequests
|
|
121
|
+
maxRequests?: number;
|
|
109
122
|
|
|
110
123
|
/**
|
|
111
124
|
* This offset changes the zoom level at which the tiles are fetched.
|
|
@@ -114,7 +127,11 @@ export type TileLayerProps<DataT = any> = CompositeLayerProps<DataT> & {
|
|
|
114
127
|
*
|
|
115
128
|
* @default 0
|
|
116
129
|
*/
|
|
117
|
-
zoomOffset
|
|
130
|
+
zoomOffset?: number;
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
export type TiledPickingInfo<DataT = any> = PickingInfo & {
|
|
134
|
+
tile?: Tile2DHeader<DataT>;
|
|
118
135
|
};
|
|
119
136
|
|
|
120
137
|
/**
|
|
@@ -122,10 +139,9 @@ export type TileLayerProps<DataT = any> = CompositeLayerProps<DataT> & {
|
|
|
122
139
|
*
|
|
123
140
|
* Instead of fetching the entire dataset, it only loads and renders what's visible in the current viewport.
|
|
124
141
|
*/
|
|
125
|
-
export default class TileLayer<
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
> extends CompositeLayer<PropsT> {
|
|
142
|
+
export default class TileLayer<DataT = any, ExtraPropsT = {}> extends CompositeLayer<
|
|
143
|
+
ExtraPropsT & Required<_TileLayerProps<DataT>>
|
|
144
|
+
> {
|
|
129
145
|
static defaultProps = defaultProps as any;
|
|
130
146
|
static layerName = 'TileLayer';
|
|
131
147
|
|
|
@@ -150,17 +166,7 @@ export default class TileLayer<
|
|
|
150
166
|
return changeFlags.somethingChanged;
|
|
151
167
|
}
|
|
152
168
|
|
|
153
|
-
updateState({
|
|
154
|
-
props,
|
|
155
|
-
changeFlags
|
|
156
|
-
}: {
|
|
157
|
-
props: TileLayerProps;
|
|
158
|
-
oldProps: TileLayerProps;
|
|
159
|
-
context: any;
|
|
160
|
-
changeFlags: ChangeFlags;
|
|
161
|
-
}) {
|
|
162
|
-
assert(this.state);
|
|
163
|
-
|
|
169
|
+
updateState({changeFlags}: UpdateParameters<this>) {
|
|
164
170
|
let {tileset} = this.state;
|
|
165
171
|
const propsChanged = changeFlags.propsOrDataChanged || changeFlags.updateTriggersChanged;
|
|
166
172
|
const dataChanged =
|
|
@@ -169,10 +175,10 @@ export default class TileLayer<
|
|
|
169
175
|
(changeFlags.updateTriggersChanged.all || changeFlags.updateTriggersChanged.getTileData));
|
|
170
176
|
|
|
171
177
|
if (!tileset) {
|
|
172
|
-
tileset = new this.props.TilesetClass(this._getTilesetOptions(
|
|
178
|
+
tileset = new this.props.TilesetClass(this._getTilesetOptions());
|
|
173
179
|
this.setState({tileset});
|
|
174
180
|
} else if (propsChanged) {
|
|
175
|
-
tileset.setOptions(this._getTilesetOptions(
|
|
181
|
+
tileset.setOptions(this._getTilesetOptions());
|
|
176
182
|
|
|
177
183
|
if (dataChanged) {
|
|
178
184
|
// reload all tiles
|
|
@@ -189,7 +195,7 @@ export default class TileLayer<
|
|
|
189
195
|
this._updateTileset();
|
|
190
196
|
}
|
|
191
197
|
|
|
192
|
-
_getTilesetOptions(
|
|
198
|
+
_getTilesetOptions(): Tileset2DProps {
|
|
193
199
|
const {
|
|
194
200
|
tileSize,
|
|
195
201
|
maxCacheSize,
|
|
@@ -200,7 +206,7 @@ export default class TileLayer<
|
|
|
200
206
|
minZoom,
|
|
201
207
|
maxRequests,
|
|
202
208
|
zoomOffset
|
|
203
|
-
} = props;
|
|
209
|
+
} = this.props;
|
|
204
210
|
|
|
205
211
|
return {
|
|
206
212
|
maxCacheSize,
|
|
@@ -220,8 +226,7 @@ export default class TileLayer<
|
|
|
220
226
|
};
|
|
221
227
|
}
|
|
222
228
|
|
|
223
|
-
_updateTileset(): void {
|
|
224
|
-
assert(this.state && this.context);
|
|
229
|
+
private _updateTileset(): void {
|
|
225
230
|
const {tileset} = this.state;
|
|
226
231
|
const {zRange, modelMatrix} = this.props;
|
|
227
232
|
const frameNumber = tileset.update(this.context.viewport, {zRange, modelMatrix});
|
|
@@ -243,8 +248,6 @@ export default class TileLayer<
|
|
|
243
248
|
}
|
|
244
249
|
|
|
245
250
|
_onViewportLoad(): void {
|
|
246
|
-
assert(this.state);
|
|
247
|
-
|
|
248
251
|
const {tileset} = this.state;
|
|
249
252
|
const {onViewportLoad} = this.props;
|
|
250
253
|
|
|
@@ -253,27 +256,27 @@ export default class TileLayer<
|
|
|
253
256
|
}
|
|
254
257
|
}
|
|
255
258
|
|
|
256
|
-
_onTileLoad(tile: Tile2DHeader): void {
|
|
259
|
+
_onTileLoad(tile: Tile2DHeader<DataT>): void {
|
|
257
260
|
this.props.onTileLoad(tile);
|
|
258
261
|
tile.layers = null;
|
|
259
262
|
|
|
260
263
|
this.setNeedsUpdate();
|
|
261
264
|
}
|
|
262
265
|
|
|
263
|
-
_onTileError(error: any, tile: Tile2DHeader) {
|
|
266
|
+
_onTileError(error: any, tile: Tile2DHeader<DataT>) {
|
|
264
267
|
this.props.onTileError(error);
|
|
265
268
|
tile.layers = null;
|
|
266
269
|
|
|
267
270
|
this.setNeedsUpdate();
|
|
268
271
|
}
|
|
269
272
|
|
|
270
|
-
_onTileUnload(tile: Tile2DHeader) {
|
|
273
|
+
_onTileUnload(tile: Tile2DHeader<DataT>) {
|
|
271
274
|
this.props.onTileUnload(tile);
|
|
272
275
|
}
|
|
273
276
|
|
|
274
277
|
// Methods for subclass to override
|
|
275
278
|
|
|
276
|
-
getTileData(tile: TileLoadProps) {
|
|
279
|
+
getTileData(tile: TileLoadProps): Promise<DataT> | DataT | null {
|
|
277
280
|
const {data, getTileData, fetch} = this.props;
|
|
278
281
|
const {signal} = tile;
|
|
279
282
|
|
|
@@ -290,33 +293,32 @@ export default class TileLayer<
|
|
|
290
293
|
}
|
|
291
294
|
|
|
292
295
|
renderSubLayers(
|
|
293
|
-
props:
|
|
296
|
+
props: TileLayer['props'] & {
|
|
294
297
|
id: string;
|
|
295
|
-
data:
|
|
298
|
+
data: DataT;
|
|
296
299
|
_offset: number;
|
|
297
|
-
tile: Tile2DHeader
|
|
300
|
+
tile: Tile2DHeader<DataT>;
|
|
298
301
|
}
|
|
299
|
-
): LayersList {
|
|
302
|
+
): Layer | null | LayersList {
|
|
300
303
|
return this.props.renderSubLayers(props);
|
|
301
304
|
}
|
|
302
305
|
|
|
303
|
-
getSubLayerPropsByTile(tile: Tile2DHeader): LayerProps | null {
|
|
306
|
+
getSubLayerPropsByTile(tile: Tile2DHeader): Partial<LayerProps> | null {
|
|
304
307
|
return null;
|
|
305
308
|
}
|
|
306
309
|
|
|
307
|
-
getPickingInfo({info, sourceLayer}) {
|
|
308
|
-
info.tile = sourceLayer.props.tile;
|
|
310
|
+
getPickingInfo({info, sourceLayer}: GetPickingInfoParams): TiledPickingInfo<DataT> {
|
|
311
|
+
(info as any).tile = (sourceLayer as any).props.tile;
|
|
309
312
|
return info;
|
|
310
313
|
}
|
|
311
314
|
|
|
312
|
-
_updateAutoHighlight(info) {
|
|
315
|
+
protected _updateAutoHighlight(info: PickingInfo): void {
|
|
313
316
|
if (info.sourceLayer) {
|
|
314
317
|
info.sourceLayer.updateAutoHighlight(info);
|
|
315
318
|
}
|
|
316
319
|
}
|
|
317
320
|
|
|
318
|
-
renderLayers(): Layer
|
|
319
|
-
assert(this.state);
|
|
321
|
+
renderLayers(): Layer | null | LayersList {
|
|
320
322
|
return this.state.tileset.tiles.map((tile: Tile2DHeader) => {
|
|
321
323
|
const subLayerProps = this.getSubLayerPropsByTile(tile);
|
|
322
324
|
// cache the rendered layer in the tile
|
|
@@ -330,7 +332,7 @@ export default class TileLayer<
|
|
|
330
332
|
_offset: 0,
|
|
331
333
|
tile
|
|
332
334
|
});
|
|
333
|
-
tile.layers = flatten(layers, Boolean).map(layer =>
|
|
335
|
+
tile.layers = (flatten(layers, Boolean) as Layer[]).map(layer =>
|
|
334
336
|
layer.clone({
|
|
335
337
|
tile,
|
|
336
338
|
...subLayerProps
|
|
@@ -2,7 +2,7 @@ import Tile2DHeader from './tile-2d-header';
|
|
|
2
2
|
import {getTileIndices, tileToBoundingBox} from './utils';
|
|
3
3
|
import {RequestScheduler} from '@loaders.gl/loader-utils';
|
|
4
4
|
import {Matrix4} from '@math.gl/core';
|
|
5
|
-
import {
|
|
5
|
+
import {Viewport} from '@deck.gl/core';
|
|
6
6
|
import {Bounds, TileIndex, ZRange} from './types';
|
|
7
7
|
import {TileLayerProps} from './tile-layer';
|
|
8
8
|
|
|
@@ -48,7 +48,7 @@ const STRATEGIES = {
|
|
|
48
48
|
};
|
|
49
49
|
|
|
50
50
|
export type Tileset2DProps = Pick<
|
|
51
|
-
TileLayerProps
|
|
51
|
+
Required<TileLayerProps>,
|
|
52
52
|
| 'getTileData'
|
|
53
53
|
| 'tileSize'
|
|
54
54
|
| 'maxCacheSize'
|
|
@@ -145,10 +145,10 @@ export default class Tileset2D {
|
|
|
145
145
|
setOptions(opts: Tileset2DProps): void {
|
|
146
146
|
Object.assign(this.opts, opts);
|
|
147
147
|
if (Number.isFinite(opts.maxZoom)) {
|
|
148
|
-
this._maxZoom = Math.floor(opts.maxZoom);
|
|
148
|
+
this._maxZoom = Math.floor(opts.maxZoom as number);
|
|
149
149
|
}
|
|
150
150
|
if (Number.isFinite(opts.minZoom)) {
|
|
151
|
-
this._minZoom = Math.ceil(opts.minZoom);
|
|
151
|
+
this._minZoom = Math.ceil(opts.minZoom as number);
|
|
152
152
|
}
|
|
153
153
|
}
|
|
154
154
|
|
|
@@ -206,7 +206,7 @@ export default class Tileset2D {
|
|
|
206
206
|
}
|
|
207
207
|
// Check for needed reloads explicitly even if the view/matrix has not changed.
|
|
208
208
|
} else if (this.needsReload) {
|
|
209
|
-
this._selectedTiles = this._selectedTiles!.map(tile => this._getTile(tile.index));
|
|
209
|
+
this._selectedTiles = this._selectedTiles!.map(tile => this._getTile(tile.index, true));
|
|
210
210
|
}
|
|
211
211
|
|
|
212
212
|
// Update tile states
|
|
@@ -271,8 +271,8 @@ export default class Tileset2D {
|
|
|
271
271
|
|
|
272
272
|
/** Returns additional metadata to add to tile, bbox by default */
|
|
273
273
|
getTileMetadata(index: TileIndex) {
|
|
274
|
-
assert(this._viewport);
|
|
275
274
|
const {tileSize} = this.opts;
|
|
275
|
+
// @ts-expect-error
|
|
276
276
|
return {bbox: tileToBoundingBox(this._viewport, index.x, index.y, index.z, tileSize)};
|
|
277
277
|
}
|
|
278
278
|
|
|
@@ -285,8 +285,7 @@ export default class Tileset2D {
|
|
|
285
285
|
}
|
|
286
286
|
|
|
287
287
|
// Returns true if any tile's visibility changed
|
|
288
|
-
updateTileStates() {
|
|
289
|
-
assert(this._selectedTiles);
|
|
288
|
+
private updateTileStates() {
|
|
290
289
|
const refinementStrategy = this.opts.refinementStrategy || STRATEGY_DEFAULT;
|
|
291
290
|
|
|
292
291
|
const visibilities = new Array(this._cache.size);
|
|
@@ -298,6 +297,7 @@ export default class Tileset2D {
|
|
|
298
297
|
tile.isSelected = false;
|
|
299
298
|
tile.isVisible = false;
|
|
300
299
|
}
|
|
300
|
+
// @ts-expect-error called only when _selectedTiles is already defined
|
|
301
301
|
for (const tile of this._selectedTiles) {
|
|
302
302
|
tile.isSelected = true;
|
|
303
303
|
tile.isVisible = true;
|
|
@@ -370,12 +370,12 @@ export default class Tileset2D {
|
|
|
370
370
|
* Clear tiles that are not visible when the cache is full
|
|
371
371
|
*/
|
|
372
372
|
/* eslint-disable complexity */
|
|
373
|
-
_resizeCache() {
|
|
374
|
-
assert(this.selectedTiles);
|
|
373
|
+
private _resizeCache() {
|
|
375
374
|
const {_cache, opts} = this;
|
|
376
375
|
|
|
377
376
|
const maxCacheSize =
|
|
378
377
|
opts.maxCacheSize ||
|
|
378
|
+
// @ts-expect-error called only when selectedTiles is initialized
|
|
379
379
|
(opts.maxCacheByteSize ? Infinity : DEFAULT_CACHE_SCALE * this.selectedTiles.length);
|
|
380
380
|
const maxCacheByteSize = opts.maxCacheByteSize || Infinity;
|
|
381
381
|
|
|
@@ -405,9 +405,9 @@ export default class Tileset2D {
|
|
|
405
405
|
}
|
|
406
406
|
/* eslint-enable complexity */
|
|
407
407
|
|
|
408
|
-
_getTile(index: TileIndex, create: true): Tile2DHeader;
|
|
409
|
-
_getTile(index: TileIndex, create?: false): Tile2DHeader | undefined;
|
|
410
|
-
_getTile(index: TileIndex, create?: boolean): Tile2DHeader | undefined {
|
|
408
|
+
private _getTile(index: TileIndex, create: true): Tile2DHeader;
|
|
409
|
+
private _getTile(index: TileIndex, create?: false): Tile2DHeader | undefined;
|
|
410
|
+
private _getTile(index: TileIndex, create?: boolean): Tile2DHeader | undefined {
|
|
411
411
|
const id = this.getTileId(index);
|
|
412
412
|
let tile = this._cache.get(id);
|
|
413
413
|
let needsReload = false;
|
package/src/tile-layer/types.ts
CHANGED
|
@@ -2,9 +2,11 @@ export type ZRange = [minZ: number, maxZ: number];
|
|
|
2
2
|
|
|
3
3
|
export type Bounds = [minX: number, minY: number, maxX: number, maxY: number];
|
|
4
4
|
|
|
5
|
+
export type GeoBoundingBox = {west: number; north: number; east: number; south: number};
|
|
6
|
+
|
|
5
7
|
export type TileBoundingBox =
|
|
6
8
|
| {left: number; top: number; right: number; bottom: number}
|
|
7
|
-
|
|
|
9
|
+
| GeoBoundingBox;
|
|
8
10
|
|
|
9
11
|
export type TileIndex = {x: number; y: number; z: number};
|
|
10
12
|
|
|
@@ -14,4 +16,6 @@ export type TileLoadProps = {
|
|
|
14
16
|
bbox: TileBoundingBox;
|
|
15
17
|
url?: string | null;
|
|
16
18
|
signal?: AbortSignal;
|
|
19
|
+
userData?: Record<string, any>;
|
|
20
|
+
zoom?: number;
|
|
17
21
|
};
|
package/src/tile-layer/utils.ts
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import {Viewport} from '@deck.gl/core';
|
|
2
2
|
import {Matrix4} from '@math.gl/core';
|
|
3
|
-
import Tile2DHeader from './tile-2d-header';
|
|
4
3
|
import {getOSMTileIndices} from './tile-2d-traversal';
|
|
5
|
-
import {Bounds, TileBoundingBox, TileIndex, ZRange} from './types';
|
|
4
|
+
import {Bounds, GeoBoundingBox, TileBoundingBox, TileIndex, ZRange} from './types';
|
|
6
5
|
|
|
7
6
|
const TILE_SIZE = 512;
|
|
8
7
|
const DEFAULT_EXTENT: Bounds = [-Infinity, -Infinity, Infinity, Infinity];
|
|
@@ -62,7 +61,13 @@ function stringHash(s: string): number {
|
|
|
62
61
|
return Math.abs(s.split('').reduce((a, b) => ((a << 5) - a + b.charCodeAt(0)) | 0, 0));
|
|
63
62
|
}
|
|
64
63
|
|
|
65
|
-
export function getURLFromTemplate(
|
|
64
|
+
export function getURLFromTemplate(
|
|
65
|
+
template: string | string[],
|
|
66
|
+
tile: {
|
|
67
|
+
index: TileIndex;
|
|
68
|
+
id: string;
|
|
69
|
+
}
|
|
70
|
+
): string | null {
|
|
66
71
|
if (!template || !template.length) {
|
|
67
72
|
return null;
|
|
68
73
|
}
|
|
@@ -250,3 +255,12 @@ export function getTileIndices({
|
|
|
250
255
|
export function isURLTemplate(s: string): boolean {
|
|
251
256
|
return /(?=.*{z})(?=.*{x})(?=.*({y}|{-y}))/.test(s);
|
|
252
257
|
}
|
|
258
|
+
|
|
259
|
+
export function isGeoBoundingBox(v: any): v is GeoBoundingBox {
|
|
260
|
+
return (
|
|
261
|
+
Number.isFinite(v.west) &&
|
|
262
|
+
Number.isFinite(v.north) &&
|
|
263
|
+
Number.isFinite(v.east) &&
|
|
264
|
+
Number.isFinite(v.south)
|
|
265
|
+
);
|
|
266
|
+
}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import GeoCellLayer from '../geo-cell-layer/GeoCellLayer';
|
|
2
|
-
import {getQuadkeyPolygon} from './quadkey-utils';
|
|
3
|
-
|
|
4
|
-
const defaultProps = {
|
|
5
|
-
getQuadkey: {type: 'accessor', value: d => d.quadkey}
|
|
6
|
-
};
|
|
7
|
-
|
|
8
|
-
export default class QuadkeyLayer extends GeoCellLayer {
|
|
9
|
-
indexToBounds() {
|
|
10
|
-
const {data, getQuadkey} = this.props;
|
|
11
|
-
|
|
12
|
-
return {
|
|
13
|
-
data,
|
|
14
|
-
_normalize: false,
|
|
15
|
-
positionFormat: 'XY',
|
|
16
|
-
getPolygon: (x, objectInfo) => getQuadkeyPolygon(getQuadkey(x, objectInfo))
|
|
17
|
-
};
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
QuadkeyLayer.layerName = 'QuadkeyLayer';
|
|
22
|
-
QuadkeyLayer.defaultProps = defaultProps;
|