@carto/kepler.gl 0.0.18-alpha.1 → 0.0.22

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/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@carto/kepler.gl",
3
3
  "author": "CARTO",
4
4
  "homepage": "https://github.com/CartoDB/carto-kepler#readme",
5
- "version": "0.0.18-alpha.1",
5
+ "version": "0.0.22",
6
6
  "description": "kepler.gl is a webgl based application to visualize large scale location data in the browser",
7
7
  "license": "MIT",
8
8
  "main": "dist/index.js",
@@ -79,19 +79,19 @@
79
79
  "umd"
80
80
  ],
81
81
  "dependencies": {
82
- "@deck.gl/aggregation-layers": "^8.6.2",
83
- "@deck.gl/core": "^8.6.2",
84
- "@deck.gl/extensions": "^8.6.2",
85
- "@deck.gl/geo-layers": "^8.6.2",
86
- "@deck.gl/layers": "^8.6.2",
87
- "@deck.gl/mesh-layers": "^8.6.2",
88
- "@deck.gl/react": "^8.6.2",
89
- "@loaders.gl/core": "^3.0.11",
90
- "@loaders.gl/csv": "^3.0.11",
91
- "@loaders.gl/gltf": "^3.0.11",
92
- "@loaders.gl/json": "^3.0.11",
93
- "@loaders.gl/loader-utils": "^3.0.11",
94
- "@loaders.gl/polyfills": "^3.0.11",
82
+ "@deck.gl/aggregation-layers": "^8.7.0-beta.2",
83
+ "@deck.gl/core": "^8.7.0-beta.2",
84
+ "@deck.gl/extensions": "^8.7.0-beta.2",
85
+ "@deck.gl/geo-layers": "^8.7.0-beta.2",
86
+ "@deck.gl/layers": "^8.7.0-beta.2",
87
+ "@deck.gl/mesh-layers": "^8.7.0-beta.2",
88
+ "@deck.gl/react": "^8.7.0-beta.2",
89
+ "@loaders.gl/core": "^3.1.5",
90
+ "@loaders.gl/csv": "^3.1.5",
91
+ "@loaders.gl/gltf": "^3.1.5",
92
+ "@loaders.gl/json": "^3.1.5",
93
+ "@loaders.gl/loader-utils": "^3.1.5",
94
+ "@loaders.gl/polyfills": "^3.1.5",
95
95
  "@luma.gl/constants": "^8.5.10",
96
96
  "@luma.gl/core": "^8.5.10",
97
97
  "@mapbox/geo-viewport": "^0.4.1",
@@ -37,6 +37,7 @@ export type KeplerGlProps = {
37
37
  onExportToCloudSuccess?: OnSuccessCallBack;
38
38
  onExportToCloudError?: OnErrorCallBack;
39
39
  readOnly?: boolean;
40
+ maskPolygon?: Array<Array<number>>
40
41
  };
41
42
 
42
43
  export type UnconnectedKeplerGlProps = KeplerGlProps & {
@@ -172,7 +172,8 @@ export const plotContainerSelector = props => ({
172
172
  setExportImageSetting: props.uiStateActions.setExportImageSetting,
173
173
  setExportImageDataUri: props.uiStateActions.setExportImageDataUri,
174
174
  setExportImageError: props.uiStateActions.setExportImageError,
175
- splitMaps: props.visState.splitMaps
175
+ splitMaps: props.visState.splitMaps,
176
+ maskPolygon: props.maskPolygon
176
177
  });
177
178
 
178
179
  export const isSplitSelector = props =>
@@ -366,7 +367,8 @@ function KeplerGlFactory(
366
367
  uiState,
367
368
  visState,
368
369
  // readOnly override
369
- readOnly
370
+ readOnly,
371
+ maskPolygon
370
372
  } = this.props;
371
373
 
372
374
  const dimensions = this.state.dimensions || {width, height};
@@ -390,7 +392,16 @@ function KeplerGlFactory(
390
392
  const notificationPanelFields = notificationPanelSelector(this.props);
391
393
 
392
394
  const mapContainers = !isSplit
393
- ? [<MapContainer primary={true} key={0} index={0} {...mapFields} mapLayers={null} />]
395
+ ? [
396
+ <MapContainer
397
+ primary={true}
398
+ key={0}
399
+ index={0}
400
+ {...mapFields}
401
+ mapLayers={null}
402
+ maskPolygon={maskPolygon}
403
+ />
404
+ ]
394
405
  : splitMaps.map((settings, index) => (
395
406
  <MapContainer
396
407
  key={index}
@@ -398,6 +409,7 @@ function KeplerGlFactory(
398
409
  primary={index === 1}
399
410
  {...mapFields}
400
411
  mapLayers={splitMaps[index].layers}
412
+ maskPolygon={maskPolygon}
401
413
  />
402
414
  ));
403
415
 
@@ -24,6 +24,8 @@ import PropTypes from 'prop-types';
24
24
  import MapboxGLMap from 'react-map-gl';
25
25
  import DeckGL from '@deck.gl/react';
26
26
  import {createSelector} from 'reselect';
27
+ import {OPERATION} from '@deck.gl/core';
28
+ import {SolidPolygonLayer} from '@deck.gl/layers';
27
29
  import WebMercatorViewport from 'viewport-mercator-project';
28
30
  import {errorNotification} from 'utils/notifications-utils';
29
31
 
@@ -50,6 +52,7 @@ import ThreeDBuildingLayer from 'deckgl-layers/3d-building-layer/3d-building-lay
50
52
  import {
51
53
  FILTER_TYPES,
52
54
  GEOCODER_LAYER_ID,
55
+ MASK_LAYER_ID,
53
56
  THROTTLE_NOTIFICATION_TIME
54
57
  } from 'constants/default-settings';
55
58
 
@@ -395,7 +398,8 @@ export default function MapContainerFactory(MapPopover, MapControl, Editor) {
395
398
  layers,
396
399
  visStateActions,
397
400
  mapboxApiAccessToken,
398
- mapboxApiUrl
401
+ mapboxApiUrl,
402
+ maskPolygon
399
403
  } = this.props;
400
404
 
401
405
  // initialise layers from props if exists
@@ -422,6 +426,15 @@ export default function MapContainerFactory(MapPopover, MapControl, Editor) {
422
426
  deckGlLayers = deckGlLayers.concat(this.props.deckGlProps.layersOnTop);
423
427
  }
424
428
 
429
+ deckGlLayers.push(
430
+ new SolidPolygonLayer({
431
+ id: MASK_LAYER_ID,
432
+ operation: OPERATION.MASK,
433
+ data: maskPolygon ? [{polygon: maskPolygon}] : [],
434
+ getFillColor: [255, 255, 255, 255]
435
+ })
436
+ );
437
+
425
438
  if (mapStyle.visibleLayerGroups['3d building']) {
426
439
  deckGlLayers.push(
427
440
  new ThreeDBuildingLayer({
@@ -153,7 +153,7 @@ export default function PlotContainerFactory(MapContainer, MapsLayout) {
153
153
  };
154
154
 
155
155
  render() {
156
- const {exportImageSetting, mapFields, splitMaps} = this.props;
156
+ const {exportImageSetting, mapFields, splitMaps, maskPolygon} = this.props;
157
157
  const {imageSize = {}, legend} = exportImageSetting;
158
158
  const {mapState} = mapFields;
159
159
  const isSplit = splitMaps && splitMaps.length > 1;
@@ -205,7 +205,8 @@ export default function PlotContainerFactory(MapContainer, MapsLayout) {
205
205
  MapComponent: StaticMap,
206
206
  onMapRender: this._onMapRender,
207
207
  isExport: true,
208
- deckGlProps
208
+ deckGlProps,
209
+ maskPolygon
209
210
  };
210
211
 
211
212
  const mapContainers = !isSplit ? (
@@ -893,3 +893,5 @@ export const MAP_CONTROLS = keyMirror({
893
893
  mapDraw: null,
894
894
  mapLocale: null
895
895
  });
896
+
897
+ export const MASK_LAYER_ID = 'mask_layer';
@@ -218,7 +218,15 @@ export default class ClusterLayer extends AggregationLayer {
218
218
  const {cpuAggregator} = this.state;
219
219
 
220
220
  // base layer props
221
- const {visible, opacity, pickable, autoHighlight, highlightColor} = this.props;
221
+ const {
222
+ visible,
223
+ opacity,
224
+ pickable,
225
+ autoHighlight,
226
+ highlightColor,
227
+ maskId,
228
+ extensions
229
+ } = this.props;
222
230
  const updateTriggers = this._getSublayerUpdateTriggers();
223
231
  const accessors = this._getSubLayerAccessors();
224
232
 
@@ -236,7 +244,9 @@ export default class ClusterLayer extends AggregationLayer {
236
244
  autoHighlight,
237
245
  highlightColor,
238
246
  updateTriggers,
239
- ...accessors
247
+ ...accessors,
248
+ maskId,
249
+ extensions
240
250
  });
241
251
  }
242
252
  }
@@ -25,9 +25,9 @@ function addInstanceCoverage(vs) {
25
25
  const addDecl = editShader(
26
26
  vs,
27
27
  'hexagon cell vs add instance',
28
- 'attribute vec3 instancePickingColors;',
29
- `attribute vec3 instancePickingColors;
30
- attribute float instanceCoverage;`
28
+ 'in vec3 instancePickingColors;',
29
+ `in vec3 instancePickingColors;
30
+ in float instanceCoverage;`
31
31
  );
32
32
 
33
33
  return editShader(
@@ -20,6 +20,7 @@
20
20
 
21
21
  import memoize from 'lodash.memoize';
22
22
  import Layer from './base-layer';
23
+ import {getMaskExtensionProps} from 'utils/layer-utils';
23
24
  import {hexToRgb} from 'utils/color-utils';
24
25
  import {aggregate} from 'utils/aggregate-utils';
25
26
  import {
@@ -277,11 +278,14 @@ export default class AggregationLayer extends Layer {
277
278
 
278
279
  getDefaultDeckLayerProps(opts) {
279
280
  const baseProp = super.getDefaultDeckLayerProps(opts);
281
+ const maskExtensionProps = getMaskExtensionProps(opts.maskPolygon);
282
+
280
283
  return {
281
284
  ...baseProp,
285
+ ...maskExtensionProps,
282
286
  highlightColor: HIGHLIGH_COLOR_3D,
283
287
  // gpu data filtering is not supported in aggregation layer
284
- extensions: [],
288
+ extensions: [...maskExtensionProps.extensions],
285
289
  autoHighlight: this.config.visConfig.enable3d
286
290
  };
287
291
  }
@@ -54,6 +54,7 @@ import {getLatLngBounds, notNullorUndefined} from 'utils/data-utils';
54
54
  import {getSampleData} from 'utils/table-utils/data-container-utils';
55
55
 
56
56
  import {hexToRgb, getColorGroupByName, reverseColorRange} from 'utils/color-utils';
57
+ import {getMaskExtensionProps} from 'utils/layer-utils';
57
58
 
58
59
  /** @typedef {import('./index').Layer} LayerClass} */
59
60
 
@@ -1078,8 +1079,11 @@ class Layer {
1078
1079
  };
1079
1080
  }
1080
1081
 
1081
- getDefaultDeckLayerProps({idx, gpuFilter, mapState, visible}) {
1082
+ getDefaultDeckLayerProps({idx, gpuFilter, mapState, visible, maskPolygon}) {
1083
+ const maskExtensionProps = getMaskExtensionProps(maskPolygon);
1084
+
1082
1085
  return {
1086
+ ...maskExtensionProps,
1083
1087
  id: this.id,
1084
1088
  idx,
1085
1089
  coordinateSystem: COORDINATE_SYSTEM.LNGLAT,
@@ -1091,9 +1095,8 @@ class Layer {
1091
1095
  opacity: this.config.visConfig.opacity,
1092
1096
  highlightColor: this.config.highlightColor,
1093
1097
  // data filtering
1094
- extensions: [dataFilterExtension],
1098
+ extensions: [dataFilterExtension, ...maskExtensionProps.extensions],
1095
1099
  filterRange: gpuFilter ? gpuFilter.filterRange : undefined,
1096
-
1097
1100
  // layer should be visible and if splitMap, shown in to one of panel
1098
1101
  visible: this.config.isVisible && visible
1099
1102
  };
@@ -66,4 +66,11 @@ export function prepareLayersForDeck(
66
66
  layerData: VisState['layerData'],
67
67
  ): {
68
68
  [key: string]: boolean;
69
+ }
70
+
71
+ export function getMaskExtensionProps(
72
+ maskPolygon: Array<Array<number>>,
73
+ ): {
74
+ maskId?: string,
75
+ extensions: Array<unknown>
69
76
  }
@@ -19,7 +19,8 @@
19
19
  // THE SOFTWARE.
20
20
 
21
21
  import {OVERLAY_TYPE} from 'layers/base-layer';
22
- import {GEOCODER_LAYER_ID} from 'constants/default-settings';
22
+ import {GEOCODER_LAYER_ID, MASK_LAYER_ID} from 'constants/default-settings';
23
+ import {MaskExtension} from '@deck.gl/extensions';
23
24
 
24
25
  /**
25
26
  * Find default layers from fields
@@ -124,7 +125,8 @@ export function renderDeckGlLayer(props, layerCallbacks, idx) {
124
125
  mapState,
125
126
  interactionConfig,
126
127
  animationConfig,
127
- mapLayers
128
+ mapLayers,
129
+ maskPolygon
128
130
  } = props;
129
131
  const layer = layers[idx];
130
132
  const data = layerData[idx];
@@ -141,7 +143,8 @@ export function renderDeckGlLayer(props, layerCallbacks, idx) {
141
143
  mapState,
142
144
  animationConfig,
143
145
  objectHovered,
144
- visible
146
+ visible,
147
+ maskPolygon
145
148
  });
146
149
  }
147
150
 
@@ -183,3 +186,12 @@ export function prepareLayersToRender(layers, layerData, mapLayers) {
183
186
  {}
184
187
  );
185
188
  }
189
+
190
+ const maskExtension = new MaskExtension();
191
+
192
+ export function getMaskExtensionProps(maskPolygon) {
193
+ return {
194
+ maskId: Boolean(maskPolygon && maskPolygon.length) && MASK_LAYER_ID,
195
+ extensions: [maskExtension]
196
+ };
197
+ }