@carto/kepler.gl 0.0.18-alpha.1 → 0.0.19
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/components/kepler-gl.js +9 -5
- package/dist/components/map-container.js +16 -2
- package/dist/components/plot-container.js +5 -3
- package/dist/constants/default-settings.js +5 -3
- package/dist/deckgl-layers/cluster-layer/cluster-layer.js +7 -4
- package/dist/layers/aggregation-layer.js +6 -3
- package/dist/layers/base-layer.js +9 -5
- package/dist/utils/layer-utils.js +18 -3
- package/package.json +14 -14
- package/src/components/kepler-gl.d.ts +1 -0
- package/src/components/kepler-gl.js +15 -3
- package/src/components/map-container.js +14 -1
- package/src/components/plot-container.js +3 -2
- package/src/constants/default-settings.js +2 -0
- package/src/deckgl-layers/cluster-layer/cluster-layer.js +5 -1
- package/src/layers/aggregation-layer.js +5 -1
- package/src/layers/base-layer.js +6 -3
- package/src/utils/layer-utils.d.ts +8 -0
- package/src/utils/layer-utils.js +16 -3
- package/umd/keplergl.min.js +180 -181
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.
|
|
5
|
+
"version": "0.0.19",
|
|
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.
|
|
83
|
-
"@deck.gl/core": "^8.
|
|
84
|
-
"@deck.gl/extensions": "^8.
|
|
85
|
-
"@deck.gl/geo-layers": "^8.
|
|
86
|
-
"@deck.gl/layers": "^8.
|
|
87
|
-
"@deck.gl/mesh-layers": "^8.
|
|
88
|
-
"@deck.gl/react": "^8.
|
|
89
|
-
"@loaders.gl/core": "^3.
|
|
90
|
-
"@loaders.gl/csv": "^3.
|
|
91
|
-
"@loaders.gl/gltf": "^3.
|
|
92
|
-
"@loaders.gl/json": "^3.
|
|
93
|
-
"@loaders.gl/loader-utils": "^3.
|
|
94
|
-
"@loaders.gl/polyfills": "^3.
|
|
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",
|
|
@@ -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
|
-
? [
|
|
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 ? (
|
|
@@ -33,6 +33,7 @@ import {LAYER_VIS_CONFIGS} from 'layers/layer-factory';
|
|
|
33
33
|
import {SCALE_TYPES} from 'constants/default-settings';
|
|
34
34
|
import {DEFAULT_COLOR_RANGE} from 'constants/color-ranges';
|
|
35
35
|
import ClusterBuilder, {getGeoJSON} from '../layer-utils/cluster-utils';
|
|
36
|
+
import {getMaskExtensionProps} from 'utils/layer-utils';
|
|
36
37
|
|
|
37
38
|
const defaultRadius = LAYER_VIS_CONFIGS.clusterRadius.defaultValue;
|
|
38
39
|
const defaultRadiusRange = LAYER_VIS_CONFIGS.clusterRadiusRange.defaultValue;
|
|
@@ -225,6 +226,8 @@ export default class ClusterLayer extends AggregationLayer {
|
|
|
225
226
|
const distanceScale = getDistanceScales(this.context.viewport);
|
|
226
227
|
const metersPerPixel = distanceScale.metersPerPixel[0];
|
|
227
228
|
|
|
229
|
+
const maskExtensionProps = getMaskExtensionProps(this.props.maskPolygon);
|
|
230
|
+
|
|
228
231
|
// return props to the sublayer constructor
|
|
229
232
|
return new ScatterplotLayer({
|
|
230
233
|
id: `${id}-cluster`,
|
|
@@ -236,7 +239,8 @@ export default class ClusterLayer extends AggregationLayer {
|
|
|
236
239
|
autoHighlight,
|
|
237
240
|
highlightColor,
|
|
238
241
|
updateTriggers,
|
|
239
|
-
...accessors
|
|
242
|
+
...accessors,
|
|
243
|
+
...maskExtensionProps
|
|
240
244
|
});
|
|
241
245
|
}
|
|
242
246
|
}
|
|
@@ -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
|
}
|
package/src/layers/base-layer.js
CHANGED
|
@@ -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,12 @@ 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
|
+
maskEnabled: boolean,
|
|
76
|
+
extensions: Array<unknown>
|
|
69
77
|
}
|
package/src/utils/layer-utils.js
CHANGED
|
@@ -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,13 @@ 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: MASK_LAYER_ID,
|
|
195
|
+
maskEnabled: Boolean(maskPolygon && maskPolygon.length),
|
|
196
|
+
extensions: [maskExtension]
|
|
197
|
+
};
|
|
198
|
+
}
|