@deck.gl/geo-layers 8.7.0-beta.6 → 8.7.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 (43) hide show
  1. package/dist/dist.dev.js +218 -146
  2. package/dist/es5/geo-cell-layer/GeoCellLayer.js +112 -0
  3. package/dist/es5/geo-cell-layer/GeoCellLayer.js.map +1 -0
  4. package/dist/es5/h3-layers/h3-cluster-layer.js +10 -59
  5. package/dist/es5/h3-layers/h3-cluster-layer.js.map +1 -1
  6. package/dist/es5/index.js +8 -0
  7. package/dist/es5/index.js.map +1 -1
  8. package/dist/es5/mvt-layer/mvt-layer.js +22 -20
  9. package/dist/es5/mvt-layer/mvt-layer.js.map +1 -1
  10. package/dist/es5/quadkey-layer/quadkey-layer.js +69 -0
  11. package/dist/es5/quadkey-layer/quadkey-layer.js.map +1 -0
  12. package/dist/es5/quadkey-layer/quadkey-utils.js +51 -0
  13. package/dist/es5/quadkey-layer/quadkey-utils.js.map +1 -0
  14. package/dist/es5/s2-layer/s2-layer.js +10 -68
  15. package/dist/es5/s2-layer/s2-layer.js.map +1 -1
  16. package/dist/es5/tile-layer/utils.js +1 -1
  17. package/dist/es5/tile-layer/utils.js.map +1 -1
  18. package/dist/esm/geo-cell-layer/GeoCellLayer.js +68 -0
  19. package/dist/esm/geo-cell-layer/GeoCellLayer.js.map +1 -0
  20. package/dist/esm/h3-layers/h3-cluster-layer.js +7 -51
  21. package/dist/esm/h3-layers/h3-cluster-layer.js.map +1 -1
  22. package/dist/esm/index.js +1 -0
  23. package/dist/esm/index.js.map +1 -1
  24. package/dist/esm/mvt-layer/mvt-layer.js +13 -9
  25. package/dist/esm/mvt-layer/mvt-layer.js.map +1 -1
  26. package/dist/esm/quadkey-layer/quadkey-layer.js +26 -0
  27. package/dist/esm/quadkey-layer/quadkey-layer.js.map +1 -0
  28. package/dist/esm/quadkey-layer/quadkey-utils.js +24 -0
  29. package/dist/esm/quadkey-layer/quadkey-utils.js.map +1 -0
  30. package/dist/esm/s2-layer/s2-layer.js +6 -59
  31. package/dist/esm/s2-layer/s2-layer.js.map +1 -1
  32. package/dist/esm/tile-layer/utils.js +1 -1
  33. package/dist/esm/tile-layer/utils.js.map +1 -1
  34. package/dist.min.js +2 -2
  35. package/package.json +2 -2
  36. package/src/geo-cell-layer/GeoCellLayer.js +80 -0
  37. package/src/h3-layers/h3-cluster-layer.js +8 -64
  38. package/src/index.ts +1 -0
  39. package/src/mvt-layer/mvt-layer.js +12 -7
  40. package/src/quadkey-layer/quadkey-layer.js +22 -0
  41. package/src/quadkey-layer/quadkey-utils.js +28 -0
  42. package/src/s2-layer/s2-layer.js +9 -75
  43. package/src/tile-layer/utils.js +4 -4
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.7.0-beta.6",
5
+ "version": "8.7.1",
6
6
  "publishConfig": {
7
7
  "access": "public"
8
8
  },
@@ -49,5 +49,5 @@
49
49
  "@deck.gl/mesh-layers": "^8.0.0",
50
50
  "@loaders.gl/core": "^3.0.0"
51
51
  },
52
- "gitHead": "d6eefe2e0992999416b2362340f86402b1f25b33"
52
+ "gitHead": "8a2f488c640bbf80982c684e7fd741982afe1d81"
53
53
  }
@@ -0,0 +1,80 @@
1
+ import {CompositeLayer} from '@deck.gl/core';
2
+ import {PolygonLayer} from '@deck.gl/layers';
3
+
4
+ const defaultProps = {
5
+ ...PolygonLayer.defaultProps
6
+ };
7
+
8
+ export default class GeoCellLayer extends CompositeLayer {
9
+ // Implement to generate props to create geometry
10
+ indexToBounds() {
11
+ return null;
12
+ }
13
+
14
+ renderLayers() {
15
+ // Rendering props underlying layer
16
+ const {
17
+ elevationScale,
18
+ extruded,
19
+ wireframe,
20
+ filled,
21
+ stroked,
22
+ lineWidthUnits,
23
+ lineWidthScale,
24
+ lineWidthMinPixels,
25
+ lineWidthMaxPixels,
26
+ lineJointRounded,
27
+ lineMiterLimit,
28
+ lineDashJustified,
29
+ getElevation,
30
+ getFillColor,
31
+ getLineColor,
32
+ getLineWidth
33
+ } = this.props;
34
+
35
+ // Accessor props for underlying layers
36
+ const {updateTriggers, material, transitions} = this.props;
37
+
38
+ // Filled Polygon Layer
39
+ const CellLayer = this.getSubLayerClass('cell', PolygonLayer);
40
+ return new CellLayer(
41
+ {
42
+ filled,
43
+ wireframe,
44
+
45
+ extruded,
46
+ elevationScale,
47
+
48
+ stroked,
49
+ lineWidthUnits,
50
+ lineWidthScale,
51
+ lineWidthMinPixels,
52
+ lineWidthMaxPixels,
53
+ lineJointRounded,
54
+ lineMiterLimit,
55
+ lineDashJustified,
56
+
57
+ material,
58
+ transitions,
59
+
60
+ getElevation,
61
+ getFillColor,
62
+ getLineColor,
63
+ getLineWidth
64
+ },
65
+ this.getSubLayerProps({
66
+ id: 'cell',
67
+ updateTriggers: {
68
+ getElevation: updateTriggers.getElevation,
69
+ getFillColor: updateTriggers.getFillColor,
70
+ getLineColor: updateTriggers.getLineColor,
71
+ getLineWidth: updateTriggers.getLineWidth
72
+ }
73
+ }),
74
+ this.indexToBounds()
75
+ );
76
+ }
77
+ }
78
+
79
+ GeoCellLayer.layerName = 'GeoCellLayer';
80
+ GeoCellLayer.defaultProps = defaultProps;
@@ -1,14 +1,13 @@
1
1
  import {h3SetToMultiPolygon} from 'h3-js';
2
2
 
3
- import {CompositeLayer, createIterable} from '@deck.gl/core';
4
- import {PolygonLayer} from '@deck.gl/layers';
3
+ import {createIterable} from '@deck.gl/core';
4
+ import GeoCellLayer from '../geo-cell-layer/GeoCellLayer';
5
5
 
6
6
  const defaultProps = {
7
- ...PolygonLayer.defaultProps,
8
7
  getHexagons: {type: 'accessor', value: d => d.hexagons}
9
8
  };
10
9
 
11
- export default class H3ClusterLayer extends CompositeLayer {
10
+ export default class H3ClusterLayer extends GeoCellLayer {
12
11
  updateState({props, oldProps, changeFlags}) {
13
12
  if (
14
13
  changeFlags.dataChanged ||
@@ -32,66 +31,11 @@ export default class H3ClusterLayer extends CompositeLayer {
32
31
  }
33
32
  }
34
33
 
35
- renderLayers() {
36
- const {
37
- elevationScale,
38
- extruded,
39
- wireframe,
40
- filled,
41
- stroked,
42
- lineWidthScale,
43
- lineWidthMinPixels,
44
- lineWidthMaxPixels,
45
- lineJointRounded,
46
- lineMiterLimit,
47
- lineDashJustified,
48
- material,
49
-
50
- getFillColor,
51
- getLineColor,
52
- getLineWidth,
53
- getLineDashArray,
54
- getElevation,
55
- transitions,
56
- updateTriggers
57
- } = this.props;
58
-
59
- const SubLayerClass = this.getSubLayerClass('cluster-region', PolygonLayer);
60
-
61
- return new SubLayerClass(
62
- {
63
- filled,
64
- wireframe,
65
-
66
- extruded,
67
- elevationScale,
68
-
69
- stroked,
70
- lineWidthScale,
71
- lineWidthMinPixels,
72
- lineWidthMaxPixels,
73
- lineJointRounded,
74
- lineMiterLimit,
75
- lineDashJustified,
76
-
77
- material,
78
- transitions,
79
-
80
- getFillColor: this.getSubLayerAccessor(getFillColor),
81
- getLineColor: this.getSubLayerAccessor(getLineColor),
82
- getLineWidth: this.getSubLayerAccessor(getLineWidth),
83
- getLineDashArray: this.getSubLayerAccessor(getLineDashArray),
84
- getElevation: this.getSubLayerAccessor(getElevation)
85
- },
86
- this.getSubLayerProps({
87
- id: 'cluster-region',
88
- updateTriggers
89
- }),
90
- {
91
- data: this.state.polygons,
92
- getPolygon: d => d.polygon
93
- }
94
- );
34
+ indexToBounds() {
35
+ return {
36
+ data: this.state.polygons,
37
+ getPolygon: d => d.polygon
38
+ };
95
39
  }
96
40
  }
97
41
 
package/src/index.ts CHANGED
@@ -21,6 +21,7 @@
21
21
 
22
22
  export {default as GreatCircleLayer} from './great-circle-layer/great-circle-layer';
23
23
  export {default as S2Layer} from './s2-layer/s2-layer';
24
+ export {default as QuadkeyLayer} from './quadkey-layer/quadkey-layer';
24
25
  export {default as TileLayer} from './tile-layer/tile-layer';
25
26
  export {default as TripsLayer} from './trips-layer/trips-layer';
26
27
  export {default as H3ClusterLayer} from './h3-layers/h3-cluster-layer';
@@ -15,6 +15,7 @@ import {GeoJsonLayer} from '@deck.gl/layers';
15
15
  const WORLD_SIZE = 512;
16
16
 
17
17
  const defaultProps = {
18
+ ...GeoJsonLayer.defaultProps,
18
19
  uniqueIdProperty: {type: 'string', value: ''},
19
20
  highlightedFeatureId: null,
20
21
  loaders: [MVTWorkerLoader],
@@ -24,7 +25,10 @@ const defaultProps = {
24
25
  export default class MVTLayer extends TileLayer {
25
26
  initializeState() {
26
27
  super.initializeState();
28
+ // GlobeView doesn't work well with binary data
29
+ const binary = this.context.viewport.resolution !== undefined ? false : this.props.binary;
27
30
  this.setState({
31
+ binary,
28
32
  data: null,
29
33
  tileJSON: null
30
34
  });
@@ -110,7 +114,8 @@ export default class MVTLayer extends TileLayer {
110
114
  return Promise.reject('Invalid URL');
111
115
  }
112
116
  let loadOptions = this.getLoadOptions();
113
- const {binary, fetch} = this.props;
117
+ const {binary} = this.state;
118
+ const {fetch} = this.props;
114
119
  const {signal, x, y, z} = tile;
115
120
  loadOptions = {
116
121
  ...loadOptions,
@@ -152,7 +157,7 @@ export default class MVTLayer extends TileLayer {
152
157
 
153
158
  const subLayers = super.renderSubLayers(props);
154
159
 
155
- if (this.props.binary && !(subLayers instanceof GeoJsonLayer)) {
160
+ if (this.state.binary && !(subLayers instanceof GeoJsonLayer)) {
156
161
  log.warn('renderSubLayers() must return GeoJsonLayer when using binary:true')();
157
162
  }
158
163
 
@@ -193,7 +198,7 @@ export default class MVTLayer extends TileLayer {
193
198
 
194
199
  const isWGS84 = this.context.viewport.resolution;
195
200
 
196
- if (this.props.binary && info.index !== -1) {
201
+ if (this.state.binary && info.index !== -1) {
197
202
  const {data} = params.sourceLayer.props;
198
203
  info.object = binaryToGeojson(data, {globalFeatureId: info.index});
199
204
  }
@@ -212,8 +217,8 @@ export default class MVTLayer extends TileLayer {
212
217
  }
213
218
 
214
219
  getHighlightedObjectIndex(tile) {
215
- const {hoveredFeatureId, hoveredFeatureLayerName} = this.state;
216
- const {uniqueIdProperty, highlightedFeatureId, binary} = this.props;
220
+ const {hoveredFeatureId, hoveredFeatureLayerName, binary} = this.state;
221
+ const {uniqueIdProperty, highlightedFeatureId} = this.props;
217
222
  const data = tile.content;
218
223
 
219
224
  const isHighlighted = isFeatureIdDefined(highlightedFeatureId);
@@ -293,7 +298,7 @@ export default class MVTLayer extends TileLayer {
293
298
  return null;
294
299
  }
295
300
 
296
- if (this.props.binary && Array.isArray(tile.content) && !tile.content.length) {
301
+ if (this.state.binary && Array.isArray(tile.content) && !tile.content.length) {
297
302
  // TODO: @loaders.gl/mvt returns [] when no content. It should return a valid empty binary.
298
303
  // https://github.com/visgl/loaders.gl/pull/1137
299
304
  return [];
@@ -301,7 +306,7 @@ export default class MVTLayer extends TileLayer {
301
306
 
302
307
  if (tile._contentWGS84 === undefined) {
303
308
  // Create a cache to transform only once
304
- const content = this.props.binary ? binaryToGeojson(tile.content) : tile.content;
309
+ const content = this.state.binary ? binaryToGeojson(tile.content) : tile.content;
305
310
  tile._contentWGS84 = content.map(feature =>
306
311
  transformTileCoordsToWGS84(feature, tile.bbox, this.context.viewport)
307
312
  );
@@ -0,0 +1,22 @@
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;
@@ -0,0 +1,28 @@
1
+ import {worldToLngLat} from '@math.gl/web-mercator';
2
+
3
+ const TILE_SIZE = 512;
4
+
5
+ export function quadkeyToWorldBounds(quadkey) {
6
+ let x = 0;
7
+ let y = 0;
8
+ let mask = 1 << quadkey.length;
9
+ const scale = mask / TILE_SIZE;
10
+
11
+ for (let i = 0; i < quadkey.length; i++) {
12
+ mask >>= 1;
13
+ const q = parseInt(quadkey[i]);
14
+ if (q % 2) x |= mask;
15
+ if (q > 1) y |= mask;
16
+ }
17
+ return [
18
+ [x / scale, TILE_SIZE - y / scale],
19
+ [(x + 0.99) / scale, TILE_SIZE - (y + 0.99) / scale]
20
+ ];
21
+ }
22
+
23
+ export function getQuadkeyPolygon(quadkey) {
24
+ const [topLeft, bottomRight] = quadkeyToWorldBounds(quadkey);
25
+ const [w, n] = worldToLngLat(topLeft);
26
+ const [e, s] = worldToLngLat(bottomRight);
27
+ return [e, n, e, s, w, s, w, n, e, n];
28
+ }
@@ -18,89 +18,23 @@
18
18
  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
19
  // THE SOFTWARE.
20
20
 
21
- import {CompositeLayer} from '@deck.gl/core';
22
- import {PolygonLayer} from '@deck.gl/layers';
23
-
21
+ import GeoCellLayer from '../geo-cell-layer/GeoCellLayer';
24
22
  import {getS2Polygon} from './s2-utils';
25
23
 
26
24
  const defaultProps = {
27
- ...PolygonLayer.defaultProps,
28
25
  getS2Token: {type: 'accessor', value: d => d.token}
29
26
  };
30
27
 
31
- export default class S2Layer extends CompositeLayer {
32
- renderLayers() {
33
- // Layer prop
28
+ export default class S2Layer extends GeoCellLayer {
29
+ indexToBounds() {
34
30
  const {data, getS2Token} = this.props;
35
31
 
36
- // Rendering props underlying layer
37
- const {
38
- elevationScale,
39
- extruded,
40
- wireframe,
41
- filled,
42
- stroked,
43
- lineWidthUnits,
44
- lineWidthScale,
45
- lineWidthMinPixels,
46
- lineWidthMaxPixels,
47
- lineJointRounded,
48
- lineMiterLimit,
49
- lineDashJustified,
50
- getElevation,
51
- getFillColor,
52
- getLineColor,
53
- getLineWidth,
54
- getLineDashArray
55
- } = this.props;
56
-
57
- // Accessor props for underlying layers
58
- const {updateTriggers, material} = this.props;
59
-
60
- // Filled Polygon Layer
61
- const CellLayer = this.getSubLayerClass('cell', PolygonLayer);
62
- return new CellLayer(
63
- {
64
- filled,
65
- wireframe,
66
-
67
- extruded,
68
- elevationScale,
69
-
70
- stroked,
71
- lineWidthUnits,
72
- lineWidthScale,
73
- lineWidthMinPixels,
74
- lineWidthMaxPixels,
75
- lineJointRounded,
76
- lineMiterLimit,
77
- lineDashJustified,
78
-
79
- material,
80
-
81
- getElevation,
82
- getFillColor,
83
- getLineColor,
84
- getLineWidth,
85
- getLineDashArray
86
- },
87
- this.getSubLayerProps({
88
- id: 'cell',
89
- updateTriggers: {
90
- getElevation: updateTriggers.getElevation,
91
- getFillColor: updateTriggers.getFillColor,
92
- getLineColor: updateTriggers.getLineColor,
93
- getLineWidth: updateTriggers.getLineWidth,
94
- getLineDashArray: updateTriggers.getLineDashArray
95
- }
96
- }),
97
- {
98
- data,
99
- _normalize: false,
100
- positionFormat: 'XY',
101
- getPolygon: (x, objectInfo) => getS2Polygon(getS2Token(x, objectInfo))
102
- }
103
- );
32
+ return {
33
+ data,
34
+ _normalize: false,
35
+ positionFormat: 'XY',
36
+ getPolygon: (x, objectInfo) => getS2Polygon(getS2Token(x, objectInfo))
37
+ };
104
38
  }
105
39
  }
106
40
 
@@ -33,13 +33,13 @@ export const urlType = {
33
33
  function transformBox(bbox, modelMatrix) {
34
34
  const transformedCoords = [
35
35
  // top-left
36
- modelMatrix.transformPoint([bbox[0], bbox[1]]),
36
+ modelMatrix.transformAsPoint([bbox[0], bbox[1]]),
37
37
  // top-right
38
- modelMatrix.transformPoint([bbox[2], bbox[1]]),
38
+ modelMatrix.transformAsPoint([bbox[2], bbox[1]]),
39
39
  // bottom-left
40
- modelMatrix.transformPoint([bbox[0], bbox[3]]),
40
+ modelMatrix.transformAsPoint([bbox[0], bbox[3]]),
41
41
  // bottom-right
42
- modelMatrix.transformPoint([bbox[2], bbox[3]])
42
+ modelMatrix.transformAsPoint([bbox[2], bbox[3]])
43
43
  ];
44
44
  const transformedBox = [
45
45
  // Minimum x coord