@deck.gl/geo-layers 9.4.0-alpha.2 → 9.4.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/dist/dist.dev.js +6375 -5029
  2. package/dist/geo-cell-layer/GeoCellLayer.d.ts.map +1 -1
  3. package/dist/geo-cell-layer/GeoCellLayer.js +2 -1
  4. package/dist/geo-cell-layer/GeoCellLayer.js.map +1 -1
  5. package/dist/index.cjs +21181 -1889
  6. package/dist/index.cjs.map +3 -4
  7. package/dist/mesh-layer/mesh-layer-uniforms.d.ts +1 -0
  8. package/dist/mesh-layer/mesh-layer-uniforms.d.ts.map +1 -1
  9. package/dist/mesh-layer/mesh-layer-uniforms.js +8 -0
  10. package/dist/mesh-layer/mesh-layer-uniforms.js.map +1 -1
  11. package/dist/mesh-layer/mesh-layer.d.ts.map +1 -1
  12. package/dist/mesh-layer/mesh-layer.js +15 -6
  13. package/dist/mesh-layer/mesh-layer.js.map +1 -1
  14. package/dist/mesh-layer/mesh-layer.wgsl.d.ts +3 -0
  15. package/dist/mesh-layer/mesh-layer.wgsl.d.ts.map +1 -0
  16. package/dist/mesh-layer/mesh-layer.wgsl.js +130 -0
  17. package/dist/mesh-layer/mesh-layer.wgsl.js.map +1 -0
  18. package/dist/mesh-layer/mesh-pbr-material.d.ts +252 -0
  19. package/dist/mesh-layer/mesh-pbr-material.d.ts.map +1 -0
  20. package/dist/mesh-layer/mesh-pbr-material.js +27 -0
  21. package/dist/mesh-layer/mesh-pbr-material.js.map +1 -0
  22. package/dist/trips-layer/trips-layer-uniforms.d.ts +1 -0
  23. package/dist/trips-layer/trips-layer-uniforms.d.ts.map +1 -1
  24. package/dist/trips-layer/trips-layer-uniforms.js +14 -3
  25. package/dist/trips-layer/trips-layer-uniforms.js.map +1 -1
  26. package/dist/trips-layer/trips-layer.d.ts +6 -1
  27. package/dist/trips-layer/trips-layer.d.ts.map +1 -1
  28. package/dist/trips-layer/trips-layer.js +57 -24
  29. package/dist/trips-layer/trips-layer.js.map +1 -1
  30. package/dist/trips-layer/trips-layer.wgsl.d.ts +11 -0
  31. package/dist/trips-layer/trips-layer.wgsl.d.ts.map +1 -0
  32. package/dist/trips-layer/trips-layer.wgsl.js +48 -0
  33. package/dist/trips-layer/trips-layer.wgsl.js.map +1 -0
  34. package/dist.min.js +1415 -149
  35. package/dist.webgl-only/a5-layer/a5-layer.js +30 -0
  36. package/dist.webgl-only/a5-layer/a5-layer.js.map +1 -0
  37. package/dist.webgl-only/geo-cell-layer/GeoCellLayer.js +57 -0
  38. package/dist.webgl-only/geo-cell-layer/GeoCellLayer.js.map +1 -0
  39. package/dist.webgl-only/geohash-layer/geohash-layer.js +24 -0
  40. package/dist.webgl-only/geohash-layer/geohash-layer.js.map +1 -0
  41. package/dist.webgl-only/geohash-layer/geohash-utils.js +54 -0
  42. package/dist.webgl-only/geohash-layer/geohash-utils.js.map +1 -0
  43. package/dist.webgl-only/great-circle-layer/great-circle-layer.js +17 -0
  44. package/dist.webgl-only/great-circle-layer/great-circle-layer.js.map +1 -0
  45. package/dist.webgl-only/h3-layers/h3-cluster-layer.js +52 -0
  46. package/dist.webgl-only/h3-layers/h3-cluster-layer.js.map +1 -0
  47. package/dist.webgl-only/h3-layers/h3-hexagon-layer.js +209 -0
  48. package/dist.webgl-only/h3-layers/h3-hexagon-layer.js.map +1 -0
  49. package/dist.webgl-only/h3-layers/h3-utils.js +60 -0
  50. package/dist.webgl-only/h3-layers/h3-utils.js.map +1 -0
  51. package/dist.webgl-only/index.cjs +22542 -0
  52. package/dist.webgl-only/index.cjs.map +6 -0
  53. package/dist.webgl-only/index.js +22 -0
  54. package/dist.webgl-only/index.js.map +1 -0
  55. package/dist.webgl-only/mesh-layer/mesh-layer-fragment.glsl.js +34 -0
  56. package/dist.webgl-only/mesh-layer/mesh-layer-fragment.glsl.js.map +1 -0
  57. package/dist.webgl-only/mesh-layer/mesh-layer-uniforms.js +19 -0
  58. package/dist.webgl-only/mesh-layer/mesh-layer-uniforms.js.map +1 -0
  59. package/dist.webgl-only/mesh-layer/mesh-layer-vertex.glsl.js +64 -0
  60. package/dist.webgl-only/mesh-layer/mesh-layer-vertex.glsl.js.map +1 -0
  61. package/dist.webgl-only/mesh-layer/mesh-layer.js +149 -0
  62. package/dist.webgl-only/mesh-layer/mesh-layer.js.map +1 -0
  63. package/dist.webgl-only/mesh-layer/mesh-layer.wgsl.js +5 -0
  64. package/dist.webgl-only/mesh-layer/mesh-layer.wgsl.js.map +1 -0
  65. package/dist.webgl-only/mesh-layer/mesh-pbr-material.js +27 -0
  66. package/dist.webgl-only/mesh-layer/mesh-pbr-material.js.map +1 -0
  67. package/dist.webgl-only/mvt-layer/coordinate-transform.js +45 -0
  68. package/dist.webgl-only/mvt-layer/coordinate-transform.js.map +1 -0
  69. package/dist.webgl-only/mvt-layer/find-index-binary.js +100 -0
  70. package/dist.webgl-only/mvt-layer/find-index-binary.js.map +1 -0
  71. package/dist.webgl-only/mvt-layer/mvt-layer.js +315 -0
  72. package/dist.webgl-only/mvt-layer/mvt-layer.js.map +1 -0
  73. package/dist.webgl-only/quadkey-layer/quadkey-layer.js +27 -0
  74. package/dist.webgl-only/quadkey-layer/quadkey-layer.js.map +1 -0
  75. package/dist.webgl-only/quadkey-layer/quadkey-utils.js +30 -0
  76. package/dist.webgl-only/quadkey-layer/quadkey-utils.js.map +1 -0
  77. package/dist.webgl-only/s2-layer/s2-geometry.js +127 -0
  78. package/dist.webgl-only/s2-layer/s2-geometry.js.map +1 -0
  79. package/dist.webgl-only/s2-layer/s2-layer.js +24 -0
  80. package/dist.webgl-only/s2-layer/s2-layer.js.map +1 -0
  81. package/dist.webgl-only/s2-layer/s2-utils.js +91 -0
  82. package/dist.webgl-only/s2-layer/s2-utils.js.map +1 -0
  83. package/dist.webgl-only/terrain-layer/terrain-layer.js +260 -0
  84. package/dist.webgl-only/terrain-layer/terrain-layer.js.map +1 -0
  85. package/dist.webgl-only/tile-3d-layer/tile-3d-layer.js +343 -0
  86. package/dist.webgl-only/tile-3d-layer/tile-3d-layer.js.map +1 -0
  87. package/dist.webgl-only/tile-layer/tile-layer.js +233 -0
  88. package/dist.webgl-only/tile-layer/tile-layer.js.map +1 -0
  89. package/dist.webgl-only/tileset-2d/index.js +7 -0
  90. package/dist.webgl-only/tileset-2d/index.js.map +1 -0
  91. package/dist.webgl-only/tileset-2d/memoize.js +45 -0
  92. package/dist.webgl-only/tileset-2d/memoize.js.map +1 -0
  93. package/dist.webgl-only/tileset-2d/tile-2d-header.js +141 -0
  94. package/dist.webgl-only/tileset-2d/tile-2d-header.js.map +1 -0
  95. package/dist.webgl-only/tileset-2d/tile-2d-traversal.js +208 -0
  96. package/dist.webgl-only/tileset-2d/tile-2d-traversal.js.map +1 -0
  97. package/dist.webgl-only/tileset-2d/tileset-2d.js +557 -0
  98. package/dist.webgl-only/tileset-2d/tileset-2d.js.map +1 -0
  99. package/dist.webgl-only/tileset-2d/types.js +5 -0
  100. package/dist.webgl-only/tileset-2d/types.js.map +1 -0
  101. package/dist.webgl-only/tileset-2d/utils.js +246 -0
  102. package/dist.webgl-only/tileset-2d/utils.js.map +1 -0
  103. package/dist.webgl-only/trips-layer/trips-layer-uniforms.js +23 -0
  104. package/dist.webgl-only/trips-layer/trips-layer-uniforms.js.map +1 -0
  105. package/dist.webgl-only/trips-layer/trips-layer.js +97 -0
  106. package/dist.webgl-only/trips-layer/trips-layer.js.map +1 -0
  107. package/dist.webgl-only/trips-layer/trips-layer.wgsl.js +3 -0
  108. package/dist.webgl-only/trips-layer/trips-layer.wgsl.js.map +1 -0
  109. package/dist.webgl-only/wms-layer/utils.js +17 -0
  110. package/dist.webgl-only/wms-layer/utils.js.map +1 -0
  111. package/dist.webgl-only/wms-layer/wms-layer.js +198 -0
  112. package/dist.webgl-only/wms-layer/wms-layer.js.map +1 -0
  113. package/package.json +11 -6
  114. package/src/geo-cell-layer/GeoCellLayer.ts +2 -0
  115. package/src/mesh-layer/mesh-layer-uniforms.ts +9 -0
  116. package/src/mesh-layer/mesh-layer.ts +15 -6
  117. package/src/mesh-layer/mesh-layer.wgsl.ts +130 -0
  118. package/src/mesh-layer/mesh-pbr-material.ts +39 -0
  119. package/src/trips-layer/trips-layer-uniforms.ts +15 -3
  120. package/src/trips-layer/trips-layer.ts +84 -38
  121. package/src/trips-layer/trips-layer.wgsl.ts +63 -0
@@ -0,0 +1,233 @@
1
+ // deck.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+ import { CompositeLayer, _flatten as flatten } from '@deck.gl/core';
5
+ import { GeoJsonLayer } from '@deck.gl/layers';
6
+ import { Tileset2D, STRATEGY_DEFAULT } from "../tileset-2d/index.js";
7
+ import { urlType, getURLFromTemplate } from "../tileset-2d/index.js";
8
+ import { Matrix4 } from '@math.gl/core';
9
+ const defaultProps = {
10
+ TilesetClass: Tileset2D,
11
+ data: { type: 'data', value: [] },
12
+ dataComparator: urlType.equal,
13
+ renderSubLayers: { type: 'function', value: (props) => new GeoJsonLayer(props) },
14
+ getTileData: { type: 'function', optional: true, value: null },
15
+ // TODO - change to onViewportLoad to align with Tile3DLayer
16
+ onViewportLoad: { type: 'function', optional: true, value: null },
17
+ onTileLoad: { type: 'function', value: tile => { } },
18
+ onTileUnload: { type: 'function', value: tile => { } },
19
+ // eslint-disable-next-line
20
+ onTileError: { type: 'function', value: err => console.error(err) },
21
+ extent: { type: 'array', optional: true, value: null, compare: true },
22
+ tileSize: 512,
23
+ maxZoom: null,
24
+ minZoom: 0,
25
+ maxCacheSize: null,
26
+ maxCacheByteSize: null,
27
+ refinementStrategy: STRATEGY_DEFAULT,
28
+ zRange: null,
29
+ maxRequests: 6,
30
+ debounceTime: 0,
31
+ zoomOffset: 0,
32
+ visibleMinZoom: null,
33
+ visibleMaxZoom: null
34
+ };
35
+ /**
36
+ * The TileLayer is a composite layer that makes it possible to visualize very large datasets.
37
+ *
38
+ * Instead of fetching the entire dataset, it only loads and renders what's visible in the current viewport.
39
+ */
40
+ class TileLayer extends CompositeLayer {
41
+ initializeState() {
42
+ this.state = {
43
+ tileset: null,
44
+ isLoaded: false
45
+ };
46
+ }
47
+ finalizeState() {
48
+ this.state?.tileset?.finalize();
49
+ }
50
+ get isLoaded() {
51
+ return Boolean(this.state?.tileset?.selectedTiles?.every(tile =>
52
+ // Error / empty tiles resolve to `content === null`. Once Tile2DHeader marks those
53
+ // requests as loaded, do not wait for generated sublayers because there is nothing to
54
+ // render for that tile and `tile.layers` will remain null.
55
+ tile.isLoaded &&
56
+ (!tile.content || !tile.layers || tile.layers.every(layer => layer.isLoaded))));
57
+ }
58
+ shouldUpdateState({ changeFlags }) {
59
+ return changeFlags.somethingChanged;
60
+ }
61
+ updateState({ changeFlags }) {
62
+ let { tileset } = this.state;
63
+ const propsChanged = changeFlags.propsOrDataChanged || changeFlags.updateTriggersChanged;
64
+ const dataChanged = changeFlags.dataChanged ||
65
+ (changeFlags.updateTriggersChanged &&
66
+ (changeFlags.updateTriggersChanged.all || changeFlags.updateTriggersChanged.getTileData));
67
+ if (!tileset) {
68
+ tileset = new this.props.TilesetClass(this._getTilesetOptions());
69
+ this.setState({ tileset });
70
+ }
71
+ else if (propsChanged) {
72
+ tileset.setOptions(this._getTilesetOptions());
73
+ if (dataChanged) {
74
+ // reload all tiles
75
+ // use cached layers until new content is loaded
76
+ tileset.reloadAll();
77
+ }
78
+ else {
79
+ // some render options changed, regenerate sub layers now
80
+ tileset.tiles.forEach(tile => {
81
+ tile.layers = null;
82
+ });
83
+ }
84
+ }
85
+ this._updateTileset();
86
+ }
87
+ _getTilesetOptions() {
88
+ const { tileSize, maxCacheSize, maxCacheByteSize, refinementStrategy, extent, maxZoom, minZoom, maxRequests, debounceTime, zoomOffset, visibleMinZoom, visibleMaxZoom } = this.props;
89
+ return {
90
+ maxCacheSize,
91
+ maxCacheByteSize,
92
+ maxZoom,
93
+ minZoom,
94
+ tileSize,
95
+ refinementStrategy,
96
+ extent,
97
+ maxRequests,
98
+ debounceTime,
99
+ zoomOffset,
100
+ visibleMinZoom,
101
+ visibleMaxZoom,
102
+ getTileData: this.getTileData.bind(this),
103
+ onTileLoad: this._onTileLoad.bind(this),
104
+ onTileError: this._onTileError.bind(this),
105
+ onTileUnload: this._onTileUnload.bind(this)
106
+ };
107
+ }
108
+ _updateTileset() {
109
+ const tileset = this.state.tileset;
110
+ const { zRange, modelMatrix } = this.props;
111
+ const frameNumber = tileset.update(this.context.viewport, { zRange, modelMatrix });
112
+ const { isLoaded } = tileset;
113
+ const loadingStateChanged = this.state.isLoaded !== isLoaded;
114
+ const tilesetChanged = this.state.frameNumber !== frameNumber;
115
+ if (isLoaded && (loadingStateChanged || tilesetChanged)) {
116
+ this._onViewportLoad();
117
+ }
118
+ if (tilesetChanged) {
119
+ // Save the tileset frame number - trigger a rerender
120
+ this.setState({ frameNumber });
121
+ }
122
+ // Save the loaded state - should not trigger a rerender
123
+ this.state.isLoaded = isLoaded;
124
+ }
125
+ _onViewportLoad() {
126
+ const { tileset } = this.state;
127
+ const { onViewportLoad } = this.props;
128
+ if (onViewportLoad) {
129
+ // This method can only be called when tileset is defined and updated
130
+ onViewportLoad(tileset.selectedTiles);
131
+ }
132
+ }
133
+ _onTileLoad(tile) {
134
+ this.props.onTileLoad(tile);
135
+ tile.layers = null;
136
+ this.setNeedsUpdate();
137
+ }
138
+ _onTileError(error, tile) {
139
+ this.props.onTileError(error);
140
+ tile.layers = null;
141
+ this.setNeedsUpdate();
142
+ }
143
+ _onTileUnload(tile) {
144
+ this.props.onTileUnload(tile);
145
+ }
146
+ // Methods for subclass to override
147
+ getTileData(tile) {
148
+ const { data, getTileData, fetch } = this.props;
149
+ const { signal } = tile;
150
+ tile.url =
151
+ typeof data === 'string' || Array.isArray(data) ? getURLFromTemplate(data, tile) : null;
152
+ if (getTileData) {
153
+ return getTileData(tile);
154
+ }
155
+ if (fetch && tile.url) {
156
+ return fetch(tile.url, { propName: 'data', layer: this, signal });
157
+ }
158
+ return null;
159
+ }
160
+ renderSubLayers(props) {
161
+ return this.props.renderSubLayers(props);
162
+ }
163
+ getSubLayerPropsByTile(tile) {
164
+ return null;
165
+ }
166
+ getPickingInfo(params) {
167
+ // TileLayer does not directly render anything, sourceLayer cannot be null
168
+ const sourceLayer = params.sourceLayer;
169
+ const sourceTile = sourceLayer.props.tile;
170
+ const info = params.info;
171
+ if (info.picked) {
172
+ info.tile = sourceTile;
173
+ }
174
+ info.sourceTile = sourceTile;
175
+ info.sourceTileSubLayer = sourceLayer;
176
+ return info;
177
+ }
178
+ _updateAutoHighlight(info) {
179
+ info.sourceTileSubLayer.updateAutoHighlight(info);
180
+ }
181
+ renderLayers() {
182
+ const { visibleMinZoom, visibleMaxZoom, minZoom, extent } = this.props;
183
+ const zoom = this.context.viewport.zoom;
184
+ const hidden = (visibleMinZoom != null && zoom < visibleMinZoom) ||
185
+ (visibleMaxZoom != null && zoom > visibleMaxZoom) ||
186
+ (minZoom != null && !extent && zoom < minZoom);
187
+ if (hidden) {
188
+ // Clear cached sublayer references so they are recreated when visible again
189
+ for (const tile of this.state.tileset.tiles) {
190
+ tile.layers = null;
191
+ }
192
+ return [];
193
+ }
194
+ return this.state.tileset.tiles.map((tile) => {
195
+ const subLayerProps = this.getSubLayerPropsByTile(tile);
196
+ // cache the rendered layer in the tile
197
+ if (!tile.isLoaded && !tile.content) {
198
+ // nothing to show
199
+ }
200
+ else if (!tile.layers) {
201
+ const layers = this.renderSubLayers({
202
+ ...this.props,
203
+ ...this.getSubLayerProps({
204
+ id: tile.id,
205
+ updateTriggers: this.props.updateTriggers
206
+ }),
207
+ data: tile.content,
208
+ _offset: 0,
209
+ tile
210
+ });
211
+ tile.layers = flatten(layers, Boolean).map(layer => layer.clone({
212
+ tile,
213
+ ...subLayerProps
214
+ }));
215
+ }
216
+ else if (subLayerProps &&
217
+ tile.layers[0] &&
218
+ Object.keys(subLayerProps).some(propName => tile.layers[0].props[propName] !== subLayerProps[propName])) {
219
+ tile.layers = tile.layers.map(layer => layer.clone(subLayerProps));
220
+ }
221
+ return tile.layers;
222
+ });
223
+ }
224
+ filterSubLayer({ layer, cullRect }) {
225
+ const { tile } = layer.props;
226
+ const { modelMatrix } = this.props;
227
+ return this.state.tileset.isTileVisible(tile, cullRect, modelMatrix ? new Matrix4(modelMatrix) : null);
228
+ }
229
+ }
230
+ TileLayer.defaultProps = defaultProps;
231
+ TileLayer.layerName = 'TileLayer';
232
+ export default TileLayer;
233
+ //# sourceMappingURL=tile-layer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tile-layer.js","sourceRoot":"","sources":["../../src/tile-layer/tile-layer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ // deck.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+ export { Tileset2D, STRATEGY_DEFAULT } from "./tileset-2d.js";
5
+ export { Tile2DHeader } from "./tile-2d-header.js";
6
+ export { isGeoBoundingBox, isURLTemplate, urlType, getURLFromTemplate, getTileIndices, tileToBoundingBox } from "./utils.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tileset-2d/index.ts"],"names":[],"mappings":"AAAA,UAAU;AACV,+BAA+B;AAC/B,oCAAoC;AAcpC,OAAO,EAAC,SAAS,EAAE,gBAAgB,EAAC,wBAAqB;AAEzD,OAAO,EAAC,YAAY,EAAC,4BAAyB;AAG9C,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,OAAO,EACP,kBAAkB,EAClB,cAAc,EACd,iBAAiB,EAClB,mBAAgB"}
@@ -0,0 +1,45 @@
1
+ // deck.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+ // deck.gl, MIT license
5
+ // @note - this is a duplicate of the deck.gl core export (because Tileset2D should be deck.gl independent)
6
+ /**
7
+ * Speed up consecutive function calls by caching the result of calls with identical input
8
+ * https://en.wikipedia.org/wiki/Memoization
9
+ * @param compute - the function to be memoized
10
+ */
11
+ export function memoize(compute) {
12
+ let cachedArgs = {};
13
+ let cachedResult;
14
+ return (args) => {
15
+ for (const key in args) {
16
+ if (!isEqual(args[key], cachedArgs[key])) {
17
+ cachedResult = compute(args);
18
+ cachedArgs = args;
19
+ break;
20
+ }
21
+ }
22
+ return cachedResult;
23
+ };
24
+ }
25
+ function isEqual(a, b) {
26
+ if (a === b) {
27
+ return true;
28
+ }
29
+ if (Array.isArray(a)) {
30
+ // Special treatment for arrays: compare 1-level deep
31
+ // This is to support equality of matrix/coordinate props
32
+ const len = a.length;
33
+ if (!b || b.length !== len) {
34
+ return false;
35
+ }
36
+ for (let i = 0; i < len; i++) {
37
+ if (a[i] !== b[i]) {
38
+ return false;
39
+ }
40
+ }
41
+ return true;
42
+ }
43
+ return false;
44
+ }
45
+ //# sourceMappingURL=memoize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memoize.js","sourceRoot":"","sources":["../../src/tileset-2d/memoize.ts"],"names":[],"mappings":"AAAA,UAAU;AACV,+BAA+B;AAC/B,oCAAoC;AAEpC,uBAAuB;AACvB,2GAA2G;AAE3G;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAU,OAA0B;IACzD,IAAI,UAAU,GAAQ,EAAE,CAAC;IACzB,IAAI,YAAiB,CAAC;IAEtB,OAAO,CAAC,IAAQ,EAAE,EAAE;QAClB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;gBACzC,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;gBAC7B,UAAU,GAAG,IAAI,CAAC;gBAClB,MAAM;YACR,CAAC;QACH,CAAC;QACD,OAAO,YAAY,CAAC;IACtB,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,OAAO,CAAC,CAAC,EAAE,CAAC;IACnB,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACrB,qDAAqD;QACrD,yDAAyD;QACzD,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC;QACrB,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC3B,OAAO,KAAK,CAAC;QACf,CAAC;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7B,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClB,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,141 @@
1
+ // deck.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+ export class Tile2DHeader {
5
+ constructor(index) {
6
+ this.index = index;
7
+ this.isVisible = false;
8
+ this.isSelected = false;
9
+ this.parent = null;
10
+ this.children = [];
11
+ this.content = null;
12
+ this._loader = undefined;
13
+ this._abortController = null;
14
+ this._loaderId = 0;
15
+ this._isLoaded = false;
16
+ this._isCancelled = false;
17
+ this._needsReload = false;
18
+ }
19
+ /** @deprecated use `boundingBox` instead */
20
+ get bbox() {
21
+ return this._bbox;
22
+ }
23
+ // TODO - remove in v9
24
+ set bbox(value) {
25
+ // Only set once from `Tileset2D.getTileMetadata`
26
+ if (this._bbox)
27
+ return;
28
+ this._bbox = value;
29
+ if ('west' in value) {
30
+ this.boundingBox = [
31
+ [value.west, value.south],
32
+ [value.east, value.north]
33
+ ];
34
+ }
35
+ else {
36
+ this.boundingBox = [
37
+ [value.left, value.top],
38
+ [value.right, value.bottom]
39
+ ];
40
+ }
41
+ }
42
+ get data() {
43
+ return this.isLoading && this._loader ? this._loader.then(() => this.data) : this.content;
44
+ }
45
+ get isLoaded() {
46
+ return this._isLoaded && !this._needsReload;
47
+ }
48
+ get isLoading() {
49
+ return Boolean(this._loader) && !this._isCancelled;
50
+ }
51
+ get needsReload() {
52
+ return this._needsReload || this._isCancelled;
53
+ }
54
+ get byteLength() {
55
+ const result = this.content ? this.content.byteLength : 0;
56
+ if (!Number.isFinite(result)) {
57
+ // eslint-disable-next-line no-console
58
+ console.error('byteLength not defined in tile data');
59
+ }
60
+ return result;
61
+ }
62
+ /* eslint-disable max-statements */
63
+ async _loadData({ getData, getRequestPriority, requestScheduler, onLoad, onError }) {
64
+ const { index, id, bbox, userData, zoom } = this;
65
+ const loaderId = this._loaderId;
66
+ this._abortController = new AbortController();
67
+ const { signal } = this._abortController;
68
+ // @ts-expect-error (2345) loaders.gl's RequestScheduler callback type is too narrow.
69
+ const requestToken = await requestScheduler.scheduleRequest(this, getRequestPriority);
70
+ if (!requestToken) {
71
+ this._isCancelled = true;
72
+ return;
73
+ }
74
+ // A tile can be cancelled while being scheduled
75
+ if (this._isCancelled) {
76
+ requestToken.done();
77
+ return;
78
+ }
79
+ let tileData = null;
80
+ let error;
81
+ try {
82
+ tileData = await getData({ index, id, bbox, userData, zoom, signal });
83
+ }
84
+ catch (err) {
85
+ error = err || true;
86
+ }
87
+ finally {
88
+ requestToken.done();
89
+ }
90
+ // If loadData has been called with a newer version, discard the result from this operation
91
+ if (loaderId !== this._loaderId) {
92
+ return;
93
+ }
94
+ // Clear the `isLoading` flag
95
+ this._loader = undefined;
96
+ // Rewrite tile content with the result of getTileData if successful, or `null` in case of
97
+ // error or cancellation. A `null` tile is still a terminal result for the request: the tile
98
+ // should stop blocking viewport loading even if the source returned 404 / empty content.
99
+ this.content = tileData;
100
+ // If cancelled, do not invoke the callbacks
101
+ // Consider it loaded if we tried to cancel but `getTileData` still returned data
102
+ if (this._isCancelled && !tileData) {
103
+ this._isLoaded = false;
104
+ return;
105
+ }
106
+ // Errors are reported via onError below, but the request itself has completed. Mark the tile
107
+ // as loaded so higher-level layers can treat expected missing tiles as settled instead of
108
+ // waiting forever for content or sublayers that will never exist.
109
+ this._isLoaded = true;
110
+ this._isCancelled = false;
111
+ if (error) {
112
+ onError(error, this);
113
+ }
114
+ else {
115
+ onLoad(this);
116
+ }
117
+ }
118
+ loadData(opts) {
119
+ this._isLoaded = false;
120
+ this._isCancelled = false;
121
+ this._needsReload = false;
122
+ this._loaderId++;
123
+ this._loader = this._loadData(opts);
124
+ return this._loader;
125
+ }
126
+ setNeedsReload() {
127
+ if (this.isLoading) {
128
+ this.abort();
129
+ this._loader = undefined;
130
+ }
131
+ this._needsReload = true;
132
+ }
133
+ abort() {
134
+ if (this.isLoaded) {
135
+ return;
136
+ }
137
+ this._isCancelled = true;
138
+ this._abortController?.abort();
139
+ }
140
+ }
141
+ //# sourceMappingURL=tile-2d-header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tile-2d-header.js","sourceRoot":"","sources":["../../src/tileset-2d/tile-2d-header.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,208 @@
1
+ // deck.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+ import { WebMercatorViewport, _GlobeViewport } from '@deck.gl/core';
5
+ import { CullingVolume, Plane, AxisAlignedBoundingBox, makeOrientedBoundingBoxFromPoints } from '@math.gl/culling';
6
+ import { lngLatToWorld } from '@math.gl/web-mercator';
7
+ import { osmTile2lngLat } from "./utils.js";
8
+ const TILE_SIZE = 512;
9
+ // number of world copies to check
10
+ const MAX_MAPS = 3;
11
+ // for calculating bounding volume of a tile in a non-web-mercator viewport
12
+ const REF_POINTS_5 = [
13
+ [0.5, 0.5],
14
+ [0, 0],
15
+ [0, 1],
16
+ [1, 0],
17
+ [1, 1]
18
+ ]; // 4 corners and center
19
+ const REF_POINTS_9 = REF_POINTS_5.concat([
20
+ [0, 0.5],
21
+ [0.5, 0],
22
+ [1, 0.5],
23
+ [0.5, 1]
24
+ ]); // 4 corners, center and 4 mid points
25
+ const REF_POINTS_11 = REF_POINTS_9.concat([
26
+ [0.25, 0.5],
27
+ [0.75, 0.5]
28
+ ]); // 2 additional points on equator for top tile
29
+ class OSMNode {
30
+ constructor(x, y, z) {
31
+ this.x = x;
32
+ this.y = y;
33
+ this.z = z;
34
+ }
35
+ get children() {
36
+ if (!this._children) {
37
+ const x = this.x * 2;
38
+ const y = this.y * 2;
39
+ const z = this.z + 1;
40
+ this._children = [
41
+ new OSMNode(x, y, z),
42
+ new OSMNode(x, y + 1, z),
43
+ new OSMNode(x + 1, y, z),
44
+ new OSMNode(x + 1, y + 1, z)
45
+ ];
46
+ }
47
+ return this._children;
48
+ }
49
+ // eslint-disable-next-line complexity
50
+ update(params) {
51
+ const { viewport, cullingVolume, elevationBounds, minZ, maxZ, bounds, offset, project } = params;
52
+ const boundingVolume = this.getBoundingVolume(elevationBounds, offset, project);
53
+ // First, check if this tile is visible
54
+ if (bounds && !this.insideBounds(bounds)) {
55
+ return false;
56
+ }
57
+ const isInside = cullingVolume.computeVisibility(boundingVolume);
58
+ if (isInside < 0) {
59
+ return false;
60
+ }
61
+ // Globe: reject tiles occluded by the near hemisphere
62
+ if (project && this.beyondHorizon(viewport.cameraPosition, project, elevationBounds[1])) {
63
+ return false;
64
+ }
65
+ // Avoid loading overlapping tiles - if a descendant is requested, do not request the ancester
66
+ if (!this.childVisible) {
67
+ let { z } = this;
68
+ if (z < maxZ && z >= minZ) {
69
+ // Adjust LOD
70
+ // If the tile is far enough from the camera, accept a lower zoom level
71
+ const distance = (boundingVolume.distanceTo(viewport.cameraPosition) * viewport.scale) / viewport.height;
72
+ z += Math.floor(Math.log2(distance));
73
+ }
74
+ if (z >= maxZ) {
75
+ // LOD is acceptable
76
+ this.selected = true;
77
+ return true;
78
+ }
79
+ }
80
+ // LOD is not enough, recursively test child tiles
81
+ this.selected = false;
82
+ this.childVisible = true;
83
+ for (const child of this.children) {
84
+ child.update(params);
85
+ }
86
+ return true;
87
+ }
88
+ getSelected(result = []) {
89
+ if (this.selected) {
90
+ result.push(this);
91
+ }
92
+ if (this._children) {
93
+ for (const node of this._children) {
94
+ node.getSelected(result);
95
+ }
96
+ }
97
+ return result;
98
+ }
99
+ beyondHorizon(cameraPosition, project, elevation) {
100
+ const cx = cameraPosition[0];
101
+ const cy = cameraPosition[1];
102
+ const cz = cameraPosition[2];
103
+ const cMag = Math.sqrt(cx * cx + cy * cy + cz * cz);
104
+ const camLng = (Math.atan2(cx, -cy) * 180) / Math.PI;
105
+ const camLat = (Math.asin(cz / cMag) * 180) / Math.PI;
106
+ const [west, north] = osmTile2lngLat(this.x, this.y, this.z);
107
+ const [east, south] = osmTile2lngLat(this.x + 1, this.y + 1, this.z);
108
+ const tileCenterLng = (west + east) / 2;
109
+ const wrappedCamLng = tileCenterLng + (((camLng - tileCenterLng + 540) % 360) - 180);
110
+ const closestLng = Math.max(west, Math.min(wrappedCamLng, east));
111
+ const closestLat = Math.max(south, Math.min(camLat, north));
112
+ const closest = project([closestLng, closestLat, elevation]);
113
+ const dot = closest[0] * cx + closest[1] * cy + closest[2] * cz;
114
+ const magSq = closest[0] * closest[0] + closest[1] * closest[1] + closest[2] * closest[2];
115
+ return dot <= magSq;
116
+ }
117
+ insideBounds([minX, minY, maxX, maxY]) {
118
+ const scale = Math.pow(2, this.z);
119
+ const extent = TILE_SIZE / scale;
120
+ return (this.x * extent < maxX &&
121
+ this.y * extent < maxY &&
122
+ (this.x + 1) * extent > minX &&
123
+ (this.y + 1) * extent > minY);
124
+ }
125
+ getBoundingVolume(zRange, worldOffset, project) {
126
+ if (project) {
127
+ // Custom projection
128
+ // Estimate bounding box from sample points
129
+ // At low zoom level we need more samples to calculate the bounding volume correctly
130
+ const refPoints = this.z < 1 ? REF_POINTS_11 : this.z < 2 ? REF_POINTS_9 : REF_POINTS_5;
131
+ // Convert from tile-relative coordinates to common space
132
+ const refPointPositions = [];
133
+ for (const p of refPoints) {
134
+ const lngLat = osmTile2lngLat(this.x + p[0], this.y + p[1], this.z);
135
+ lngLat[2] = zRange[0];
136
+ refPointPositions.push(project(lngLat));
137
+ if (zRange[0] !== zRange[1]) {
138
+ // Account for the elevation volume
139
+ lngLat[2] = zRange[1];
140
+ refPointPositions.push(project(lngLat));
141
+ }
142
+ }
143
+ return makeOrientedBoundingBoxFromPoints(refPointPositions);
144
+ }
145
+ // Use WebMercator projection
146
+ const scale = Math.pow(2, this.z);
147
+ const extent = TILE_SIZE / scale;
148
+ const originX = this.x * extent + worldOffset * TILE_SIZE;
149
+ // deck's common space is y-flipped
150
+ const originY = TILE_SIZE - (this.y + 1) * extent;
151
+ return new AxisAlignedBoundingBox([originX, originY, zRange[0]], [originX + extent, originY + extent, zRange[1]]);
152
+ }
153
+ }
154
+ // eslint-disable-next-line complexity
155
+ export function getOSMTileIndices(viewport, maxZ, zRange, bounds) {
156
+ const project = viewport instanceof _GlobeViewport
157
+ ? // eslint-disable-next-line @typescript-eslint/unbound-method
158
+ viewport.projectPosition
159
+ : null;
160
+ // Get the culling volume of the current camera
161
+ const planes = Object.values(viewport.getFrustumPlanes()).map(({ normal, distance }) => new Plane(normal.clone().negate(), distance));
162
+ const cullingVolume = new CullingVolume(planes);
163
+ // Project zRange from meters to common space
164
+ const unitsPerMeter = viewport.distanceScales.unitsPerMeter[2];
165
+ const elevationMin = (zRange && zRange[0] * unitsPerMeter) || 0;
166
+ const elevationMax = (zRange && zRange[1] * unitsPerMeter) || 0;
167
+ // Always load at the current zoom level if pitch is small
168
+ const minZ = viewport instanceof WebMercatorViewport && viewport.pitch <= 60 ? maxZ : 0;
169
+ // Map extent to OSM position
170
+ if (bounds) {
171
+ const [minLng, minLat, maxLng, maxLat] = bounds;
172
+ const topLeft = lngLatToWorld([minLng, maxLat]);
173
+ const bottomRight = lngLatToWorld([maxLng, minLat]);
174
+ bounds = [topLeft[0], TILE_SIZE - topLeft[1], bottomRight[0], TILE_SIZE - bottomRight[1]];
175
+ }
176
+ const root = new OSMNode(0, 0, 0);
177
+ const traversalParams = {
178
+ viewport,
179
+ project,
180
+ cullingVolume,
181
+ elevationBounds: [elevationMin, elevationMax],
182
+ minZ,
183
+ maxZ,
184
+ bounds,
185
+ // num. of worlds from the center. For repeated maps
186
+ offset: 0
187
+ };
188
+ root.update(traversalParams);
189
+ if (viewport instanceof WebMercatorViewport &&
190
+ viewport.subViewports &&
191
+ viewport.subViewports.length > 1) {
192
+ // Check worlds in repeated maps
193
+ traversalParams.offset = -1;
194
+ while (root.update(traversalParams)) {
195
+ if (--traversalParams.offset < -MAX_MAPS) {
196
+ break;
197
+ }
198
+ }
199
+ traversalParams.offset = 1;
200
+ while (root.update(traversalParams)) {
201
+ if (++traversalParams.offset > MAX_MAPS) {
202
+ break;
203
+ }
204
+ }
205
+ }
206
+ return root.getSelected();
207
+ }
208
+ //# sourceMappingURL=tile-2d-traversal.js.map