@flowmap.gl/layers 8.0.0-alpha.2 → 8.0.0-alpha.6

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.
@@ -19,51 +19,53 @@ import {ScatterplotLayer} from '@deck.gl/layers';
19
19
  import {
20
20
  colorAsRgba,
21
21
  FlowLinesLayerAttributes,
22
- FlowMapData,
23
- FlowMapDataAccessors,
24
- FlowMapDataProvider,
22
+ FlowmapData,
23
+ FlowmapDataAccessors,
24
+ FlowmapDataProvider,
25
25
  getFlowLineAttributesByIndex,
26
- getFlowMapColors,
26
+ getFlowmapColors,
27
27
  getOuterCircleRadiusByIndex,
28
28
  getLocationCentroidByIndex,
29
- isFlowMapData,
30
- isFlowMapDataProvider,
29
+ isFlowmapData,
30
+ isFlowmapDataProvider,
31
31
  LayersData,
32
- LocalFlowMapDataProvider,
32
+ LocalFlowmapDataProvider,
33
33
  LocationFilterMode,
34
34
  ViewportProps,
35
- FlowMapAggregateAccessors,
36
- ClusterNode,
37
- AggregateFlow,
35
+ FlowmapAggregateAccessors,
38
36
  } from '@flowmap.gl/data';
39
37
  import AnimatedFlowLinesLayer from './AnimatedFlowLinesLayer';
40
38
  import FlowCirclesLayer from './FlowCirclesLayer';
41
39
  import FlowLinesLayer from './FlowLinesLayer';
42
40
  import {
43
- FlowLayerPickingInfo,
41
+ FlowmapLayerPickingInfo,
44
42
  LayerProps,
45
43
  PickingInfo,
46
44
  PickingType,
47
45
  } from './types';
48
46
 
49
- export type FlowMapLayerProps<L, F> = {
50
- data: FlowMapData<L, F> | FlowMapDataProvider<L, F>;
47
+ export type FlowmapLayerProps<L, F> = {
48
+ data?: FlowmapData<L, F>;
49
+ dataProvider?: FlowmapDataProvider<L, F>;
51
50
  locationTotalsEnabled?: boolean;
52
51
  adaptiveScalesEnabled?: boolean;
53
52
  animationEnabled?: boolean;
54
53
  clusteringEnabled?: boolean;
55
54
  clusteringLevel?: number;
56
55
  fadeEnabled?: boolean;
56
+ fadeOpacityEnabled?: boolean;
57
57
  clusteringAuto?: boolean;
58
58
  darkMode?: boolean;
59
59
  fadeAmount?: number;
60
60
  colorScheme?: string;
61
+ highlightColor?: string;
62
+ maxTopFlowsDisplayNum?: number;
61
63
  onHover?: (
62
- info: FlowLayerPickingInfo<L, F> | undefined,
64
+ info: FlowmapLayerPickingInfo<L, F> | undefined,
63
65
  event: SourceEvent,
64
66
  ) => void;
65
- onClick?: (info: FlowLayerPickingInfo<L, F>, event: SourceEvent) => void;
66
- } & Partial<FlowMapDataAccessors<L, F>> &
67
+ onClick?: (info: FlowmapLayerPickingInfo<L, F>, event: SourceEvent) => void;
68
+ } & Partial<FlowmapDataAccessors<L, F>> &
67
69
  LayerProps;
68
70
 
69
71
  enum HighlightType {
@@ -85,15 +87,15 @@ type HighlightedFlowObject = {
85
87
  type HighlightedObject = HighlightedLocationObject | HighlightedFlowObject;
86
88
 
87
89
  type State<L, F> = {
88
- accessors: FlowMapAggregateAccessors<L, F>;
89
- dataProvider: FlowMapDataProvider<L, F>;
90
+ accessors: FlowmapAggregateAccessors<L, F>;
91
+ dataProvider: FlowmapDataProvider<L, F>;
90
92
  layersData: LayersData | undefined;
91
93
  highlightedObject: HighlightedObject | undefined;
92
94
  };
93
95
 
94
96
  export type SourceEvent = {srcEvent: MouseEvent};
95
97
 
96
- export default class FlowMapLayer<L, F> extends CompositeLayer {
98
+ export default class FlowmapLayer<L, F> extends CompositeLayer {
97
99
  static defaultProps = {
98
100
  darkMode: true,
99
101
  fadeAmount: 50,
@@ -101,16 +103,23 @@ export default class FlowMapLayer<L, F> extends CompositeLayer {
101
103
  animationEnabled: false,
102
104
  clusteringEnabled: true,
103
105
  fadeEnabled: true,
106
+ fadeOpacityEnabled: false,
104
107
  clusteringAuto: true,
105
108
  clusteringLevel: undefined,
106
109
  adaptiveScalesEnabled: true,
107
110
  colorScheme: 'Teal',
111
+ highlightColor: 'orange',
112
+ maxTopFlowsDisplayNum: 5000,
108
113
  };
109
114
  state: State<L, F> | undefined;
110
115
 
111
- public constructor(props: FlowMapLayerProps<L, F>) {
116
+ public constructor(props: FlowmapLayerProps<L, F>) {
112
117
  super({
113
118
  ...props,
119
+ dataProvider: {
120
+ // To avoid deck.gl props diffing on comlink worker proxy causing an exception
121
+ dataProvider: props.dataProvider,
122
+ },
114
123
  onHover: (info: PickingInfo<any>, event: SourceEvent) => {
115
124
  // TODO: if (lastHoverEventStartTimeRef > startTime) {
116
125
  // // Skipping, because this is not the latest hover event
@@ -119,7 +128,7 @@ export default class FlowMapLayer<L, F> extends CompositeLayer {
119
128
  this.setState({highlightedObject: this._getHighlightedObject(info)});
120
129
  const {onHover} = props;
121
130
  if (onHover) {
122
- this._getFlowLayerPickingInfo(info).then((info) =>
131
+ this._getFlowmapLayerPickingInfo(info).then((info) =>
123
132
  onHover(info, event),
124
133
  );
125
134
  }
@@ -127,7 +136,7 @@ export default class FlowMapLayer<L, F> extends CompositeLayer {
127
136
  onClick: (info: PickingInfo<any>, event: SourceEvent) => {
128
137
  const {onClick} = props;
129
138
  if (onClick) {
130
- this._getFlowLayerPickingInfo(info).then((info) => {
139
+ this._getFlowmapLayerPickingInfo(info).then((info) => {
131
140
  if (info) {
132
141
  onClick(info, event);
133
142
  }
@@ -139,8 +148,8 @@ export default class FlowMapLayer<L, F> extends CompositeLayer {
139
148
 
140
149
  initializeState() {
141
150
  this.state = {
142
- accessors: new FlowMapAggregateAccessors<L, F>(this.props),
143
- dataProvider: this._makeDataProvider(),
151
+ accessors: new FlowmapAggregateAccessors<L, F>(this.props),
152
+ dataProvider: this._getOrMakeDataProvider(),
144
153
  layersData: undefined,
145
154
  highlightedObject: undefined,
146
155
  };
@@ -148,25 +157,25 @@ export default class FlowMapLayer<L, F> extends CompositeLayer {
148
157
 
149
158
  private _updateAccessors() {
150
159
  this.state?.dataProvider?.setAccessors(this.props);
151
- this.setState({accessors: new FlowMapAggregateAccessors(this.props)});
160
+ this.setState({accessors: new FlowmapAggregateAccessors(this.props)});
152
161
  }
153
162
 
154
- private _makeDataProvider() {
155
- const {data} = this.props;
156
- if (isFlowMapDataProvider<L, F>(data)) {
157
- return data;
158
- } else if (isFlowMapData<L, F>(data)) {
159
- const dataProvider = new LocalFlowMapDataProvider<L, F>(this.props);
160
- dataProvider.setFlowMapData(data);
163
+ private _getOrMakeDataProvider() {
164
+ const {data, dataProvider} = this.props;
165
+ if (isFlowmapDataProvider<L, F>(dataProvider?.dataProvider)) {
166
+ return dataProvider.dataProvider;
167
+ } else if (isFlowmapData<L, F>(data)) {
168
+ const dataProvider = new LocalFlowmapDataProvider<L, F>(this.props);
169
+ dataProvider.setFlowmapData(data);
161
170
  return dataProvider;
162
171
  }
163
172
  throw new Error(
164
- 'FlowMapLayer: data must be a FlowMapDataProvider or FlowMapData',
173
+ 'FlowmapLayer: data must be a FlowmapDataProvider or FlowmapData',
165
174
  );
166
175
  }
167
176
 
168
177
  private _updateDataProvider() {
169
- this.setState({dataProvider: this._makeDataProvider()});
178
+ this.setState({dataProvider: this._getOrMakeDataProvider()});
170
179
  }
171
180
 
172
181
  shouldUpdateState(params: Record<string, any>): boolean {
@@ -189,7 +198,7 @@ export default class FlowMapLayer<L, F> extends CompositeLayer {
189
198
  }
190
199
 
191
200
  if (changeFlags.propsChanged) {
192
- this._updateAccessors();
201
+ // this._updateAccessors();
193
202
  }
194
203
  if (changeFlags.dataChanged) {
195
204
  this._updateDataProvider();
@@ -200,8 +209,11 @@ export default class FlowMapLayer<L, F> extends CompositeLayer {
200
209
  });
201
210
  }
202
211
 
203
- if (changeFlags.viewportChanged || changeFlags.propsOrDataChanged) {
204
- dataProvider.setFlowMapState(this._getFlowMapState());
212
+ if (
213
+ changeFlags.viewportChanged ||
214
+ changeFlags.propsOrDataChanged // TODO can we ignore accessor props changes?
215
+ ) {
216
+ dataProvider.setFlowmapState(this._getFlowmapState());
205
217
  (async () => {
206
218
  const layersData = await dataProvider.getLayersData();
207
219
  this.setState({layersData});
@@ -217,10 +229,13 @@ export default class FlowMapLayer<L, F> extends CompositeLayer {
217
229
  clusteringEnabled,
218
230
  clusteringLevel,
219
231
  fadeEnabled,
232
+ fadeOpacityEnabled,
220
233
  clusteringAuto,
221
234
  darkMode,
222
235
  fadeAmount,
223
236
  colorScheme,
237
+ highlightColor,
238
+ maxTopFlowsDisplayNum,
224
239
  } = this.props;
225
240
  return {
226
241
  locationTotalsEnabled,
@@ -229,16 +244,19 @@ export default class FlowMapLayer<L, F> extends CompositeLayer {
229
244
  clusteringEnabled,
230
245
  clusteringLevel,
231
246
  fadeEnabled,
247
+ fadeOpacityEnabled,
232
248
  clusteringAuto,
233
249
  darkMode,
234
250
  fadeAmount,
235
251
  colorScheme,
252
+ highlightColor,
253
+ maxTopFlowsDisplayNum,
236
254
  };
237
255
  }
238
256
 
239
- private _getFlowMapState() {
257
+ private _getFlowmapState() {
240
258
  return {
241
- viewport: asViewState(this.context.viewport),
259
+ viewport: pickViewportProps(this.context.viewport),
242
260
  filterState: {
243
261
  selectedLocations: undefined,
244
262
  locationFilterMode: LocationFilterMode.ALL,
@@ -248,9 +266,9 @@ export default class FlowMapLayer<L, F> extends CompositeLayer {
248
266
  };
249
267
  }
250
268
 
251
- private async _getFlowLayerPickingInfo(
269
+ private async _getFlowmapLayerPickingInfo(
252
270
  info: Record<string, any>,
253
- ): Promise<FlowLayerPickingInfo<L, F> | undefined> {
271
+ ): Promise<FlowmapLayerPickingInfo<L, F> | undefined> {
254
272
  const {index, sourceLayer} = info;
255
273
  const {dataProvider, accessors} = this.state || {};
256
274
  if (!dataProvider || !accessors) {
@@ -330,9 +348,25 @@ export default class FlowMapLayer<L, F> extends CompositeLayer {
330
348
  ) {
331
349
  const {lineAttributes} = this.state?.layersData || {};
332
350
  if (lineAttributes) {
351
+ let attrs = getFlowLineAttributesByIndex(lineAttributes, index);
352
+ if (this.props.fadeOpacityEnabled) {
353
+ attrs = {
354
+ ...attrs,
355
+ attributes: {
356
+ ...attrs.attributes,
357
+ getColor: {
358
+ ...attrs.attributes.getColor,
359
+ value: new Uint8Array([
360
+ ...attrs.attributes.getColor.value.slice(0, 3),
361
+ 255, // the highlight color should be always opaque
362
+ ]),
363
+ },
364
+ },
365
+ };
366
+ }
333
367
  return {
334
368
  type: HighlightType.FLOW,
335
- lineAttributes: getFlowLineAttributesByIndex(lineAttributes, index),
369
+ lineAttributes: attrs,
336
370
  };
337
371
  }
338
372
  } else if (sourceLayer instanceof FlowCirclesLayer) {
@@ -354,9 +388,9 @@ export default class FlowMapLayer<L, F> extends CompositeLayer {
354
388
  const {layersData, highlightedObject} = this.state;
355
389
  const {circleAttributes, lineAttributes} = layersData || {};
356
390
  if (circleAttributes && lineAttributes) {
357
- const flowMapColors = getFlowMapColors(this._getSettingsState());
391
+ const flowmapColors = getFlowmapColors(this._getSettingsState());
358
392
  const outlineColor = colorAsRgba(
359
- flowMapColors.outlineColor || (this.props.darkMode ? '#000' : '#fff'),
393
+ flowmapColors.outlineColor || (this.props.darkMode ? '#000' : '#fff'),
360
394
  );
361
395
  const commonLineLayerProps = {
362
396
  data: lineAttributes,
@@ -395,8 +429,10 @@ export default class FlowMapLayer<L, F> extends CompositeLayer {
395
429
  this.getSubLayerProps({
396
430
  id: 'circles',
397
431
  data: circleAttributes,
398
- emptyColor: [0, 0, 0, 255],
399
- emptyOutlineColor: [0, 0, 0, 255],
432
+ emptyColor: this.props.darkMode
433
+ ? [0, 0, 0, 255]
434
+ : [255, 255, 255, 255],
435
+ outlineEmptyMix: 0.4,
400
436
  }),
401
437
  ),
402
438
  );
@@ -415,8 +451,7 @@ export default class FlowMapLayer<L, F> extends CompositeLayer {
415
451
  getLineWidth: 2,
416
452
  radiusUnits: 'pixels',
417
453
  getRadius: (d: HighlightedLocationObject) => d.radius,
418
- getLineColor: (d: HighlightedLocationObject) =>
419
- colorAsRgba('orange'),
454
+ getLineColor: colorAsRgba(this.props.highlightColor),
420
455
  getPosition: (d: HighlightedLocationObject) => d.centroid,
421
456
  }),
422
457
  }),
@@ -430,7 +465,7 @@ export default class FlowMapLayer<L, F> extends CompositeLayer {
430
465
  data: highlightedObject.lineAttributes,
431
466
  drawOutline: true,
432
467
  pickable: false,
433
- outlineColor: colorAsRgba('orange'),
468
+ outlineColor: colorAsRgba(this.props.highlightColor),
434
469
  outlineThickness: 1,
435
470
  }),
436
471
  }),
@@ -445,7 +480,7 @@ export default class FlowMapLayer<L, F> extends CompositeLayer {
445
480
  }
446
481
  }
447
482
 
448
- function asViewState(viewport: Record<string, any>): ViewportProps {
483
+ function pickViewportProps(viewport: Record<string, any>): ViewportProps {
449
484
  const {width, height, longitude, latitude, zoom, pitch, bearing} = viewport;
450
485
  return {
451
486
  width,
package/src/index.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  export {default as AnimatedFlowLinesLayer} from './AnimatedFlowLinesLayer';
2
2
  export {default as FlowLinesLayer} from './FlowLinesLayer';
3
3
  export {default as FlowCirclesLayer} from './FlowCirclesLayer';
4
- export {default as FlowMapLayer} from './FlowMapLayer';
5
- export type {FlowMapLayerProps} from './FlowMapLayer';
4
+ export {default as FlowmapLayer} from './FlowmapLayer';
5
+ export type {FlowmapLayerProps} from './FlowmapLayer';
6
6
 
7
7
  export * from './types';
package/src/types.ts CHANGED
@@ -45,7 +45,7 @@ export interface FlowPickingInfo<L, F> extends PickingInfo<F | AggregateFlow> {
45
45
  // object: FlowLocation;
46
46
  // }
47
47
 
48
- export type FlowLayerPickingInfo<L, F> =
48
+ export type FlowmapLayerPickingInfo<L, F> =
49
49
  | LocationPickingInfo<L>
50
50
  // | LocationAreaPickingInfo
51
51
  | FlowPickingInfo<L, F>;
@@ -1 +0,0 @@
1
- {"version":3,"file":"FlowMapLayer.d.ts","sourceRoot":"","sources":["../src/FlowMapLayer.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAC,cAAc,EAAC,MAAM,eAAe,CAAC;AAE7C,OAAO,EAEL,wBAAwB,EACxB,WAAW,EACX,oBAAoB,EACpB,mBAAmB,EAOnB,UAAU,EAIV,yBAAyB,EAG1B,MAAM,kBAAkB,CAAC;AAI1B,OAAO,EACL,oBAAoB,EACpB,UAAU,EAGX,MAAM,SAAS,CAAC;AAEjB,oBAAY,iBAAiB,CAAC,CAAC,EAAE,CAAC,IAAI;IACpC,IAAI,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpD,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,CACR,IAAI,EAAE,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS,EAC5C,KAAK,EAAE,WAAW,KACf,IAAI,CAAC;IACV,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;CAC1E,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GACrC,UAAU,CAAC;AAEb,aAAK,aAAa;IAChB,QAAQ,aAAa;IACrB,IAAI,SAAS;CACd;AAED,aAAK,yBAAyB,GAAG;IAC/B,IAAI,EAAE,aAAa,CAAC,QAAQ,CAAC;IAC7B,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,aAAK,qBAAqB,GAAG;IAC3B,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC;IACzB,cAAc,EAAE,wBAAwB,CAAC;CAC1C,CAAC;AAEF,aAAK,iBAAiB,GAAG,yBAAyB,GAAG,qBAAqB,CAAC;AAE3E,aAAK,KAAK,CAAC,CAAC,EAAE,CAAC,IAAI;IACjB,SAAS,EAAE,yBAAyB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3C,YAAY,EAAE,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACxC,UAAU,EAAE,UAAU,GAAG,SAAS,CAAC;IACnC,iBAAiB,EAAE,iBAAiB,GAAG,SAAS,CAAC;CAClD,CAAC;AAEF,oBAAY,WAAW,GAAG;IAAC,QAAQ,EAAE,UAAU,CAAA;CAAC,CAAC;AAEjD,MAAM,CAAC,OAAO,OAAO,YAAY,CAAC,CAAC,EAAE,CAAC,CAAE,SAAQ,cAAc;IAC5D,MAAM,CAAC,YAAY;;;;;;;;;;;MAWjB;IACF,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC;gBAEZ,KAAK,EAAE,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC;IA6BjD,eAAe;IASf,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,mBAAmB;IAI3B,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO;IAavD,WAAW,CAAC,EAAC,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IA2BtE,OAAO,CAAC,iBAAiB;IA2BzB,OAAO,CAAC,gBAAgB;YAYV,wBAAwB;IAuEtC,OAAO,CAAC,qBAAqB;IA6B7B,YAAY,IAAI,KAAK,CAAC,GAAG,CAAC;CA+F3B"}