@flowmap.gl/data 8.0.0-alpha.1 → 8.0.0-alpha.13

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 (97) hide show
  1. package/dist/FlowmapAggregateAccessors.d.ts +16 -0
  2. package/dist/FlowmapAggregateAccessors.d.ts.map +1 -0
  3. package/dist/FlowmapAggregateAccessors.js +46 -0
  4. package/dist/FlowmapSelectors.d.ts +188 -0
  5. package/dist/FlowmapSelectors.d.ts.map +1 -0
  6. package/dist/FlowmapSelectors.js +863 -0
  7. package/dist/FlowmapState.d.ts +27 -0
  8. package/dist/FlowmapState.d.ts.map +1 -0
  9. package/dist/FlowmapState.js +2 -0
  10. package/dist/cluster/cluster.d.ts.map +1 -1
  11. package/dist/cluster/cluster.js +8 -5
  12. package/dist/colors.d.ts +7 -7
  13. package/dist/colors.d.ts.map +1 -1
  14. package/dist/colors.js +55 -20
  15. package/dist/getViewStateForLocations.d.ts +18 -11
  16. package/dist/getViewStateForLocations.d.ts.map +1 -1
  17. package/dist/getViewStateForLocations.js +23 -20
  18. package/dist/index.d.ts +6 -6
  19. package/dist/index.js +6 -6
  20. package/dist/provider/FlowmapDataProvider.d.ts +16 -0
  21. package/dist/provider/FlowmapDataProvider.d.ts.map +1 -0
  22. package/dist/provider/FlowmapDataProvider.js +17 -0
  23. package/dist/provider/LocalFlowmapDataProvider.d.ts +20 -0
  24. package/dist/provider/LocalFlowmapDataProvider.d.ts.map +1 -0
  25. package/dist/provider/LocalFlowmapDataProvider.js +98 -0
  26. package/dist/types.d.ts +6 -4
  27. package/dist/types.d.ts.map +1 -1
  28. package/dist/types.js +1 -1
  29. package/dist/util.d.ts +0 -1
  30. package/dist/util.d.ts.map +1 -1
  31. package/dist/util.js +1 -4
  32. package/dist-es5/FlowmapAggregateAccessors.d.ts +16 -0
  33. package/dist-es5/FlowmapAggregateAccessors.d.ts.map +1 -0
  34. package/dist-es5/FlowmapAggregateAccessors.js +57 -0
  35. package/{dist/FlowMapSelectors.d.ts → dist-es5/FlowmapSelectors.d.ts} +55 -49
  36. package/dist-es5/FlowmapSelectors.d.ts.map +1 -0
  37. package/dist-es5/FlowmapSelectors.js +1507 -0
  38. package/{dist/FlowMapState.d.ts → dist-es5/FlowmapState.d.ts} +6 -3
  39. package/dist-es5/FlowmapState.d.ts.map +1 -0
  40. package/dist-es5/FlowmapState.js +3 -0
  41. package/dist-es5/cluster/ClusterIndex.d.ts +42 -0
  42. package/dist-es5/cluster/ClusterIndex.d.ts.map +1 -0
  43. package/dist-es5/cluster/ClusterIndex.js +297 -0
  44. package/dist-es5/cluster/cluster.d.ts +31 -0
  45. package/dist-es5/cluster/cluster.d.ts.map +1 -0
  46. package/dist-es5/cluster/cluster.js +266 -0
  47. package/dist-es5/colors.d.ts +103 -0
  48. package/dist-es5/colors.d.ts.map +1 -0
  49. package/dist-es5/colors.js +510 -0
  50. package/dist-es5/getViewStateForLocations.d.ts +23 -0
  51. package/dist-es5/getViewStateForLocations.d.ts.map +1 -0
  52. package/dist-es5/getViewStateForLocations.js +64 -0
  53. package/dist-es5/index.d.ts +11 -0
  54. package/dist-es5/index.d.ts.map +1 -0
  55. package/dist-es5/index.js +28 -0
  56. package/dist-es5/provider/FlowmapDataProvider.d.ts +16 -0
  57. package/dist-es5/provider/FlowmapDataProvider.d.ts.map +1 -0
  58. package/dist-es5/provider/FlowmapDataProvider.js +22 -0
  59. package/dist-es5/provider/LocalFlowmapDataProvider.d.ts +20 -0
  60. package/dist-es5/provider/LocalFlowmapDataProvider.d.ts.map +1 -0
  61. package/dist-es5/provider/LocalFlowmapDataProvider.js +154 -0
  62. package/dist-es5/time.d.ts +24 -0
  63. package/dist-es5/time.d.ts.map +1 -0
  64. package/dist-es5/time.js +168 -0
  65. package/dist-es5/types.d.ts +118 -0
  66. package/dist-es5/types.d.ts.map +1 -0
  67. package/dist-es5/types.js +29 -0
  68. package/dist-es5/util.d.ts +5 -0
  69. package/dist-es5/util.d.ts.map +1 -0
  70. package/dist-es5/util.js +14 -0
  71. package/package.json +7 -5
  72. package/src/{FlowMapAggregateAccessors.ts → FlowmapAggregateAccessors.ts} +14 -9
  73. package/src/{FlowMapSelectors.ts → FlowmapSelectors.ts} +213 -178
  74. package/src/{FlowMapState.ts → FlowmapState.ts} +5 -2
  75. package/src/cluster/cluster.ts +7 -4
  76. package/src/colors.ts +65 -21
  77. package/src/getViewStateForLocations.ts +41 -35
  78. package/src/index.ts +6 -6
  79. package/src/provider/{FlowMapDataProvider.ts → FlowmapDataProvider.ts} +14 -12
  80. package/src/provider/LocalFlowmapDataProvider.ts +122 -0
  81. package/src/types.ts +6 -4
  82. package/src/util.ts +0 -4
  83. package/tsconfig.es5.json +11 -0
  84. package/dist/FlowMapAggregateAccessors.d.ts +0 -15
  85. package/dist/FlowMapAggregateAccessors.d.ts.map +0 -1
  86. package/dist/FlowMapAggregateAccessors.js +0 -43
  87. package/dist/FlowMapSelectors.d.ts.map +0 -1
  88. package/dist/FlowMapSelectors.js +0 -834
  89. package/dist/FlowMapState.d.ts.map +0 -1
  90. package/dist/FlowMapState.js +0 -2
  91. package/dist/provider/FlowMapDataProvider.d.ts +0 -16
  92. package/dist/provider/FlowMapDataProvider.d.ts.map +0 -1
  93. package/dist/provider/FlowMapDataProvider.js +0 -17
  94. package/dist/provider/LocalFlowMapDataProvider.d.ts +0 -20
  95. package/dist/provider/LocalFlowMapDataProvider.d.ts.map +0 -1
  96. package/dist/provider/LocalFlowMapDataProvider.js +0 -87
  97. package/src/provider/LocalFlowMapDataProvider.ts +0 -105
@@ -7,6 +7,7 @@ export interface FilterState {
7
7
  export interface SettingsState {
8
8
  animationEnabled: boolean;
9
9
  fadeEnabled: boolean;
10
+ fadeOpacityEnabled: boolean;
10
11
  locationTotalsEnabled: boolean;
11
12
  adaptiveScalesEnabled: boolean;
12
13
  clusteringEnabled: boolean;
@@ -14,11 +15,13 @@ export interface SettingsState {
14
15
  clusteringLevel?: number;
15
16
  darkMode: boolean;
16
17
  fadeAmount: number;
17
- colorScheme: string | undefined;
18
+ colorScheme: string | string[] | undefined;
19
+ highlightColor: string;
20
+ maxTopFlowsDisplayNum: number;
18
21
  }
19
- export interface FlowMapState {
22
+ export interface FlowmapState {
20
23
  filterState: FilterState;
21
24
  settingsState: SettingsState;
22
25
  viewport: ViewportProps;
23
26
  }
24
- //# sourceMappingURL=FlowMapState.d.ts.map
27
+ //# sourceMappingURL=FlowmapState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FlowmapState.d.ts","sourceRoot":"","sources":["../src/FlowmapState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,kBAAkB,EAAE,aAAa,EAAC,MAAM,SAAS,CAAC;AAE1D,MAAM,WAAW,WAAW;IAC1B,iBAAiB,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACxC,iBAAiB,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,SAAS,CAAC;IAC5C,kBAAkB,EAAE,kBAAkB,CAAC;CACxC;AAED,MAAM,WAAW,aAAa;IAC5B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,WAAW,EAAE,OAAO,CAAC;IACrB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,cAAc,EAAE,OAAO,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;IAC3C,cAAc,EAAE,MAAM,CAAC;IACvB,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,WAAW,CAAC;IACzB,aAAa,EAAE,aAAa,CAAC;IAC7B,QAAQ,EAAE,aAAa,CAAC;CACzB"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd21hcFN0YXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0Zsb3dtYXBTdGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtMb2NhdGlvbkZpbHRlck1vZGUsIFZpZXdwb3J0UHJvcHN9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZpbHRlclN0YXRlIHtcbiAgc2VsZWN0ZWRMb2NhdGlvbnM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuICBzZWxlY3RlZFRpbWVSYW5nZTogW0RhdGUsIERhdGVdIHwgdW5kZWZpbmVkO1xuICBsb2NhdGlvbkZpbHRlck1vZGU6IExvY2F0aW9uRmlsdGVyTW9kZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZXR0aW5nc1N0YXRlIHtcbiAgYW5pbWF0aW9uRW5hYmxlZDogYm9vbGVhbjtcbiAgZmFkZUVuYWJsZWQ6IGJvb2xlYW47XG4gIGZhZGVPcGFjaXR5RW5hYmxlZDogYm9vbGVhbjtcbiAgbG9jYXRpb25Ub3RhbHNFbmFibGVkOiBib29sZWFuO1xuICBhZGFwdGl2ZVNjYWxlc0VuYWJsZWQ6IGJvb2xlYW47XG4gIGNsdXN0ZXJpbmdFbmFibGVkOiBib29sZWFuO1xuICBjbHVzdGVyaW5nQXV0bzogYm9vbGVhbjtcbiAgY2x1c3RlcmluZ0xldmVsPzogbnVtYmVyO1xuICBkYXJrTW9kZTogYm9vbGVhbjtcbiAgZmFkZUFtb3VudDogbnVtYmVyO1xuICBjb2xvclNjaGVtZTogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQ7XG4gIGhpZ2hsaWdodENvbG9yOiBzdHJpbmc7XG4gIG1heFRvcEZsb3dzRGlzcGxheU51bTogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZsb3dtYXBTdGF0ZSB7XG4gIGZpbHRlclN0YXRlOiBGaWx0ZXJTdGF0ZTtcbiAgc2V0dGluZ3NTdGF0ZTogU2V0dGluZ3NTdGF0ZTtcbiAgdmlld3BvcnQ6IFZpZXdwb3J0UHJvcHM7XG59XG4iXX0=
@@ -0,0 +1,42 @@
1
+ import { AggregateFlow, Cluster, ClusterLevels, ClusterNode, FlowAccessors, FlowCountsMapReduce } from './../types';
2
+ export declare type LocationWeightGetter = (id: string) => number;
3
+ /**
4
+ * A data structure representing the cluster levels for efficient flow aggregation.
5
+ */
6
+ export interface ClusterIndex<F> {
7
+ availableZoomLevels: number[];
8
+ getClusterById: (clusterId: string) => Cluster | undefined;
9
+ /**
10
+ * List the nodes on the given zoom level.
11
+ */
12
+ getClusterNodesFor: (zoom: number | undefined) => ClusterNode[] | undefined;
13
+ /**
14
+ * Get the min zoom level on which the location is not clustered.
15
+ */
16
+ getMinZoomForLocation: (locationId: string) => number;
17
+ /**
18
+ * List the IDs of all locations in the cluster (leaves of the subtree starting in the cluster).
19
+ */
20
+ expandCluster: (cluster: Cluster, targetZoom?: number) => string[];
21
+ /**
22
+ * Find the cluster the given location is residing in on the specified zoom level.
23
+ */
24
+ findClusterFor: (locationId: string, zoom: number) => string | undefined;
25
+ /**
26
+ * Aggregate flows for the specified zoom level.
27
+ */
28
+ aggregateFlows: (flows: F[], zoom: number, { getFlowOriginId, getFlowDestId, getFlowMagnitude }: FlowAccessors<F>, options?: {
29
+ flowCountsMapReduce?: FlowCountsMapReduce<F>;
30
+ }) => (F | AggregateFlow)[];
31
+ }
32
+ /**
33
+ * Build ClusterIndex from the given cluster hierarchy
34
+ */
35
+ export declare function buildIndex<F>(clusterLevels: ClusterLevels): ClusterIndex<F>;
36
+ export declare function makeLocationWeightGetter<F>(flows: F[], { getFlowOriginId, getFlowDestId, getFlowMagnitude }: FlowAccessors<F>): LocationWeightGetter;
37
+ /**
38
+ * @param availableZoomLevels Must be sorted in ascending order
39
+ * @param targetZoom
40
+ */
41
+ export declare function findAppropriateZoomLevel(availableZoomLevels: number[], targetZoom: number): number;
42
+ //# sourceMappingURL=ClusterIndex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClusterIndex.d.ts","sourceRoot":"","sources":["../../src/cluster/ClusterIndex.ts"],"names":[],"mappings":"AAkBA,OAAO,EACL,aAAa,EACb,OAAO,EACP,aAAa,EACb,WAAW,EACX,aAAa,EACb,mBAAmB,EAEpB,MAAM,YAAY,CAAC;AAGpB,oBAAY,oBAAoB,GAAG,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC;AAE1D;;GAEG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,cAAc,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,GAAG,SAAS,CAAC;IAC3D;;OAEG;IACH,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,KAAK,WAAW,EAAE,GAAG,SAAS,CAAC;IAC5E;;OAEG;IACH,qBAAqB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,MAAM,CAAC;IACtD;;OAEG;IACH,aAAa,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;IACnE;;OAEG;IACH,cAAc,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IACzE;;OAEG;IACH,cAAc,EAAE,CACd,KAAK,EAAE,CAAC,EAAE,EACV,IAAI,EAAE,MAAM,EACZ,EAAC,eAAe,EAAE,aAAa,EAAE,gBAAgB,EAAC,EAAE,aAAa,CAAC,CAAC,CAAC,EACpE,OAAO,CAAC,EAAE;QACR,mBAAmB,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC;KAC9C,KACE,CAAC,CAAC,GAAG,aAAa,CAAC,EAAE,CAAC;CAC5B;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,aAAa,EAAE,aAAa,GAAG,YAAY,CAAC,CAAC,CAAC,CAqJ3E;AAED,wBAAgB,wBAAwB,CAAC,CAAC,EACxC,KAAK,EAAE,CAAC,EAAE,EACV,EAAC,eAAe,EAAE,aAAa,EAAE,gBAAgB,EAAC,EAAE,aAAa,CAAC,CAAC,CAAC,GACnE,oBAAoB,CAuBtB;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,mBAAmB,EAAE,MAAM,EAAE,EAC7B,UAAU,EAAE,MAAM,UAWnB"}
@@ -0,0 +1,297 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright 2022 FlowmapBlue
4
+ * Copyright 2018-2020 Teralytics, modified by FlowmapBlue
5
+ *
6
+ * Licensed under the Apache License, Version 2.0 (the "License");
7
+ * you may not use this file except in compliance with the License.
8
+ * You may obtain a copy of the License at
9
+ *
10
+ * http://www.apache.org/licenses/LICENSE-2.0
11
+ *
12
+ * Unless required by applicable law or agreed to in writing, software
13
+ * distributed under the License is distributed on an "AS IS" BASIS,
14
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ * See the License for the specific language governing permissions and
16
+ * limitations under the License.
17
+ *
18
+ */
19
+ var __values = (this && this.__values) || function(o) {
20
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
21
+ if (m) return m.call(o);
22
+ if (o && typeof o.length === "number") return {
23
+ next: function () {
24
+ if (o && i >= o.length) o = void 0;
25
+ return { value: o && o[i++], done: !o };
26
+ }
27
+ };
28
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
29
+ };
30
+ var __read = (this && this.__read) || function (o, n) {
31
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
32
+ if (!m) return o;
33
+ var i = m.call(o), r, ar = [], e;
34
+ try {
35
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
36
+ }
37
+ catch (error) { e = { error: error }; }
38
+ finally {
39
+ try {
40
+ if (r && !r.done && (m = i["return"])) m.call(i);
41
+ }
42
+ finally { if (e) throw e.error; }
43
+ }
44
+ return ar;
45
+ };
46
+ Object.defineProperty(exports, "__esModule", { value: true });
47
+ exports.findAppropriateZoomLevel = exports.makeLocationWeightGetter = exports.buildIndex = void 0;
48
+ var types_1 = require("./../types");
49
+ var d3_array_1 = require("d3-array");
50
+ /**
51
+ * Build ClusterIndex from the given cluster hierarchy
52
+ */
53
+ function buildIndex(clusterLevels) {
54
+ var e_1, _a, e_2, _b, e_3, _c;
55
+ var nodesByZoom = new Map();
56
+ var clustersById = new Map();
57
+ var minZoomByLocationId = new Map();
58
+ try {
59
+ for (var clusterLevels_1 = __values(clusterLevels), clusterLevels_1_1 = clusterLevels_1.next(); !clusterLevels_1_1.done; clusterLevels_1_1 = clusterLevels_1.next()) {
60
+ var _d = clusterLevels_1_1.value, zoom = _d.zoom, nodes = _d.nodes;
61
+ nodesByZoom.set(zoom, nodes);
62
+ try {
63
+ for (var nodes_1 = (e_2 = void 0, __values(nodes)), nodes_1_1 = nodes_1.next(); !nodes_1_1.done; nodes_1_1 = nodes_1.next()) {
64
+ var node = nodes_1_1.value;
65
+ if ((0, types_1.isCluster)(node)) {
66
+ clustersById.set(node.id, node);
67
+ }
68
+ else {
69
+ var id = node.id;
70
+ var mz = minZoomByLocationId.get(id);
71
+ if (mz == null || mz > zoom) {
72
+ minZoomByLocationId.set(id, zoom);
73
+ }
74
+ }
75
+ }
76
+ }
77
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
78
+ finally {
79
+ try {
80
+ if (nodes_1_1 && !nodes_1_1.done && (_b = nodes_1.return)) _b.call(nodes_1);
81
+ }
82
+ finally { if (e_2) throw e_2.error; }
83
+ }
84
+ }
85
+ }
86
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
87
+ finally {
88
+ try {
89
+ if (clusterLevels_1_1 && !clusterLevels_1_1.done && (_a = clusterLevels_1.return)) _a.call(clusterLevels_1);
90
+ }
91
+ finally { if (e_1) throw e_1.error; }
92
+ }
93
+ var _e = __read((0, d3_array_1.extent)(clusterLevels, function (cl) { return cl.zoom; }), 2), minZoom = _e[0], maxZoom = _e[1];
94
+ if (minZoom == null || maxZoom == null) {
95
+ throw new Error('Could not determine minZoom or maxZoom');
96
+ }
97
+ var leavesToClustersByZoom = new Map();
98
+ var _loop_1 = function (cluster) {
99
+ var zoom = cluster.zoom;
100
+ var leavesToClusters = leavesToClustersByZoom.get(zoom);
101
+ if (!leavesToClusters) {
102
+ leavesToClusters = new Map();
103
+ leavesToClustersByZoom.set(zoom, leavesToClusters);
104
+ }
105
+ visitClusterLeaves(cluster, function (leafId) {
106
+ leavesToClusters === null || leavesToClusters === void 0 ? void 0 : leavesToClusters.set(leafId, cluster);
107
+ });
108
+ };
109
+ try {
110
+ for (var _f = __values(clustersById.values()), _g = _f.next(); !_g.done; _g = _f.next()) {
111
+ var cluster = _g.value;
112
+ _loop_1(cluster);
113
+ }
114
+ }
115
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
116
+ finally {
117
+ try {
118
+ if (_g && !_g.done && (_c = _f.return)) _c.call(_f);
119
+ }
120
+ finally { if (e_3) throw e_3.error; }
121
+ }
122
+ function visitClusterLeaves(cluster, visit) {
123
+ var e_4, _a;
124
+ try {
125
+ for (var _b = __values(cluster.children), _c = _b.next(); !_c.done; _c = _b.next()) {
126
+ var childId = _c.value;
127
+ var child = clustersById.get(childId);
128
+ if (child) {
129
+ visitClusterLeaves(child, visit);
130
+ }
131
+ else {
132
+ visit(childId);
133
+ }
134
+ }
135
+ }
136
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
137
+ finally {
138
+ try {
139
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
140
+ }
141
+ finally { if (e_4) throw e_4.error; }
142
+ }
143
+ }
144
+ var expandCluster = function (cluster, targetZoom) {
145
+ if (targetZoom === void 0) { targetZoom = maxZoom; }
146
+ var ids = [];
147
+ var visit = function (c, expandedIds) {
148
+ var e_5, _a;
149
+ if (targetZoom > c.zoom) {
150
+ try {
151
+ for (var _b = __values(c.children), _c = _b.next(); !_c.done; _c = _b.next()) {
152
+ var childId = _c.value;
153
+ var child = clustersById.get(childId);
154
+ if (child) {
155
+ visit(child, expandedIds);
156
+ }
157
+ else {
158
+ expandedIds.push(childId);
159
+ }
160
+ }
161
+ }
162
+ catch (e_5_1) { e_5 = { error: e_5_1 }; }
163
+ finally {
164
+ try {
165
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
166
+ }
167
+ finally { if (e_5) throw e_5.error; }
168
+ }
169
+ }
170
+ else {
171
+ expandedIds.push(c.id);
172
+ }
173
+ };
174
+ visit(cluster, ids);
175
+ return ids;
176
+ };
177
+ function findClusterFor(locationId, zoom) {
178
+ var leavesToClusters = leavesToClustersByZoom.get(zoom);
179
+ if (!leavesToClusters) {
180
+ return undefined;
181
+ }
182
+ var cluster = leavesToClusters.get(locationId);
183
+ return cluster ? cluster.id : undefined;
184
+ }
185
+ var availableZoomLevels = clusterLevels
186
+ .map(function (cl) { return +cl.zoom; })
187
+ .sort(function (a, b) { return (0, d3_array_1.ascending)(a, b); });
188
+ return {
189
+ availableZoomLevels: availableZoomLevels,
190
+ getClusterNodesFor: function (zoom) {
191
+ if (zoom === undefined) {
192
+ return undefined;
193
+ }
194
+ return nodesByZoom.get(zoom);
195
+ },
196
+ getClusterById: function (clusterId) { return clustersById.get(clusterId); },
197
+ getMinZoomForLocation: function (locationId) {
198
+ return minZoomByLocationId.get(locationId) || minZoom;
199
+ },
200
+ expandCluster: expandCluster,
201
+ findClusterFor: findClusterFor,
202
+ aggregateFlows: function (flows, zoom, _a, options) {
203
+ var e_6, _b;
204
+ var getFlowOriginId = _a.getFlowOriginId, getFlowDestId = _a.getFlowDestId, getFlowMagnitude = _a.getFlowMagnitude;
205
+ if (options === void 0) { options = {}; }
206
+ if (zoom > maxZoom) {
207
+ return flows;
208
+ }
209
+ var result = [];
210
+ var aggFlowsByKey = new Map();
211
+ var makeKey = function (origin, dest) { return "".concat(origin, ":").concat(dest); };
212
+ var _c = options.flowCountsMapReduce, flowCountsMapReduce = _c === void 0 ? {
213
+ map: getFlowMagnitude,
214
+ reduce: function (acc, count) { return (acc || 0) + count; },
215
+ } : _c;
216
+ try {
217
+ for (var flows_1 = __values(flows), flows_1_1 = flows_1.next(); !flows_1_1.done; flows_1_1 = flows_1.next()) {
218
+ var flow = flows_1_1.value;
219
+ var origin_1 = getFlowOriginId(flow);
220
+ var dest = getFlowDestId(flow);
221
+ var originCluster = findClusterFor(origin_1, zoom) || origin_1;
222
+ var destCluster = findClusterFor(dest, zoom) || dest;
223
+ var key = makeKey(originCluster, destCluster);
224
+ if (originCluster === origin_1 && destCluster === dest) {
225
+ result.push(flow);
226
+ }
227
+ else {
228
+ var aggregateFlow = aggFlowsByKey.get(key);
229
+ if (!aggregateFlow) {
230
+ aggregateFlow = {
231
+ origin: originCluster,
232
+ dest: destCluster,
233
+ count: flowCountsMapReduce.map(flow),
234
+ aggregate: true,
235
+ };
236
+ result.push(aggregateFlow);
237
+ aggFlowsByKey.set(key, aggregateFlow);
238
+ }
239
+ else {
240
+ aggregateFlow.count = flowCountsMapReduce.reduce(aggregateFlow.count, flowCountsMapReduce.map(flow));
241
+ }
242
+ }
243
+ }
244
+ }
245
+ catch (e_6_1) { e_6 = { error: e_6_1 }; }
246
+ finally {
247
+ try {
248
+ if (flows_1_1 && !flows_1_1.done && (_b = flows_1.return)) _b.call(flows_1);
249
+ }
250
+ finally { if (e_6) throw e_6.error; }
251
+ }
252
+ return result;
253
+ },
254
+ };
255
+ }
256
+ exports.buildIndex = buildIndex;
257
+ function makeLocationWeightGetter(flows, _a) {
258
+ var e_7, _b;
259
+ var getFlowOriginId = _a.getFlowOriginId, getFlowDestId = _a.getFlowDestId, getFlowMagnitude = _a.getFlowMagnitude;
260
+ var locationTotals = {
261
+ incoming: new Map(),
262
+ outgoing: new Map(),
263
+ };
264
+ try {
265
+ for (var flows_2 = __values(flows), flows_2_1 = flows_2.next(); !flows_2_1.done; flows_2_1 = flows_2.next()) {
266
+ var flow = flows_2_1.value;
267
+ var origin_2 = getFlowOriginId(flow);
268
+ var dest = getFlowDestId(flow);
269
+ var count = getFlowMagnitude(flow);
270
+ locationTotals.incoming.set(dest, (locationTotals.incoming.get(dest) || 0) + count);
271
+ locationTotals.outgoing.set(origin_2, (locationTotals.outgoing.get(origin_2) || 0) + count);
272
+ }
273
+ }
274
+ catch (e_7_1) { e_7 = { error: e_7_1 }; }
275
+ finally {
276
+ try {
277
+ if (flows_2_1 && !flows_2_1.done && (_b = flows_2.return)) _b.call(flows_2);
278
+ }
279
+ finally { if (e_7) throw e_7.error; }
280
+ }
281
+ return function (id) {
282
+ return Math.max(Math.abs(locationTotals.incoming.get(id) || 0), Math.abs(locationTotals.outgoing.get(id) || 0));
283
+ };
284
+ }
285
+ exports.makeLocationWeightGetter = makeLocationWeightGetter;
286
+ /**
287
+ * @param availableZoomLevels Must be sorted in ascending order
288
+ * @param targetZoom
289
+ */
290
+ function findAppropriateZoomLevel(availableZoomLevels, targetZoom) {
291
+ if (!availableZoomLevels.length) {
292
+ throw new Error('No available zoom levels');
293
+ }
294
+ return availableZoomLevels[Math.min((0, d3_array_1.bisectLeft)(availableZoomLevels, Math.floor(targetZoom)), availableZoomLevels.length - 1)];
295
+ }
296
+ exports.findAppropriateZoomLevel = findAppropriateZoomLevel;
297
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2x1c3RlckluZGV4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsdXN0ZXIvQ2x1c3RlckluZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUgsb0NBUW9CO0FBQ3BCLHFDQUF1RDtBQXVDdkQ7O0dBRUc7QUFDSCxTQUFnQixVQUFVLENBQUksYUFBNEI7O0lBQ3hELElBQU0sV0FBVyxHQUFHLElBQUksR0FBRyxFQUF5QixDQUFDO0lBQ3JELElBQU0sWUFBWSxHQUFHLElBQUksR0FBRyxFQUFtQixDQUFDO0lBQ2hELElBQU0sbUJBQW1CLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7O1FBQ3RELEtBQTRCLElBQUEsa0JBQUEsU0FBQSxhQUFhLENBQUEsNENBQUEsdUVBQUU7WUFBaEMsSUFBQSw0QkFBYSxFQUFaLElBQUksVUFBQSxFQUFFLEtBQUssV0FBQTtZQUNyQixXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQzs7Z0JBQzdCLEtBQW1CLElBQUEseUJBQUEsU0FBQSxLQUFLLENBQUEsQ0FBQSw0QkFBQSwrQ0FBRTtvQkFBckIsSUFBTSxJQUFJLGtCQUFBO29CQUNiLElBQUksSUFBQSxpQkFBUyxFQUFDLElBQUksQ0FBQyxFQUFFO3dCQUNuQixZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7cUJBQ2pDO3lCQUFNO3dCQUNFLElBQUEsRUFBRSxHQUFJLElBQUksR0FBUixDQUFTO3dCQUNsQixJQUFNLEVBQUUsR0FBRyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7d0JBQ3ZDLElBQUksRUFBRSxJQUFJLElBQUksSUFBSSxFQUFFLEdBQUcsSUFBSSxFQUFFOzRCQUMzQixtQkFBbUIsQ0FBQyxHQUFHLENBQUMsRUFB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bnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAyMDIyIEZsb3dtYXBCbHVlXG4gKiBDb3B5cmlnaHQgMjAxOC0yMDIwIFRlcmFseXRpY3MsIG1vZGlmaWVkIGJ5IEZsb3dtYXBCbHVlXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICovXG5cbmltcG9ydCB7XG4gIEFnZ3JlZ2F0ZUZsb3csXG4gIENsdXN0ZXIsXG4gIENsdXN0ZXJMZXZlbHMsXG4gIENsdXN0ZXJOb2RlLFxuICBGbG93QWNjZXNzb3JzLFxuICBGbG93Q291bnRzTWFwUmVkdWNlLFxuICBpc0NsdXN0ZXIsXG59IGZyb20gJy4vLi4vdHlwZXMnO1xuaW1wb3J0IHthc2NlbmRpbmcsIGJpc2VjdExlZnQsIGV4dGVudH0gZnJvbSAnZDMtYXJyYXknO1xuXG5leHBvcnQgdHlwZSBMb2NhdGlvbldlaWdodEdldHRlciA9IChpZDogc3RyaW5nKSA9PiBudW1iZXI7XG5cbi8qKlxuICogQSBkYXRhIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgdGhlIGNsdXN0ZXIgbGV2ZWxzIGZvciBlZmZpY2llbnQgZmxvdyBhZ2dyZWdhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbHVzdGVySW5kZXg8Rj4ge1xuICBhdmFpbGFibGVab29tTGV2ZWxzOiBudW1iZXJbXTtcbiAgZ2V0Q2x1c3RlckJ5SWQ6IChjbHVzdGVySWQ6IHN0cmluZykgPT4gQ2x1c3RlciB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIExpc3QgdGhlIG5vZGVzIG9uIHRoZSBnaXZlbiB6b29tIGxldmVsLlxuICAgKi9cbiAgZ2V0Q2x1c3Rlck5vZGVzRm9yOiAoem9vbTogbnVtYmVyIHwgdW5kZWZpbmVkKSA9PiBDbHVzdGVyTm9kZVtdIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogR2V0IHRoZSBtaW4gem9vbSBsZXZlbCBvbiB3aGljaCB0aGUgbG9jYXRpb24gaXMgbm90IGNsdXN0ZXJlZC5cbiAgICovXG4gIGdldE1pblpvb21Gb3JMb2NhdGlvbjogKGxvY2F0aW9uSWQ6IHN0cmluZykgPT4gbnVtYmVyO1xuICAvKipcbiAgICogTGlzdCB0aGUgSURzIG9mIGFsbCBsb2NhdGlvbnMgaW4gdGhlIGNsdXN0ZXIgKGxlYXZlcyBvZiB0aGUgc3VidHJlZSBzdGFydGluZyBpbiB0aGUgY2x1c3RlcikuXG4gICAqL1xuICBleHBhbmRDbHVzdGVyOiAoY2x1c3RlcjogQ2x1c3RlciwgdGFyZ2V0Wm9vbT86IG51bWJlcikgPT4gc3RyaW5nW107XG4gIC8qKlxuICAgKiBGaW5kIHRoZSBjbHVzdGVyIHRoZSBnaXZlbiBsb2NhdGlvbiBpcyByZXNpZGluZyBpbiBvbiB0aGUgc3BlY2lmaWVkIHpvb20gbGV2ZWwuXG4gICAqL1xuICBmaW5kQ2x1c3RlckZvcjogKGxvY2F0aW9uSWQ6IHN0cmluZywgem9vbTogbnVtYmVyKSA9PiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBBZ2dyZWdhdGUgZmxvd3MgZm9yIHRoZSBzcGVjaWZpZWQgem9vbSBsZXZlbC5cbiAgICovXG4gIGFnZ3JlZ2F0ZUZsb3dzOiAoXG4gICAgZmxvd3M6IEZbXSxcbiAgICB6b29tOiBudW1iZXIsXG4gICAge2dldEZsb3dPcmlnaW5JZCwgZ2V0Rmxvd0Rlc3RJZCwgZ2V0Rmxvd01hZ25pdHVkZX06IEZsb3dBY2Nlc3NvcnM8Rj4sXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIGZsb3dDb3VudHNNYXBSZWR1Y2U/OiBGbG93Q291bnRzTWFwUmVkdWNlPEY+O1xuICAgIH0sXG4gICkgPT4gKEYgfCBBZ2dyZWdhdGVGbG93KVtdO1xufVxuXG4vKipcbiAqIEJ1aWxkIENsdXN0ZXJJbmRleCBmcm9tIHRoZSBnaXZlbiBjbHVzdGVyIGhpZXJhcmNoeVxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRJbmRleDxGPihjbHVzdGVyTGV2ZWxzOiBDbHVzdGVyTGV2ZWxzKTogQ2x1c3RlckluZGV4PEY+IHtcbiAgY29uc3Qgbm9kZXNCeVpvb20gPSBuZXcgTWFwPG51bWJlciwgQ2x1c3Rlck5vZGVbXT4oKTtcbiAgY29uc3QgY2x1c3RlcnNCeUlkID0gbmV3IE1hcDxzdHJpbmcsIENsdXN0ZXI+KCk7XG4gIGNvbnN0IG1pblpvb21CeUxvY2F0aW9uSWQgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBmb3IgKGNvbnN0IHt6b29tLCBub2Rlc30gb2YgY2x1c3RlckxldmVscykge1xuICAgIG5vZGVzQnlab29tLnNldCh6b29tLCBub2Rlcyk7XG4gICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XG4gICAgICBpZiAoaXNDbHVzdGVyKG5vZGUpKSB7XG4gICAgICAgIGNsdXN0ZXJzQnlJZC5zZXQobm9kZS5pZCwgbm9kZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB7aWR9ID0gbm9kZTtcbiAgICAgICAgY29uc3QgbXogPSBtaW5ab29tQnlMb2NhdGlvbklkLmdldChpZCk7XG4gICAgICAgIGlmIChteiA9PSBudWxsIHx8IG16ID4gem9vbSkge1xuICAgICAgICAgIG1pblpvb21CeUxvY2F0aW9uSWQuc2V0KGlkLCB6b29tKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IFttaW5ab29tLCBtYXhab29tXSA9IGV4dGVudChjbHVzdGVyTGV2ZWxzLCAoY2wpID0+IGNsLnpvb20pO1xuICBpZiAobWluWm9vbSA9PSBudWxsIHx8IG1heFpvb20gPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGRldGVybWluZSBtaW5ab29tIG9yIG1heFpvb20nKTtcbiAgfVxuXG4gIGNvbnN0IGxlYXZlc1RvQ2x1c3RlcnNCeVpvb20gPSBuZXcgTWFwPG51bWJlciwgTWFwPHN0cmluZywgQ2x1c3Rlcj4+KCk7XG5cbiAgZm9yIChjb25zdCBjbHVzdGVyIG9mIGNsdXN0ZXJzQnlJZC52YWx1ZXMoKSkge1xuICAgIGNvbnN0IHt6b29tfSA9IGNsdXN0ZXI7XG4gICAgbGV0IGxlYXZlc1RvQ2x1c3RlcnMgPSBsZWF2ZXNUb0NsdXN0ZXJzQnlab29tLmdldCh6b29tKTtcbiAgICBpZiAoIWxlYXZlc1RvQ2x1c3RlcnMpIHtcbiAgICAgIGxlYXZlc1RvQ2x1c3RlcnMgPSBuZXcgTWFwPHN0cmluZywgQ2x1c3Rlcj4oKTtcbiAgICAgIGxlYXZlc1RvQ2x1c3RlcnNCeVpvb20uc2V0KHpvb20sIGxlYXZlc1RvQ2x1c3RlcnMpO1xuICAgIH1cbiAgICB2aXNpdENsdXN0ZXJMZWF2ZXMoY2x1c3RlciwgKGxlYWZJZCkgPT4ge1xuICAgICAgbGVhdmVzVG9DbHVzdGVycz8uc2V0KGxlYWZJZCwgY2x1c3Rlcik7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiB2aXNpdENsdXN0ZXJMZWF2ZXMoY2x1c3RlcjogQ2x1c3RlciwgdmlzaXQ6IChpZDogc3RyaW5nKSA9PiB2b2lkKSB7XG4gICAgZm9yIChjb25zdCBjaGlsZElkIG9mIGNsdXN0ZXIuY2hpbGRyZW4pIHtcbiAgICAgIGNvbnN0IGNoaWxkID0gY2x1c3RlcnNCeUlkLmdldChjaGlsZElkKTtcbiAgICAgIGlmIChjaGlsZCkge1xuICAgICAgICB2aXNpdENsdXN0ZXJMZWF2ZXMoY2hpbGQsIHZpc2l0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZpc2l0KGNoaWxkSWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGV4cGFuZENsdXN0ZXIgPSAoY2x1c3RlcjogQ2x1c3RlciwgdGFyZ2V0Wm9vbTogbnVtYmVyID0gbWF4Wm9vbSkgPT4ge1xuICAgIGNvbnN0IGlkczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCB2aXNpdCA9IChjOiBDbHVzdGVyLCBleHBhbmRlZElkczogc3RyaW5nW10pID0+IHtcbiAgICAgIGlmICh0YXJnZXRab29tID4gYy56b29tKSB7XG4gICAgICAgIGZvciAoY29uc3QgY2hpbGRJZCBvZiBjLmNoaWxkcmVuKSB7XG4gICAgICAgICAgY29uc3QgY2hpbGQgPSBjbHVzdGVyc0J5SWQuZ2V0KGNoaWxkSWQpO1xuICAgICAgICAgIGlmIChjaGlsZCkge1xuICAgICAgICAgICAgdmlzaXQoY2hpbGQsIGV4cGFuZGVkSWRzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXhwYW5kZWRJZHMucHVzaChjaGlsZElkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV4cGFuZGVkSWRzLnB1c2goYy5pZCk7XG4gICAgICB9XG4gICAgfTtcbiAgICB2aXNpdChjbHVzdGVyLCBpZHMpO1xuICAgIHJldHVybiBpZHM7XG4gIH07XG5cbiAgZnVuY3Rpb24gZmluZENsdXN0ZXJGb3IobG9jYXRpb25JZDogc3RyaW5nLCB6b29tOiBudW1iZXIpIHtcbiAgICBjb25zdCBsZWF2ZXNUb0NsdXN0ZXJzID0gbGVhdmVzVG9DbHVzdGVyc0J5Wm9vbS5nZXQoem9vbSk7XG4gICAgaWYgKCFsZWF2ZXNUb0NsdXN0ZXJzKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBjbHVzdGVyID0gbGVhdmVzVG9DbHVzdGVycy5nZXQobG9jYXRpb25JZCk7XG4gICAgcmV0dXJuIGNsdXN0ZXIgPyBjbHVzdGVyLmlkIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgYXZhaWxhYmxlWm9vbUxldmVscyA9IGNsdXN0ZXJMZXZlbHNcbiAgICAubWFwKChjbCkgPT4gK2NsLnpvb20pXG4gICAgLnNvcnQoKGEsIGIpID0+IGFzY2VuZGluZyhhLCBiKSk7XG5cbiAgcmV0dXJuIHtcbiAgICBhdmFpbGFibGVab29tTGV2ZWxzLFxuXG4gICAgZ2V0Q2x1c3Rlck5vZGVzRm9yOiAoem9vbSkgPT4ge1xuICAgICAgaWYgKHpvb20gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5vZGVzQnlab29tLmdldCh6b29tKTtcbiAgICB9LFxuXG4gICAgZ2V0Q2x1c3RlckJ5SWQ6IChjbHVzdGVySWQpID0+IGNsdXN0ZXJzQnlJZC5nZXQoY2x1c3RlcklkKSxcblxuICAgIGdldE1pblpvb21Gb3JMb2NhdGlvbjogKGxvY2F0aW9uSWQpID0+XG4gICAgICBtaW5ab29tQnlMb2NhdGlvbklkLmdldChsb2NhdGlvbklkKSB8fCBtaW5ab29tLFxuXG4gICAgZXhwYW5kQ2x1c3RlcixcblxuICAgIGZpbmRDbHVzdGVyRm9yLFxuXG4gICAgYWdncmVnYXRlRmxvd3M6IChcbiAgICAgIGZsb3dzLFxuICAgICAgem9vbSxcbiAgICAgIHtnZXRGbG93T3JpZ2luSWQsIGdldEZsb3dEZXN0SWQsIGdldEZsb3dNYWduaXR1ZGV9LFxuICAgICAgb3B0aW9ucyA9IHt9LFxuICAgICkgPT4ge1xuICAgICAgaWYgKHpvb20gPiBtYXhab29tKSB7XG4gICAgICAgIHJldHVybiBmbG93cztcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3VsdDogKEYgfCBBZ2dyZWdhdGVGbG93KVtdID0gW107XG4gICAgICBjb25zdCBhZ2dGbG93c0J5S2V5ID0gbmV3IE1hcDxzdHJpbmcsIEFnZ3JlZ2F0ZUZsb3c+KCk7XG4gICAgICBjb25zdCBtYWtlS2V5ID0gKG9yaWdpbjogc3RyaW5nLCBkZXN0OiBzdHJpbmcpID0+IGAke29yaWdpbn06JHtkZXN0fWA7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGZsb3dDb3VudHNNYXBSZWR1Y2UgPSB7XG4gICAgICAgICAgbWFwOiBnZXRGbG93TWFnbml0dWRlLFxuICAgICAgICAgIHJlZHVjZTogKGFjYzogYW55LCBjb3VudDogbnVtYmVyKSA9PiAoYWNjIHx8IDApICsgY291bnQsXG4gICAgICAgIH0sXG4gICAgICB9ID0gb3B0aW9ucztcbiAgICAgIGZvciAoY29uc3QgZmxvdyBvZiBmbG93cykge1xuICAgICAgICBjb25zdCBvcmlnaW4gPSBnZXRGbG93T3JpZ2luSWQoZmxvdyk7XG4gICAgICAgIGNvbnN0IGRlc3QgPSBnZXRGbG93RGVzdElkKGZsb3cpO1xuICAgICAgICBjb25zdCBvcmlnaW5DbHVzdGVyID0gZmluZENsdXN0ZXJGb3Iob3JpZ2luLCB6b29tKSB8fCBvcmlnaW47XG4gICAgICAgIGNvbnN0IGRlc3RDbHVzdGVyID0gZmluZENsdXN0ZXJGb3IoZGVzdCwgem9vbSkgfHwgZGVzdDtcbiAgICAgICAgY29uc3Qga2V5ID0gbWFrZUtleShvcmlnaW5DbHVzdGVyLCBkZXN0Q2x1c3Rlcik7XG4gICAgICAgIGlmIChvcmlnaW5DbHVzdGVyID09PSBvcmlnaW4gJiYgZGVzdENsdXN0ZXIgPT09IGRlc3QpIHtcbiAgICAgICAgICByZXN1bHQucHVzaChmbG93KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsZXQgYWdncmVnYXRlRmxvdyA9IGFnZ0Zsb3dzQnlLZXkuZ2V0KGtleSk7XG4gICAgICAgICAgaWYgKCFhZ2dyZWdhdGVGbG93KSB7XG4gICAgICAgICAgICBhZ2dyZWdhdGVGbG93ID0ge1xuICAgICAgICAgICAgICBvcmlnaW46IG9yaWdpbkNsdXN0ZXIsXG4gICAgICAgICAgICAgIGRlc3Q6IGRlc3RDbHVzdGVyLFxuICAgICAgICAgICAgICBjb3VudDogZmxvd0NvdW50c01hcFJlZHVjZS5tYXAoZmxvdyksXG4gICAgICAgICAgICAgIGFnZ3JlZ2F0ZTogdHJ1ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXN1bHQucHVzaChhZ2dyZWdhdGVGbG93KTtcbiAgICAgICAgICAgIGFnZ0Zsb3dzQnlLZXkuc2V0KGtleSwgYWdncmVnYXRlRmxvdyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFnZ3JlZ2F0ZUZsb3cuY291bnQgPSBmbG93Q291bnRzTWFwUmVkdWNlLnJlZHVjZShcbiAgICAgICAgICAgICAgYWdncmVnYXRlRmxvdy5jb3VudCxcbiAgICAgICAgICAgICAgZmxvd0NvdW50c01hcFJlZHVjZS5tYXAoZmxvdyksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFrZUxvY2F0aW9uV2VpZ2h0R2V0dGVyPEY+KFxuICBmbG93czogRltdLFxuICB7Z2V0Rmxvd09yaWdpbklkLCBnZXRGbG93RGVzdElkLCBnZXRGbG93TWFnbml0dWRlfTogRmxvd0FjY2Vzc29yczxGPixcbik6IExvY2F0aW9uV2VpZ2h0R2V0dGVyIHtcbiAgY29uc3QgbG9jYXRpb25Ub3RhbHMgPSB7XG4gICAgaW5jb21pbmc6IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCksXG4gICAgb3V0Z29pbmc6IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCksXG4gIH07XG4gIGZvciAoY29uc3QgZmxvdyBvZiBmbG93cykge1xuICAgIGNvbnN0IG9yaWdpbiA9IGdldEZsb3dPcmlnaW5JZChmbG93KTtcbiAgICBjb25zdCBkZXN0ID0gZ2V0Rmxvd0Rlc3RJZChmbG93KTtcbiAgICBjb25zdCBjb3VudCA9IGdldEZsb3dNYWduaXR1ZGUoZmxvdyk7XG4gICAgbG9jYXRpb25Ub3RhbHMuaW5jb21pbmcuc2V0KFxuICAgICAgZGVzdCxcbiAgICAgIChsb2NhdGlvblRvdGFscy5pbmNvbWluZy5nZXQoZGVzdCkgfHwgMCkgKyBjb3VudCxcbiAgICApO1xuICAgIGxvY2F0aW9uVG90YWxzLm91dGdvaW5nLnNldChcbiAgICAgIG9yaWdpbixcbiAgICAgIChsb2NhdGlvblRvdGFscy5vdXRnb2luZy5nZXQob3JpZ2luKSB8fCAwKSArIGNvdW50LFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIChpZDogc3RyaW5nKSA9PlxuICAgIE1hdGgubWF4KFxuICAgICAgTWF0aC5hYnMobG9jYXRpb25Ub3RhbHMuaW5jb21pbmcuZ2V0KGlkKSB8fCAwKSxcbiAgICAgIE1hdGguYWJzKGxvY2F0aW9uVG90YWxzLm91dGdvaW5nLmdldChpZCkgfHwgMCksXG4gICAgKTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gYXZhaWxhYmxlWm9vbUxldmVscyBNdXN0IGJlIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXJcbiAqIEBwYXJhbSB0YXJnZXRab29tXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQXBwcm9wcmlhdGVab29tTGV2ZWwoXG4gIGF2YWlsYWJsZVpvb21MZXZlbHM6IG51bWJlcltdLFxuICB0YXJnZXRab29tOiBudW1iZXIsXG4pIHtcbiAgaWYgKCFhdmFpbGFibGVab29tTGV2ZWxzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcignTm8gYXZhaWxhYmxlIHpvb20gbGV2ZWxzJyk7XG4gIH1cbiAgcmV0dXJuIGF2YWlsYWJsZVpvb21MZXZlbHNbXG4gICAgTWF0aC5taW4oXG4gICAgICBiaXNlY3RMZWZ0KGF2YWlsYWJsZVpvb21MZXZlbHMsIE1hdGguZmxvb3IodGFyZ2V0Wm9vbSkpLFxuICAgICAgYXZhaWxhYmxlWm9vbUxldmVscy5sZW5ndGggLSAxLFxuICAgIClcbiAgXTtcbn1cbiJdfQ==
@@ -0,0 +1,31 @@
1
+ import { LocationWeightGetter } from './ClusterIndex';
2
+ import { ClusterLevel, LocationAccessors } from '../types';
3
+ export interface Options {
4
+ minZoom: number;
5
+ maxZoom: number;
6
+ radius: number;
7
+ extent: number;
8
+ nodeSize: number;
9
+ makeClusterName: (id: number, numPoints: number) => string | undefined;
10
+ makeClusterId: (id: number) => string;
11
+ }
12
+ interface BasePoint {
13
+ x: number;
14
+ y: number;
15
+ weight: number;
16
+ zoom: number;
17
+ parentId: number;
18
+ }
19
+ interface LeafPoint extends BasePoint {
20
+ index: number;
21
+ }
22
+ interface ClusterPoint extends BasePoint {
23
+ id: number;
24
+ numPoints: number;
25
+ }
26
+ declare type Point = LeafPoint | ClusterPoint;
27
+ export declare function isLeafPoint(p: Point): p is LeafPoint;
28
+ export declare function isClusterPoint(p: Point): p is ClusterPoint;
29
+ export declare function clusterLocations<L>(locations: L[], locationAccessors: LocationAccessors<L>, getLocationWeight: LocationWeightGetter, options?: Partial<Options>): ClusterLevel[];
30
+ export {};
31
+ //# sourceMappingURL=cluster.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cluster.d.ts","sourceRoot":"","sources":["../../src/cluster/cluster.ts"],"names":[],"mappings":"AAwCA,OAAO,EAAC,oBAAoB,EAAC,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAU,YAAY,EAAe,iBAAiB,EAAC,MAAM,UAAU,CAAC;AAE/E,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IACvE,aAAa,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC;CACvC;AAYD,UAAU,SAAS;IACjB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,SAAU,SAAQ,SAAS;IACnC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,YAAa,SAAQ,SAAS;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,aAAK,KAAK,GAAG,SAAS,GAAG,YAAY,CAAC;AAEtC,wBAAgB,WAAW,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,IAAI,SAAS,CAGpD;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,IAAI,YAAY,CAG1D;AAID,wBAAgB,gBAAgB,CAAC,CAAC,EAChC,SAAS,EAAE,CAAC,EAAE,EACd,iBAAiB,EAAE,iBAAiB,CAAC,CAAC,CAAC,EACvC,iBAAiB,EAAE,oBAAoB,EACvC,OAAO,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,GACzB,YAAY,EAAE,CA8FhB"}