@unovis/ts 1.7.0-stellar.1 → 1.7.0-stellar.3
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.
|
@@ -64,6 +64,7 @@ export declare class TopoJSONMap<AreaDatum, PointDatum = unknown, LinkDatum = un
|
|
|
64
64
|
fitView(): void;
|
|
65
65
|
fitViewToFlows(pad?: number): void;
|
|
66
66
|
private _onPointClick;
|
|
67
|
+
private _clusterInScreenSpace;
|
|
67
68
|
private _expandCluster;
|
|
68
69
|
private _zoomToLocation;
|
|
69
70
|
private _resetExpandedCluster;
|
|
@@ -4,7 +4,6 @@ import { timeout } from 'd3-timer';
|
|
|
4
4
|
import { easeCubicInOut } from 'd3-ease';
|
|
5
5
|
import { geoPath } from 'd3-geo';
|
|
6
6
|
import { color } from 'd3-color';
|
|
7
|
-
import { packSiblings } from 'd3-hierarchy';
|
|
8
7
|
import { feature } from 'topojson-client';
|
|
9
8
|
import { ComponentCore } from '../../core/component/index.js';
|
|
10
9
|
import { MapGraphDataModel } from '../../data-models/map-graph.js';
|
|
@@ -15,7 +14,7 @@ import { rectIntersect, isStringCSSVariable, getCSSVariableValue } from '../../u
|
|
|
15
14
|
import { estimateStringPixelLength } from '../../utils/text.js';
|
|
16
15
|
import { MapProjection, TopoJSONMapPointShape, MapPointLabelPosition } from './types.js';
|
|
17
16
|
import { TopoJSONMapDefaultConfig } from './config.js';
|
|
18
|
-
import { calculateClusterIndex, getLonLat, arc, getDonutData, getPointPathData,
|
|
17
|
+
import { calculateClusterIndex, getLonLat, arc, getDonutData, getPointPathData, getNextZoomLevelOnClusterClick } from './utils.js';
|
|
19
18
|
import { updateDonut } from './modules/donut.js';
|
|
20
19
|
import * as style from './style.js';
|
|
21
20
|
import { background, features, areaLabel, links, points, flowParticles, sourcePoints, feature as feature$1, link, point, pointCircle, pointLabel, sourcePoint, flowParticle } from './style.js';
|
|
@@ -347,7 +346,7 @@ class TopoJSONMap extends ComponentCore {
|
|
|
347
346
|
}
|
|
348
347
|
_getPointData() {
|
|
349
348
|
const { config, datamodel } = this;
|
|
350
|
-
if (!config.clustering || !this._clusterIndex) {
|
|
349
|
+
if (!config.clustering || !this._clusterIndex || config.clusteringDistance === 0) {
|
|
351
350
|
// Return regular points when clustering is disabled
|
|
352
351
|
return datamodel.points.map((d, i) => {
|
|
353
352
|
const pos = this._projection(getLonLat(d, config.longitude, config.latitude));
|
|
@@ -369,16 +368,32 @@ class TopoJSONMap extends ComponentCore {
|
|
|
369
368
|
};
|
|
370
369
|
});
|
|
371
370
|
}
|
|
372
|
-
//
|
|
373
|
-
const
|
|
374
|
-
|
|
375
|
-
this._projection
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
371
|
+
// Convert all points to screen space first
|
|
372
|
+
const allPoints = datamodel.points.map((d, i) => {
|
|
373
|
+
const coords = getLonLat(d, config.longitude, config.latitude);
|
|
374
|
+
const screenPos = this._projection(coords);
|
|
375
|
+
const radius = getNumber(d, config.pointRadius);
|
|
376
|
+
const shape = getString(d, config.pointShape) || TopoJSONMapPointShape.Circle;
|
|
377
|
+
const donutData = getDonutData(d, config.colorMap);
|
|
378
|
+
const pointColor = getColor(d, config.pointColor, i);
|
|
379
|
+
return {
|
|
380
|
+
geometry: { type: 'Point', coordinates: coords },
|
|
381
|
+
bbox: { x1: screenPos[0] - radius, y1: screenPos[1] - radius, x2: screenPos[0] + radius, y2: screenPos[1] + radius },
|
|
382
|
+
radius,
|
|
383
|
+
path: getPointPathData({ x: 0, y: 0 }, radius, shape),
|
|
384
|
+
color: pointColor,
|
|
385
|
+
id: getString(d, config.pointId, i),
|
|
386
|
+
properties: d,
|
|
387
|
+
donutData,
|
|
388
|
+
isCluster: false,
|
|
389
|
+
_zIndex: 0,
|
|
390
|
+
screenX: screenPos[0],
|
|
391
|
+
screenY: screenPos[1],
|
|
392
|
+
originalData: d,
|
|
393
|
+
};
|
|
394
|
+
});
|
|
395
|
+
// Perform clustering in screen space
|
|
396
|
+
let geoJsonPoints = this._clusterInScreenSpace(allPoints);
|
|
382
397
|
// Handle expanded cluster points - replace the expanded cluster with individual points
|
|
383
398
|
if (this._expandedCluster) {
|
|
384
399
|
// Remove expanded cluster from the data
|
|
@@ -386,7 +401,7 @@ class TopoJSONMap extends ComponentCore {
|
|
|
386
401
|
// Add points from the expanded cluster
|
|
387
402
|
geoJsonPoints = geoJsonPoints.concat(this._expandedCluster.points);
|
|
388
403
|
}
|
|
389
|
-
return geoJsonPoints
|
|
404
|
+
return geoJsonPoints;
|
|
390
405
|
}
|
|
391
406
|
_renderPoints(duration) {
|
|
392
407
|
const { config } = this;
|
|
@@ -520,7 +535,7 @@ class TopoJSONMap extends ComponentCore {
|
|
|
520
535
|
return null;
|
|
521
536
|
if (d.isCluster) {
|
|
522
537
|
// For clusters, use contrasting color against cluster background
|
|
523
|
-
const clusterColor = getColor(d, config.clusterColor
|
|
538
|
+
const clusterColor = getColor(d, config.clusterColor) || '#2196F3';
|
|
524
539
|
const hex = (_a = color(isStringCSSVariable(clusterColor) ? getCSSVariableValue(clusterColor, this.element) : clusterColor)) === null || _a === void 0 ? void 0 : _a.hex();
|
|
525
540
|
if (hex) {
|
|
526
541
|
const brightness = hexToBrightness(hex);
|
|
@@ -626,7 +641,7 @@ class TopoJSONMap extends ComponentCore {
|
|
|
626
641
|
// will zoom with respect to the current view
|
|
627
642
|
this._center = [event.transform.x, event.transform.y];
|
|
628
643
|
}
|
|
629
|
-
|
|
644
|
+
// _currentZoomLevel is now set in _onZoomHandler to track previous value
|
|
630
645
|
}
|
|
631
646
|
_onZoomHandler(transform, isMouseEvent, isExternalEvent) {
|
|
632
647
|
const scale = transform.k / this._initialScale || 1;
|
|
@@ -634,6 +649,8 @@ class TopoJSONMap extends ComponentCore {
|
|
|
634
649
|
this._transform = zoomIdentity
|
|
635
650
|
.translate(transform.x - center[0] * scale, transform.y - center[1] * scale)
|
|
636
651
|
.scale(scale);
|
|
652
|
+
// Update zoom level for clustering calculations
|
|
653
|
+
this._currentZoomLevel = (transform.k / this._initialScale) || 1;
|
|
637
654
|
const customDuration = isExternalEvent
|
|
638
655
|
? this.config.zoomDuration
|
|
639
656
|
: (isMouseEvent ? 0 : null);
|
|
@@ -752,31 +769,93 @@ class TopoJSONMap extends ComponentCore {
|
|
|
752
769
|
}
|
|
753
770
|
}
|
|
754
771
|
}
|
|
772
|
+
_clusterInScreenSpace(points) {
|
|
773
|
+
const { config } = this;
|
|
774
|
+
const clusteringDistance = config.clusteringDistance || 55;
|
|
775
|
+
// If clustering distance is 0, return all points as individual points
|
|
776
|
+
if (clusteringDistance === 0) {
|
|
777
|
+
return points;
|
|
778
|
+
}
|
|
779
|
+
const clusters = [];
|
|
780
|
+
const processed = new Set();
|
|
781
|
+
for (let i = 0; i < points.length; i++) {
|
|
782
|
+
if (processed.has(i))
|
|
783
|
+
continue;
|
|
784
|
+
const point = points[i];
|
|
785
|
+
const nearbyPoints = [point];
|
|
786
|
+
processed.add(i);
|
|
787
|
+
// Find all points within clustering distance
|
|
788
|
+
for (let j = i + 1; j < points.length; j++) {
|
|
789
|
+
if (processed.has(j))
|
|
790
|
+
continue;
|
|
791
|
+
const otherPoint = points[j];
|
|
792
|
+
const distance = Math.sqrt(Math.pow(point.screenX - otherPoint.screenX, 2) +
|
|
793
|
+
Math.pow(point.screenY - otherPoint.screenY, 2));
|
|
794
|
+
if (distance <= clusteringDistance) {
|
|
795
|
+
nearbyPoints.push(otherPoint);
|
|
796
|
+
processed.add(j);
|
|
797
|
+
}
|
|
798
|
+
}
|
|
799
|
+
if (nearbyPoints.length > 1) {
|
|
800
|
+
// Create cluster
|
|
801
|
+
const centerX = nearbyPoints.reduce((sum, p) => sum + p.screenX, 0) / nearbyPoints.length;
|
|
802
|
+
const centerY = nearbyPoints.reduce((sum, p) => sum + p.screenY, 0) / nearbyPoints.length;
|
|
803
|
+
const centerCoords = this._projection.invert ? this._projection.invert([centerX, centerY]) : [0, 0];
|
|
804
|
+
const clusterRadius = getNumber(nearbyPoints[0].originalData, config.clusterRadius) || 10;
|
|
805
|
+
const clusterId = clusters.length;
|
|
806
|
+
const cluster = {
|
|
807
|
+
geometry: { type: 'Point', coordinates: centerCoords },
|
|
808
|
+
properties: {
|
|
809
|
+
cluster: true,
|
|
810
|
+
clusterId: clusterId,
|
|
811
|
+
pointCount: nearbyPoints.length,
|
|
812
|
+
clusterPoints: nearbyPoints.map(p => p.originalData),
|
|
813
|
+
},
|
|
814
|
+
bbox: { x1: centerX - clusterRadius, y1: centerY - clusterRadius, x2: centerX + clusterRadius, y2: centerY + clusterRadius },
|
|
815
|
+
radius: clusterRadius,
|
|
816
|
+
path: getPointPathData({ x: 0, y: 0 }, clusterRadius, TopoJSONMapPointShape.Circle),
|
|
817
|
+
color: getColor(nearbyPoints[0].originalData, config.clusterColor) || '#2196F3',
|
|
818
|
+
id: `cluster-${clusterId}`,
|
|
819
|
+
donutData: [],
|
|
820
|
+
isCluster: true,
|
|
821
|
+
_zIndex: 1,
|
|
822
|
+
clusterIndex: {
|
|
823
|
+
getLeaves: (id) => {
|
|
824
|
+
if (id === clusterId) {
|
|
825
|
+
return nearbyPoints.map(p => ({ properties: p.originalData }));
|
|
826
|
+
}
|
|
827
|
+
return [];
|
|
828
|
+
},
|
|
829
|
+
},
|
|
830
|
+
};
|
|
831
|
+
clusters.push(cluster);
|
|
832
|
+
}
|
|
833
|
+
else {
|
|
834
|
+
// Keep as individual point
|
|
835
|
+
clusters.push(point);
|
|
836
|
+
}
|
|
837
|
+
}
|
|
838
|
+
return clusters;
|
|
839
|
+
}
|
|
755
840
|
_expandCluster(clusterPoint) {
|
|
756
841
|
const { config } = this;
|
|
757
842
|
if (!clusterPoint.clusterIndex)
|
|
758
843
|
return undefined;
|
|
759
|
-
const padding = 1;
|
|
760
844
|
const clusterId = clusterPoint.properties.clusterId;
|
|
761
845
|
const points = clusterPoint.clusterIndex.getLeaves(clusterId, Infinity);
|
|
762
|
-
//
|
|
763
|
-
const packPoints = points.map(() => ({
|
|
764
|
-
x: 0,
|
|
765
|
-
y: 0,
|
|
766
|
-
r: 8 + padding, // Base radius for individual points
|
|
767
|
-
}));
|
|
768
|
-
packSiblings(packPoints);
|
|
769
|
-
// Create expanded points with relative positions
|
|
846
|
+
// Create expanded points at their actual geographic coordinates
|
|
770
847
|
const expandedPoints = points.map((point, i) => {
|
|
771
848
|
const originalData = point.properties;
|
|
849
|
+
const coords = getLonLat(originalData, config.longitude, config.latitude);
|
|
850
|
+
const pos = this._projection(coords);
|
|
772
851
|
const radius = getNumber(originalData, config.pointRadius) || 8;
|
|
773
852
|
const shape = getString(originalData, config.pointShape) || TopoJSONMapPointShape.Circle;
|
|
774
853
|
const donutData = getDonutData(originalData, config.colorMap);
|
|
775
|
-
// Use
|
|
776
|
-
const pointColor =
|
|
854
|
+
// Use individual point color based on its own data
|
|
855
|
+
const pointColor = getColor(originalData, config.pointColor, i);
|
|
777
856
|
return {
|
|
778
|
-
geometry: { type: 'Point', coordinates:
|
|
779
|
-
bbox: { x1: 0, y1:
|
|
857
|
+
geometry: { type: 'Point', coordinates: coords },
|
|
858
|
+
bbox: { x1: pos[0] - radius, y1: pos[1] - radius, x2: pos[0] + radius, y2: pos[1] + radius },
|
|
780
859
|
radius,
|
|
781
860
|
path: getPointPathData({ x: 0, y: 0 }, radius, shape),
|
|
782
861
|
color: pointColor,
|
|
@@ -786,9 +865,8 @@ class TopoJSONMap extends ComponentCore {
|
|
|
786
865
|
isCluster: false,
|
|
787
866
|
_zIndex: 1,
|
|
788
867
|
expandedClusterPoint: clusterPoint,
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
dy: packPoints[i].y,
|
|
868
|
+
dx: 0,
|
|
869
|
+
dy: 0,
|
|
792
870
|
};
|
|
793
871
|
});
|
|
794
872
|
this._resetExpandedCluster();
|
|
@@ -925,7 +1003,7 @@ class TopoJSONMap extends ComponentCore {
|
|
|
925
1003
|
color,
|
|
926
1004
|
flowData: link,
|
|
927
1005
|
progress: 0,
|
|
928
|
-
id: `${
|
|
1006
|
+
id: `${link.id || i}-${j}`,
|
|
929
1007
|
};
|
|
930
1008
|
this._flowParticles.push(particle);
|
|
931
1009
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/topojson-map/index.ts"],"sourcesContent":["import { Selection, select } from 'd3-selection'\nimport { D3ZoomEvent, zoom, ZoomBehavior, zoomIdentity, ZoomTransform } from 'd3-zoom'\nimport { timeout } from 'd3-timer'\nimport { easeCubicInOut } from 'd3-ease'\nimport { geoPath, GeoProjection, ExtendedFeatureCollection } from 'd3-geo'\nimport { color } from 'd3-color'\nimport { packSiblings } from 'd3-hierarchy'\nimport { feature } from 'topojson-client'\nimport Supercluster from 'supercluster'\n\n// Core\nimport { ComponentCore } from 'core/component'\nimport { MapGraphDataModel } from 'data-models/map-graph'\n\n// Utils\nimport { clamp, getNumber, getString, isNumber } from 'utils/data'\nimport { smartTransition } from 'utils/d3'\nimport { getColor, hexToBrightness } from 'utils/color'\nimport { getCSSVariableValue, isStringCSSVariable, rectIntersect } from 'utils/misc'\nimport { estimateStringPixelLength } from 'utils/text'\n\n// Types\nimport { MapLink } from 'types/map'\nimport { Rect } from 'types/misc'\n\n// Local Types\nimport {\n MapData,\n MapFeature,\n MapPointLabelPosition,\n MapProjection,\n TopoJSONMapPointShape,\n TopoJSONMapPoint,\n TopoJSONMapClusterDatum,\n TopoJSONMapPointDatum,\n FlowParticle,\n FlowSourcePoint,\n} from './types'\n\n// Config\nimport { TopoJSONMapDefaultConfig, TopoJSONMapConfigInterface } from './config'\n\n// Modules\nimport {\n arc,\n getLonLat,\n getDonutData,\n getPointPathData,\n calculateClusterIndex,\n getClustersAndPoints,\n geoJsonPointToScreenPoint,\n getNextZoomLevelOnClusterClick,\n} from './utils'\nimport { updateDonut } from './modules/donut'\n\n// Styles\nimport * as s from './style'\n\nexport class TopoJSONMap<\n AreaDatum,\n PointDatum = unknown,\n LinkDatum = unknown,\n> extends ComponentCore<\n MapData<AreaDatum, PointDatum, LinkDatum>,\n TopoJSONMapConfigInterface<AreaDatum, PointDatum, LinkDatum>\n > {\n static selectors = s\n protected _defaultConfig = TopoJSONMapDefaultConfig as TopoJSONMapConfigInterface<AreaDatum, PointDatum, LinkDatum>\n public config: TopoJSONMapConfigInterface<AreaDatum, PointDatum, LinkDatum> = this._defaultConfig\n\n datamodel: MapGraphDataModel<AreaDatum, PointDatum, LinkDatum> = new MapGraphDataModel()\n g: Selection<SVGGElement, unknown, null, undefined>\n private _firstRender = true\n private _isResizing = false\n private _initialScale: number = undefined\n private _center: [number, number]\n private _currentZoomLevel: number = undefined\n private _transform: ZoomTransform\n private _path = geoPath()\n private _projection: GeoProjection\n private _prevWidth: number\n private _prevHeight: number\n private _animFrameId: number\n private _clusterIndex: Supercluster<PointDatum> | null = null\n private _expandedCluster: {\n cluster: TopoJSONMapPoint<PointDatum>;\n points: any[];\n } | null = null\n\n private _eventInitiatedByComponent = false\n private _collideLabelsAnimFrameId: ReturnType<typeof requestAnimationFrame>\n\n private _featureCollection: GeoJSON.FeatureCollection\n private _zoomBehavior: ZoomBehavior<SVGGElement, unknown> = zoom()\n private _backgroundRect = this.g.append('rect').attr('class', s.background)\n private _featuresGroup = this.g.append('g').attr('class', s.features)\n private _areaLabelsGroup = this.g.append('g').attr('class', s.areaLabel)\n private _linksGroup = this.g.append('g').attr('class', s.links)\n private _pointsGroup = this.g.append('g').attr('class', s.points)\n\n // Flow-related properties\n private _flowParticlesGroup = this.g.append('g').attr('class', s.flowParticles)\n private _sourcePointsGroup = this.g.append('g').attr('class', s.sourcePoints)\n private _flowParticles: any[] = []\n private _sourcePoints: any[] = []\n private _animationId: number | null = null\n\n events = {\n [TopoJSONMap.selectors.point]: {},\n [TopoJSONMap.selectors.feature]: {},\n }\n\n constructor (config?: TopoJSONMapConfigInterface<AreaDatum, PointDatum, LinkDatum>, data?: MapData<AreaDatum, PointDatum, LinkDatum>) {\n super()\n this._zoomBehavior.on('zoom', this._onZoom.bind(this))\n\n if (config) this.setConfig(config)\n if (data) this.setData(data)\n\n this.g.append('defs')\n .append('filter')\n .attr('id', 'heatmapFilter')\n .html(`\n <feGaussianBlur in=\"SourceGraphic\" stdDeviation=\"${this.config.heatmapModeBlurStdDeviation}\" color-interpolation-filters=\"sRGB\" result=\"blur\"></feGaussianBlur>\n <feColorMatrix class=\"blurValues\" in=\"blur\" mode=\"matrix\" values=\"1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 20 -4\"></feColorMatrix>\n `)\n }\n\n setData (data: MapData<AreaDatum, PointDatum, LinkDatum>): void {\n const { config } = this\n\n this.datamodel.pointId = config.pointId\n this.datamodel.linkSource = config.linkSource\n this.datamodel.linkTarget = config.linkTarget\n this.datamodel.data = data\n\n // Reset expanded cluster when data changes\n this._resetExpandedCluster()\n\n // Initialize clustering if enabled\n if (config.clustering && data.points?.length) {\n const dataValid = data.points.filter(d => {\n const lat = getNumber(d, config.latitude)\n const lon = getNumber(d, config.longitude)\n return isNumber(lat) && isNumber(lon)\n })\n\n this._clusterIndex = calculateClusterIndex(dataValid as any, this.config as any) as any\n } else {\n this._clusterIndex = null\n }\n\n // If there was a data change and mapFitToPoints is enabled, we will need to re-fit the map\n this._firstRender = this._firstRender || config.mapFitToPoints\n }\n\n setConfig (config?: TopoJSONMapConfigInterface<AreaDatum, PointDatum, LinkDatum>): void {\n super.setConfig(config)\n\n // Setting the default here instead of defaultConfig to prevent mutation from other TopoJSONMap instances\n const newProjection = this.config.projection ?? MapProjection.Kavrayskiy7()\n if (this._projection) {\n newProjection.scale(this._projection.scale()).translate(this._projection.translate())\n }\n this._projection = newProjection\n }\n\n _render (customDuration?: number): void {\n const { config } = this\n const duration = isNumber(customDuration) ? customDuration : config.duration\n\n this._renderBackground()\n this._renderMap(duration)\n this._renderAreaLabels(duration)\n this._renderGroups(duration)\n this._renderLinks(duration)\n this._renderPoints(duration)\n\n // Flow features\n if (config.enableFlowAnimation) {\n this._initFlowFeatures()\n this._renderSourcePoints(duration)\n this._renderFlowParticles(duration)\n this._startFlowAnimation()\n } else {\n this._stopFlowAnimation()\n }\n\n // When animation is running we need to temporary disable zoom behaviour\n if (duration && !config.disableZoom) {\n this.g.on('.zoom', null)\n timeout(() => {\n this.g.call(this._zoomBehavior)\n }, duration)\n }\n\n // When zoom behaviour is active we assign the `draggable` class to show the grabbing cursor\n this.g.classed('draggable', !config.disableZoom)\n this._firstRender = false\n }\n\n _renderBackground (): void {\n this._backgroundRect\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('transform', `translate(${-this.bleed.left}, ${-this.bleed.top})`)\n }\n\n _renderGroups (duration: number): void {\n const transformString = this._transform.toString()\n smartTransition(this._featuresGroup, duration)\n .attr('transform', transformString)\n .attr('stroke-width', 1 / this._currentZoomLevel)\n\n smartTransition(this._areaLabelsGroup, duration)\n .attr('transform', transformString)\n\n smartTransition(this._linksGroup, duration)\n .attr('transform', transformString)\n\n smartTransition(this._pointsGroup, duration)\n .attr('transform', transformString)\n\n // Flow groups\n smartTransition(this._sourcePointsGroup, duration)\n .attr('transform', transformString)\n\n smartTransition(this._flowParticlesGroup, duration)\n .attr('transform', transformString)\n }\n\n _renderMap (duration: number): void {\n const { bleed, config, datamodel } = this\n\n this.g.attr('transform', `translate(${bleed.left}, ${bleed.top})`)\n const mapData: TopoJSON.Topology = config.topojson\n const featureName = config.mapFeatureName\n const featureObject = mapData?.objects?.[featureName]\n if (!featureObject) return\n\n this._featureCollection = feature(mapData, featureObject) as GeoJSON.FeatureCollection\n const featureData = (this._featureCollection?.features ?? []) as MapFeature<AreaDatum>[]\n\n if (this._firstRender) {\n // Rendering the map for the first time.\n this._projection.fitExtent([[0, 0], [this._width, this._height]], this._featureCollection)\n this._initialScale = this._projection.scale()\n this._center = this._projection.translate()\n\n if (config.mapFitToPoints) {\n this._fitToPoints()\n }\n\n const zoomExtent = config.zoomExtent\n this._zoomBehavior.scaleExtent([zoomExtent[0] * this._initialScale, zoomExtent[1] * this._initialScale])\n this.setZoom(config.zoomFactor || 1)\n\n if (!config.disableZoom) {\n this.g.call(this._zoomBehavior)\n this._applyZoom()\n }\n\n this._prevWidth = this._width\n this._prevHeight = this._height\n }\n\n if (this._prevWidth !== this._width || this._prevHeight !== this._height) {\n this._onResize()\n }\n\n\n this._path.projection(this._projection)\n\n // Merge passed area data and map feature data\n const areaData = datamodel.areas\n areaData.forEach(a => {\n const feature = featureData.find(f => f.id.toString() === getString(a, config.areaId).toString())\n if (feature) feature.data = a\n else if (this._firstRender) console.warn(`Can't find feature by area code ${getString(a, config.areaId)}`)\n })\n\n const features = this._featuresGroup\n .selectAll<SVGPathElement, unknown>(`.${s.feature}`)\n .data(featureData)\n\n const featuresEnter = features.enter().append('path').attr('class', s.feature)\n smartTransition(featuresEnter.merge(features), duration)\n .attr('d', this._path)\n .style('fill', (d, i) => d.data ? getColor(d.data, config.areaColor, i) : null)\n .style('cursor', d => d.data ? getString(d.data, config.areaCursor) : null)\n features.exit().remove()\n }\n\n _renderAreaLabels (duration: number): void {\n const { config } = this\n\n // Early return if no area label configuration\n if (!config.areaLabel) {\n this._areaLabelsGroup.selectAll('*').remove()\n return\n }\n\n const featureData = (this._featureCollection?.features ?? []) as MapFeature<AreaDatum>[]\n\n // Prepare candidate labels with optimized filtering and calculations\n const candidateLabels = featureData\n .map(feature => {\n // Get label text from user-provided area data only\n const labelText = feature.data ? getString(feature.data, config.areaLabel) : null\n if (!labelText) return null\n\n const centroid = this._path.centroid(feature)\n\n // Skip if centroid is invalid (e.g., for very small or complex shapes)\n if (!centroid || centroid.some(coord => !isFinite(coord))) return null\n\n const bounds = this._path.bounds(feature)\n const area = (bounds[1][0] - bounds[0][0]) * (bounds[1][1] - bounds[0][1])\n\n return {\n feature,\n centroid,\n area,\n labelText,\n id: feature.data ? getString(feature.data, config.areaId) : feature.id?.toString(),\n }\n })\n .filter(Boolean) // Remove null entries\n .sort((a, b) => b.area - a.area) // Prioritize larger areas\n\n // D3 data binding with improved key function\n const labels = this._areaLabelsGroup\n .selectAll<SVGTextElement, typeof candidateLabels[0]>(`.${s.areaLabel}`)\n .data(candidateLabels, d => d.id || '')\n\n // Handle entering labels\n const labelsEnter = labels.enter()\n .append('text')\n .attr('class', s.areaLabel)\n .attr('transform', d => `translate(${d.centroid[0]},${d.centroid[1]})`)\n .style('opacity', 0)\n .style('pointer-events', 'none')\n\n // Update all labels (enter + update)\n const labelsMerged = labelsEnter.merge(labels)\n labelsMerged\n .text(d => d.labelText)\n .attr('transform', d => `translate(${d.centroid[0]},${d.centroid[1]})`)\n .style('font-size', `calc(var(--vis-map-point-label-font-size) / ${this._currentZoomLevel})`)\n .style('text-anchor', 'middle')\n .style('dominant-baseline', 'middle')\n\n // Handle exiting labels\n smartTransition(labels.exit(), duration)\n .style('opacity', 0)\n .remove()\n\n // Run collision detection immediately to prevent flickering during zoom\n if (candidateLabels.length > 0) {\n window.cancelAnimationFrame(this._collideLabelsAnimFrameId)\n // Run collision detection synchronously first\n this._collideLabels()\n\n // Then schedule follow-up collision detection for any dynamic changes\n this._collideLabelsAnimFrameId = window.requestAnimationFrame(() => {\n this._collideLabels()\n })\n }\n\n // Animate to visible state AFTER collision detection\n smartTransition(labelsMerged, duration)\n .style('opacity', 1)\n }\n\n private _collideLabels (): void {\n const labels = this._areaLabelsGroup.selectAll<SVGTextElement, any>(`.${s.areaLabel}`)\n const labelNodes = labels.nodes() as (SVGTextElement & { _labelVisible?: boolean })[]\n const labelData = labels.data()\n\n if (labelNodes.length === 0) return\n\n // Reset all labels to visible and mark them as such\n labelNodes.forEach((node) => {\n node._labelVisible = true\n })\n\n // Helper function to get bounding box\n const getBBox = (labelData: any): Rect => {\n const [x, y] = labelData.centroid\n const labelText = labelData.labelText || ''\n const fontSize = 12 // Default font size\n\n const width = estimateStringPixelLength(labelText, fontSize, 0.6)\n const height = fontSize * 1.2 // Line height factor\n\n return {\n x: x - width / 2,\n y: y - height / 2,\n width,\n height,\n }\n }\n\n // Run collision detection similar to scatter plot\n labelNodes.forEach((node1, i) => {\n const data1 = labelData[i]\n if (!node1._labelVisible) return\n\n const label1BoundingRect = getBBox(data1)\n\n for (let j = 0; j < labelNodes.length; j++) {\n if (i === j) continue\n\n const node2 = labelNodes[j]\n const data2 = labelData[j]\n\n if (!node2._labelVisible) continue\n\n const label2BoundingRect = getBBox(data2)\n const intersect = rectIntersect(label1BoundingRect, label2BoundingRect, 2)\n\n if (intersect) {\n // Priority based on area size - larger areas keep their labels\n if (data1.area >= data2.area) {\n node2._labelVisible = false\n } else {\n node1._labelVisible = false\n break\n }\n }\n }\n })\n\n // Apply visibility based on collision detection\n labels.style('opacity', (d, i) => labelNodes[i]._labelVisible ? 1 : 0)\n }\n\n _renderLinks (duration: number): void {\n const { config, datamodel } = this\n const links = datamodel.links\n\n const edges = this._linksGroup\n .selectAll<SVGPathElement, MapLink<PointDatum, LinkDatum>>(`.${s.link}`)\n .data(links, (d, i) => getString(d, config.linkId, i))\n\n const edgesEnter = edges.enter().append('path').attr('class', s.link)\n .style('stroke-width', 0)\n\n smartTransition(edgesEnter.merge(edges), duration)\n .attr('d', link => {\n const source = this._projection(getLonLat(link.source, config.longitude, config.latitude))\n const target = this._projection(getLonLat(link.target, config.longitude, config.latitude))\n return arc(source, target)\n })\n .style('stroke-width', link => getNumber(link, config.linkWidth) / this._currentZoomLevel)\n .style('cursor', link => getString(link, config.linkCursor))\n .style('stroke', (link, i) => getColor(link, config.linkColor, i))\n edges.exit().remove()\n }\n\n private _getPointData (): TopoJSONMapPoint<PointDatum>[] {\n const { config, datamodel } = this\n\n if (!config.clustering || !this._clusterIndex) {\n // Return regular points when clustering is disabled\n return datamodel.points.map((d, i) => {\n const pos = this._projection(getLonLat(d, config.longitude, config.latitude))\n const radius = getNumber(d, config.pointRadius)\n const shape = getString(d, config.pointShape) as TopoJSONMapPointShape || TopoJSONMapPointShape.Circle\n const donutData = getDonutData(d, config.colorMap)\n const pointColor = getColor(d, config.pointColor, i)\n\n return {\n geometry: { type: 'Point', coordinates: getLonLat(d, config.longitude, config.latitude) },\n bbox: { x1: pos[0] - radius, y1: pos[1] - radius, x2: pos[0] + radius, y2: pos[1] + radius },\n radius,\n path: getPointPathData({ x: 0, y: 0 }, radius, shape),\n color: pointColor,\n id: getString(d, config.pointId, i),\n properties: d as TopoJSONMapPointDatum<PointDatum>,\n donutData,\n isCluster: false,\n _zIndex: 0,\n } as TopoJSONMapPoint<PointDatum>\n })\n }\n\n // Get bounds for clustering\n const bounds = this._projection.invert ? [\n this._projection.invert([0, this._height])[0],\n this._projection.invert([0, this._height])[1],\n this._projection.invert([this._width, 0])[0],\n this._projection.invert([this._width, 0])[1],\n ] as [number, number, number, number] : [-180, -90, 180, 90] as [number, number, number, number]\n\n // Use a capped zoom level for clustering to prevent over-fragmentation\n const clusterZoom = Math.min(Math.round(this._currentZoomLevel || 1), 8)\n let geoJsonPoints = getClustersAndPoints(this._clusterIndex as any, bounds, clusterZoom)\n\n // Handle expanded cluster points - replace the expanded cluster with individual points\n if (this._expandedCluster) {\n // Remove expanded cluster from the data\n geoJsonPoints = geoJsonPoints.filter((c: any) => c.properties.clusterId !== (this._expandedCluster?.cluster.properties as any).clusterId)\n // Add points from the expanded cluster\n geoJsonPoints = geoJsonPoints.concat(this._expandedCluster.points as any)\n }\n\n return geoJsonPoints.map((geoPoint, i) =>\n geoJsonPointToScreenPoint(geoPoint as any, i, this._projection, this.config as any, this._currentZoomLevel || 1)\n ) as any\n }\n\n _renderPoints (duration: number): void {\n const { config } = this\n const hasColorMap = config.colorMap && Object.keys(config.colorMap).length > 0\n const pointData = this._getPointData()\n\n\n const points = this._pointsGroup\n .selectAll<SVGGElement, TopoJSONMapPoint<PointDatum>>(`.${s.point}`)\n .data(pointData, (d, i) => d.id.toString())\n\n // Enter\n const pointsEnter = points.enter().append('g').attr('class', s.point)\n .attr('transform', d => {\n const pos = this._projection(d.geometry.coordinates as [number, number])\n const expandedPoint = d as any\n const dx = expandedPoint.dx || 0\n const dy = expandedPoint.dy || 0\n return `translate(${pos[0] + dx},${pos[1] + dy})`\n })\n .style('opacity', 0)\n\n pointsEnter.append('path').attr('class', s.pointCircle)\n .attr('d', 'M0,0')\n .style('fill', (d, i) => d.color)\n .style('stroke-width', d => getNumber(d.properties as PointDatum, config.pointStrokeWidth))\n\n // Add donut chart group\n pointsEnter.append('g').attr('class', 'donut-group')\n\n pointsEnter.append('text').attr('class', s.pointLabel)\n .style('opacity', 0)\n\n // Update\n const pointsMerged = pointsEnter.merge(points)\n smartTransition(pointsMerged, duration)\n .attr('transform', d => {\n const pos = this._projection(d.geometry.coordinates as [number, number])\n const expandedPoint = d as any\n const dx = expandedPoint.dx || 0\n const dy = expandedPoint.dy || 0\n return `translate(${pos[0] + dx},${pos[1] + dy})`\n })\n .style('cursor', d => {\n return (d.isCluster && (config.clusterExpandOnClick || hasColorMap)) ? 'pointer' : getString(d.properties as PointDatum, config.pointCursor)\n })\n .style('opacity', 1)\n\n // Cursor is handled by the parent point element\n\n // Add click event handler for clusters\n pointsMerged\n .style('pointer-events', 'all') // Ensure pointer events are enabled\n .on('click', (event: MouseEvent, d: TopoJSONMapPoint<PointDatum>) => {\n this._onPointClick(d, event)\n })\n\n\n smartTransition(pointsMerged.select(`.${s.pointCircle}`), duration)\n .attr('d', d => {\n const radius = d.radius / (this._currentZoomLevel || 1)\n const shape = getString(d.properties as PointDatum, config.pointShape) as TopoJSONMapPointShape || TopoJSONMapPointShape.Circle\n return getPointPathData({ x: 0, y: 0 }, radius, shape)\n })\n .style('fill', d => {\n const donutData = d.donutData\n const shape = getString(d.properties as any, config.pointShape) as TopoJSONMapPointShape || TopoJSONMapPointShape.Circle\n const isRing = shape === TopoJSONMapPointShape.Ring\n const expandedPoint = d as any\n\n // For expanded cluster points, use the preserved cluster color\n if (expandedPoint.expandedClusterPoint) {\n return expandedPoint.clusterColor || expandedPoint.expandedClusterPoint.color\n }\n\n if (donutData.length > 0) return 'transparent'\n return isRing ? 'transparent' : d.color\n })\n .style('stroke', d => {\n const expandedPoint = d as any\n // For expanded cluster points, use the preserved cluster color\n if (expandedPoint.expandedClusterPoint) {\n return expandedPoint.clusterColor || expandedPoint.expandedClusterPoint.color\n }\n return d.color\n })\n .style('stroke-width', d => {\n const shape = getString(d.properties as any, config.pointShape) as TopoJSONMapPointShape || TopoJSONMapPointShape.Circle\n const isRing = shape === TopoJSONMapPointShape.Ring\n const baseStrokeWidth = isRing ? getNumber(d.properties as any, config.pointRingWidth) : getNumber(d.properties as any, config.pointStrokeWidth)\n return baseStrokeWidth / (this._currentZoomLevel || 1)\n })\n\n // Update donut charts\n const currentZoomLevel = this._currentZoomLevel\n pointsMerged.select('.donut-group')\n .style('pointer-events', 'none') // Allow clicks to pass through donut charts\n .each(function (d) {\n if (d.donutData.length > 0) {\n const radius = getNumber(d.properties as any, config.pointRadius, 0) / (currentZoomLevel || 1)\n const arcWidth = (d.isCluster ? 4 : 2) / (currentZoomLevel || 1) // Thicker ring for clusters\n updateDonut(select(this as SVGGElement), d.donutData, radius, arcWidth, 0.05)\n } else {\n select(this as SVGGElement).selectAll('*').remove()\n }\n })\n\n const pointLabelsMerged = pointsMerged.select(`.${s.pointLabel}`)\n pointLabelsMerged\n .text(d => {\n if (d.isCluster) {\n // Use cluster label for clusters\n return getString(d as any, config.clusterLabel) ?? ''\n } else {\n // Use point label for regular points\n return getString(d.properties as any, config.pointLabel) ?? ''\n }\n })\n .style('font-size', d => {\n if (config.pointLabelPosition === MapPointLabelPosition.Bottom) {\n return `calc(var(--vis-map-point-label-font-size) / ${this._currentZoomLevel}`\n }\n const pointDiameter = 2 * getNumber(d.properties as any, config.pointRadius, 0)\n const pointLabelText = d.isCluster\n ? (getString(d as any, config.clusterLabel) || '')\n : (getString(d.properties as any, config.pointLabel) || '')\n const textLength = pointLabelText.length\n const fontSize = 0.5 * pointDiameter / Math.pow(textLength, 0.4)\n return clamp(fontSize, fontSize, 16)\n })\n .attr('y', d => {\n if (config.pointLabelPosition === MapPointLabelPosition.Center) return null\n\n const pointRadius = getNumber(d.properties as any, config.pointRadius, 0) / this._currentZoomLevel\n return pointRadius\n })\n .attr('dy', config.pointLabelPosition === MapPointLabelPosition.Center ? '0.32em' : '1em')\n\n smartTransition(pointLabelsMerged, duration)\n .style('fill', (d, i) => {\n if (config.pointLabelPosition === MapPointLabelPosition.Bottom) return null\n\n if (d.isCluster) {\n // For clusters, use contrasting color against cluster background\n const clusterColor = getColor(d as any, config.clusterColor, i) || '#2196F3'\n const hex = color(isStringCSSVariable(clusterColor) ? getCSSVariableValue(clusterColor, this.element) : clusterColor)?.hex()\n if (hex) {\n const brightness = hexToBrightness(hex)\n return brightness > 0.5 ? '#333' : '#fff'\n }\n return '#fff'\n } else {\n // Regular point label color logic\n const pointColor = getColor(d.properties as any, config.pointColor, i)\n const hex = color(isStringCSSVariable(pointColor) ? getCSSVariableValue(pointColor, this.element) : pointColor)?.hex()\n if (!hex) return null\n\n const brightness = hexToBrightness(hex)\n return brightness > config.pointLabelTextBrightnessRatio ? 'var(--vis-map-point-label-text-color-dark)' : 'var(--vis-map-point-label-text-color-light)'\n }\n })\n .style('font-weight', d => d.isCluster ? 'bold' : 'normal')\n .style('opacity', 1)\n\n // Exit\n points.exit().remove()\n\n // Heatmap\n this._pointsGroup.style('filter', (config.heatmapMode && this._currentZoomLevel < config.heatmapModeZoomLevelThreshold) ? 'url(#heatmapFilter)' : null)\n this._pointsGroup.selectAll(`.${s.pointLabel}`).style('display', (config.heatmapMode && (this._currentZoomLevel < config.heatmapModeZoomLevelThreshold)) ? 'none' : null)\n }\n\n _fitToPoints (points?: PointDatum[], pad = 0.1): void {\n const { config, datamodel } = this\n const pointData = points || datamodel.points\n if (pointData.length === 0) return\n\n this.fitView()\n\n const featureCollection: ExtendedFeatureCollection = {\n type: 'FeatureCollection',\n features: [{\n type: 'Feature',\n properties: {},\n geometry: {\n type: 'MultiPoint',\n coordinates: pointData.map(p => {\n return [\n getNumber(p, d => getNumber(d, config.longitude)),\n getNumber(p, d => getNumber(d, config.latitude)),\n ]\n }),\n },\n }],\n }\n\n this._projection.fitExtent([\n [this._width * pad, this._height * pad],\n [this._width * (1 - pad), this._height * (1 - pad)],\n ], featureCollection)\n\n const maxScale = config.zoomExtent[1] * this._initialScale\n const fittedScale = this._projection.scale()\n\n if (fittedScale > maxScale) {\n const fittedTranslate = this._projection.translate()\n const scaleRatio = maxScale / fittedScale\n\n this._projection.scale(maxScale)\n this._projection.translate([\n this._width / 2 - (this._width / 2 - fittedTranslate[0]) * scaleRatio,\n this._height / 2 - (this._height / 2 - fittedTranslate[1]) * scaleRatio,\n ])\n }\n\n // If we don't update the center, the next zoom will be centered around the previous value\n this._center = this._projection.translate()\n this._applyZoom()\n }\n\n _applyZoom (): void {\n const translate = this._center ?? this._projection.translate()\n const scale = this._initialScale * this._currentZoomLevel\n this.g.call(this._zoomBehavior.transform, zoomIdentity.translate(translate[0], translate[1]).scale(scale))\n }\n\n _onResize (): void {\n this._isResizing = true\n const prevTranslate = this._projection.translate()\n\n this._projection.fitExtent([[0, 0], [this._width, this._height]], this._featureCollection)\n this._initialScale = this._projection.scale()\n this._center = [\n this._projection.translate()[0] * this._center[0] / prevTranslate[0],\n this._projection.translate()[1] * this._center[1] / prevTranslate[1],\n ]\n this._applyZoom()\n\n this._isResizing = false\n this._prevWidth = this._width\n this._prevHeight = this._height\n }\n\n _onZoom (event: D3ZoomEvent<any, any>): void {\n if (this._firstRender) return // To prevent double render because of binding zoom behaviour\n const isMouseEvent = event.sourceEvent !== undefined\n const isExternalEvent = !event?.sourceEvent && !this._isResizing\n\n // Reset expanded cluster when manually zooming (but not during component-initiated zoom)\n if (isMouseEvent && !this._eventInitiatedByComponent) this._resetExpandedCluster()\n\n // Reset the flag after handling the zoom\n if (this._eventInitiatedByComponent && !isMouseEvent) {\n this._eventInitiatedByComponent = false\n }\n\n window.cancelAnimationFrame(this._animFrameId)\n this._animFrameId = window.requestAnimationFrame(this._onZoomHandler.bind(this, event.transform, isMouseEvent, isExternalEvent))\n\n if (isMouseEvent) {\n // Update the center coordinate so that the next call to _applyZoom()\n // will zoom with respect to the current view\n this._center = [event.transform.x, event.transform.y]\n }\n this._currentZoomLevel = (event?.transform.k / this._initialScale) || 1\n }\n\n _onZoomHandler (transform: ZoomTransform, isMouseEvent: boolean, isExternalEvent: boolean): void {\n const scale = transform.k / this._initialScale || 1\n const center = this._projection.translate()\n\n this._transform = zoomIdentity\n .translate(transform.x - center[0] * scale, transform.y - center[1] * scale)\n .scale(scale)\n\n const customDuration = isExternalEvent\n ? this.config.zoomDuration\n : (isMouseEvent ? 0 : null)\n\n // Call render functions that depend on this._transform\n this._renderGroups(customDuration)\n this._renderAreaLabels(customDuration)\n this._renderLinks(customDuration)\n this._renderPoints(customDuration)\n\n // Update flow features on zoom\n if (this.config.enableFlowAnimation) {\n this._renderSourcePoints(customDuration)\n this._renderFlowParticles(customDuration)\n }\n\n // Update flow features on zoom\n if (this.config.enableFlowAnimation) {\n this._renderSourcePoints(customDuration)\n this._renderFlowParticles(customDuration)\n }\n }\n\n public zoomIn (increment = 0.5): void {\n this.setZoom(this._currentZoomLevel + increment)\n }\n\n public zoomOut (increment = 0.5): void {\n this.setZoom(this._currentZoomLevel - increment)\n }\n\n public setZoom (zoomLevel: number): void {\n const { config } = this\n this._currentZoomLevel = clamp(zoomLevel, config.zoomExtent[0], config.zoomExtent[1])\n this._transform = zoomIdentity\n .translate(this._center[0] * (1 - this._currentZoomLevel), this._center[1] * (1 - this._currentZoomLevel))\n .scale(this._currentZoomLevel)\n // We are using this._applyZoom() instead of directly calling this._render(config.zoomDuration) because\n // we've to \"attach\" new transform to the map group element. Otherwise zoomBehavior will not know\n // that the zoom state has changed\n this._applyZoom()\n }\n\n public fitView (): void {\n this._projection.fitExtent([[0, 0], [this._width, this._height]], this._featureCollection)\n this._currentZoomLevel = (this._projection?.scale() / this._initialScale) || 1\n this._center = this._projection.translate()\n // We are using this._applyZoom() instead of directly calling this._render(config.zoomDuration) because\n // we've to \"attach\" new transform to the map group element. Otherwise zoomBehavior will not know\n // that the zoom state has changed\n this._applyZoom()\n }\n\n public fitViewToFlows (pad = 0.1): void {\n const { config, datamodel } = this\n const points: PointDatum[] = [...(datamodel.points || [])]\n const links = datamodel.links || []\n\n // Add flow endpoints to the points to consider for fitting\n links.forEach((link) => {\n // Try to get source point\n if (config.sourceLongitude && config.sourceLatitude) {\n const sourceLon = getNumber(link, config.sourceLongitude)\n const sourceLat = getNumber(link, config.sourceLatitude)\n if (isNumber(sourceLon) && isNumber(sourceLat)) {\n points.push({ longitude: sourceLon, latitude: sourceLat } as unknown as PointDatum)\n }\n } else {\n const sourcePoint = config.linkSource?.(link)\n if (typeof sourcePoint === 'object' && sourcePoint !== null) {\n points.push(sourcePoint as PointDatum)\n }\n }\n\n // Try to get target point\n if (config.targetLongitude && config.targetLatitude) {\n const targetLon = getNumber(link, config.targetLongitude)\n const targetLat = getNumber(link, config.targetLatitude)\n if (isNumber(targetLon) && isNumber(targetLat)) {\n points.push({ longitude: targetLon, latitude: targetLat } as unknown as PointDatum)\n }\n } else {\n const targetPoint = config.linkTarget?.(link)\n if (typeof targetPoint === 'object' && targetPoint !== null) {\n points.push(targetPoint as PointDatum)\n }\n }\n })\n\n if (points.length > 0) {\n this._fitToPoints(points, pad)\n } else {\n this.fitView()\n }\n }\n\n private _onPointClick (d: TopoJSONMapPoint<PointDatum>, event: MouseEvent): void {\n const { config } = this\n event.stopPropagation()\n\n // Handle clicking on expanded cluster points to collapse them\n const expandedPoint = d as any\n if (expandedPoint.expandedClusterPoint) {\n this._resetExpandedCluster()\n this._renderPoints(config.duration)\n return\n }\n\n if (d.isCluster && (d.properties as TopoJSONMapClusterDatum<PointDatum>).cluster) {\n // Enable click expansion when clusterExpandOnClick is true OR when colorMap is enabled (for pie chart clusters)\n const hasColorMap = config.colorMap && Object.keys(config.colorMap).length > 0\n\n if (config.clusterExpandOnClick || hasColorMap) {\n // Always expand the cluster to show individual points\n const expandedPoints = this._expandCluster(d)\n\n // Calculate the geographic center (centroid) of the expanded points and zoom to it\n if (expandedPoints && expandedPoints.length > 0) {\n const avgLat = expandedPoints.reduce((sum, p) => sum + getNumber(p, config.latitude), 0) / expandedPoints.length\n const avgLon = expandedPoints.reduce((sum, p) => sum + getNumber(p, config.longitude), 0) / expandedPoints.length\n const centroidCoordinates: [number, number] = [avgLon, avgLat]\n\n // Calculate appropriate zoom level\n const newZoomLevel = getNextZoomLevelOnClusterClick(this._currentZoomLevel || 1)\n\n // Start zoom immediately for smoother transition\n this._zoomToLocation(centroidCoordinates, newZoomLevel)\n }\n }\n }\n }\n\n private _expandCluster (clusterPoint: TopoJSONMapPoint<PointDatum>): PointDatum[] | undefined {\n const { config } = this\n\n if (!clusterPoint.clusterIndex) return undefined\n\n const padding = 1\n const clusterId = (clusterPoint.properties as TopoJSONMapClusterDatum<PointDatum>).clusterId as number\n const points = clusterPoint.clusterIndex.getLeaves(clusterId, Infinity)\n\n // Calculate positions for expanded points using d3.packSiblings (same as leaflet map)\n const packPoints: {x: number; y: number; r: number }[] = points.map(() => ({\n x: 0,\n y: 0,\n r: 8 + padding, // Base radius for individual points\n }))\n packSiblings(packPoints)\n\n // Create expanded points with relative positions\n const expandedPoints = points.map((point, i) => {\n const originalData = point.properties as PointDatum\n const radius = getNumber(originalData, config.pointRadius) || 8\n const shape = getString(originalData, config.pointShape) as TopoJSONMapPointShape || TopoJSONMapPointShape.Circle\n const donutData = getDonutData(originalData, config.colorMap)\n // Use the cluster's exact color for all expanded points to maintain visual consistency\n const pointColor = clusterPoint.color\n\n return {\n geometry: { type: 'Point' as const, coordinates: clusterPoint.geometry.coordinates },\n bbox: { x1: 0, y1: 0, x2: 0, y2: 0 },\n radius,\n path: getPointPathData({ x: 0, y: 0 }, radius, shape),\n color: pointColor,\n id: getString(originalData, config.pointId, i),\n properties: originalData,\n donutData,\n isCluster: false,\n _zIndex: 1,\n expandedClusterPoint: clusterPoint,\n clusterColor: pointColor, // Preserve the cluster color\n dx: packPoints[i].x,\n dy: packPoints[i].y,\n } as TopoJSONMapPoint<PointDatum> & { expandedClusterPoint: TopoJSONMapPoint<PointDatum>; dx: number; dy: number }\n })\n\n this._resetExpandedCluster()\n this._expandedCluster = {\n cluster: clusterPoint,\n points: expandedPoints,\n }\n\n // Re-render to show expanded points with smooth animation\n this._renderPoints(config.duration / 2)\n\n // Return the original point data for centroid calculation\n return points.map(p => p.properties as PointDatum)\n }\n\n private _zoomToLocation (coordinates: [number, number], zoomLevel: number): void {\n const { config } = this\n\n const clampedZoomLevel = clamp(zoomLevel, config.zoomExtent[0], config.zoomExtent[1])\n\n // Project the target coordinates using the current projection\n const targetPoint = this._projection(coordinates)\n if (!targetPoint) return\n\n // Calculate the center of the viewport\n const centerX = this._width / 2\n const centerY = this._height / 2\n\n // Calculate the scale factor\n const k = this._initialScale * clampedZoomLevel\n\n // Calculate translation to center the target point\n // We need to account for the current projection center\n const currentCenter = this._projection.translate()\n const x = currentCenter[0] + (centerX - targetPoint[0]) * (k / this._initialScale)\n const y = currentCenter[1] + (centerY - targetPoint[1]) * (k / this._initialScale)\n\n const transform = zoomIdentity.translate(x, y).scale(k)\n\n // Update internal state\n this._currentZoomLevel = clampedZoomLevel\n this._center = [x, y]\n\n // Set flag to indicate this is a component-initiated zoom\n this._eventInitiatedByComponent = true\n\n // Apply the transform with smooth eased animation\n this.g\n .transition()\n .duration(config.zoomDuration)\n .ease(easeCubicInOut)\n .call(this._zoomBehavior.transform, transform)\n }\n\n private _resetExpandedCluster (): void {\n this._expandedCluster?.points?.forEach((d: any) => { delete d.expandedClusterPoint })\n this._expandedCluster = null\n }\n\n private _initFlowFeatures (): void {\n const { config, datamodel } = this\n // Use raw links data instead of processed links to avoid point lookup issues for flows\n const rawLinks = datamodel.data?.links || []\n\n // Clear existing flow data\n this._flowParticles = []\n this._sourcePoints = []\n\n if (!rawLinks || rawLinks.length === 0) return\n\n // Create source points and flow particles for each link\n rawLinks.forEach((link, i) => {\n // Try to get coordinates from flow-specific accessors first, then fall back to link endpoints\n let sourceLon: number, sourceLat: number, targetLon: number, targetLat: number\n\n if (config.sourceLongitude && config.sourceLatitude) {\n sourceLon = getNumber(link, config.sourceLongitude)\n sourceLat = getNumber(link, config.sourceLatitude)\n } else {\n // Fall back to using linkSource point coordinates\n const sourcePoint = config.linkSource?.(link)\n if (typeof sourcePoint === 'object' && sourcePoint !== null) {\n sourceLon = getNumber(sourcePoint as PointDatum, config.longitude)\n sourceLat = getNumber(sourcePoint as PointDatum, config.latitude)\n } else {\n return // Skip if can't resolve source coordinates\n }\n }\n\n if (config.targetLongitude && config.targetLatitude) {\n targetLon = getNumber(link, config.targetLongitude)\n targetLat = getNumber(link, config.targetLatitude)\n } else {\n // Fall back to using linkTarget point coordinates\n const targetPoint = config.linkTarget?.(link)\n if (typeof targetPoint === 'object' && targetPoint !== null) {\n targetLon = getNumber(targetPoint as PointDatum, config.longitude)\n targetLat = getNumber(targetPoint as PointDatum, config.latitude)\n } else {\n return // Skip if can't resolve target coordinates\n }\n }\n\n if (!isNumber(sourceLon) || !isNumber(sourceLat) || !isNumber(targetLon) || !isNumber(targetLat)) {\n return\n }\n\n const source = { lat: sourceLat, lon: sourceLon }\n const target = { lat: targetLat, lon: targetLon }\n\n // Create source point\n const sourcePos = this._projection([sourceLon, sourceLat])\n if (sourcePos) {\n const sourcePoint: FlowSourcePoint = {\n lat: sourceLat,\n lon: sourceLon,\n x: sourcePos[0],\n y: sourcePos[1],\n radius: getNumber(link, config.sourcePointRadius),\n color: getColor(link, config.sourcePointColor, i),\n flowData: link,\n }\n this._sourcePoints.push(sourcePoint)\n }\n\n // Create flow particles\n const dist = Math.sqrt((targetLat - sourceLat) ** 2 + (targetLon - sourceLon) ** 2)\n const numParticles = Math.max(1, Math.round(dist * getNumber(link, config.flowParticleDensity)))\n const velocity = getNumber(link, config.flowParticleSpeed)\n const radius = getNumber(link, config.flowParticleRadius)\n const color = getColor(link, config.flowParticleColor, i)\n\n for (let j = 0; j < numParticles; j += 1) {\n const progress = j / numParticles\n const location = {\n lat: sourceLat + (targetLat - sourceLat) * progress,\n lon: sourceLon + (targetLon - sourceLon) * progress,\n }\n\n const pos = this._projection([location.lon, location.lat])\n if (pos) {\n const particle: FlowParticle = {\n x: pos[0],\n y: pos[1],\n source,\n target,\n location,\n velocity,\n radius,\n color,\n flowData: link,\n progress: 0, // Keep for compatibility but not used in angle-based movement\n id: `${getString(link, config.linkId, i) || i}-${j}`,\n }\n this._flowParticles.push(particle)\n }\n }\n })\n }\n\n private _renderSourcePoints (duration: number): void {\n const { config } = this\n\n const sourcePoints = this._sourcePointsGroup\n .selectAll<SVGCircleElement, FlowSourcePoint>(`.${s.sourcePoint}`)\n .data(this._sourcePoints, (d, i) => `${d.flowData}-${i}`)\n\n const sourcePointsEnter = sourcePoints.enter()\n .append('circle')\n .attr('class', s.sourcePoint)\n .attr('r', 0)\n .style('opacity', 0)\n .on('click', (event: MouseEvent, d) => {\n event.stopPropagation()\n config.onSourcePointClick?.(d.flowData, d.x, d.y, event)\n })\n .on('mouseenter', (event: MouseEvent, d) => {\n config.onSourcePointMouseEnter?.(d.flowData, d.x, d.y, event)\n })\n .on('mouseleave', (event: MouseEvent, d) => {\n config.onSourcePointMouseLeave?.(d.flowData, event)\n })\n\n smartTransition(sourcePointsEnter.merge(sourcePoints), duration)\n .attr('cx', d => d.x)\n .attr('cy', d => d.y)\n .attr('r', d => d.radius / (this._currentZoomLevel || 1))\n .style('fill', d => d.color)\n .style('stroke', d => d.color)\n .style('opacity', 1)\n\n sourcePoints.exit().remove()\n }\n\n private _renderFlowParticles (duration: number): void {\n const flowParticles = this._flowParticlesGroup\n .selectAll<SVGCircleElement, FlowParticle>(`.${s.flowParticle}`)\n .data(this._flowParticles, d => d.id)\n\n const flowParticlesEnter = flowParticles.enter()\n .append('circle')\n .attr('class', s.flowParticle)\n .attr('r', 0)\n .style('opacity', 0)\n\n smartTransition(flowParticlesEnter.merge(flowParticles), duration)\n .attr('cx', d => d.x)\n .attr('cy', d => d.y)\n .attr('r', d => d.radius / (this._currentZoomLevel || 1))\n .style('fill', d => d.color)\n .style('opacity', 0.8)\n\n flowParticles.exit().remove()\n }\n\n private _startFlowAnimation (): void {\n if (this._animationId) return // Animation already running\n\n this._animateFlow()\n }\n\n private _animateFlow (): void {\n if (!this.config.enableFlowAnimation) return\n\n this._animationId = requestAnimationFrame(() => {\n this._updateFlowParticles()\n this._animateFlow() // Recursive call like LeafletFlowMap\n })\n }\n\n private _stopFlowAnimation (): void {\n if (this._animationId) {\n cancelAnimationFrame(this._animationId)\n this._animationId = null\n }\n }\n\n private _updateFlowParticles (): void {\n if (this._flowParticles.length === 0) return\n\n const zoomLevel = this._currentZoomLevel || 1\n\n this._flowParticles.forEach(particle => {\n const { source, target } = particle\n\n // Calculate movement using angle-based velocity (like LeafletFlowMap)\n const fullDist = Math.sqrt((target.lat - source.lat) ** 2 + (target.lon - source.lon) ** 2)\n const remainedDist = Math.sqrt((target.lat - particle.location.lat) ** 2 + (target.lon - particle.location.lon) ** 2)\n const angle = Math.atan2(target.lat - source.lat, target.lon - source.lon)\n\n // Update geographic location\n particle.location.lat += particle.velocity * Math.sin(angle)\n particle.location.lon += particle.velocity * Math.cos(angle)\n\n // Reset to start when reaching target (like LeafletFlowMap)\n if (\n (((target.lat > source.lat) && (particle.location.lat > target.lat)) || ((target.lon > source.lon) && (particle.location.lon > target.lon))) ||\n (((target.lat < source.lat) && (particle.location.lat < target.lat)) || ((target.lon < source.lon) && (particle.location.lon < target.lon)))\n ) {\n particle.location.lat = source.lat\n particle.location.lon = source.lon\n }\n\n // Project to screen coordinates\n const pos = this._projection([particle.location.lon, particle.location.lat])\n if (pos) {\n // Add orthogonal arc shift (adapted from LeafletFlowMap)\n const orthogonalArcShift = -(zoomLevel ** 2 * fullDist / 8) * Math.cos(Math.PI / 2 * (fullDist / 2 - remainedDist) / (fullDist / 2)) || 0\n particle.x = pos[0]\n particle.y = pos[1] + orthogonalArcShift\n }\n })\n\n // Update DOM elements directly without data rebinding (for performance)\n this._flowParticlesGroup\n .selectAll<SVGCircleElement, any>(`.${s.flowParticle}`)\n .attr('cx', (d, i) => this._flowParticles[i]?.x || 0)\n .attr('cy', (d, i) => this._flowParticles[i]?.y || 0)\n .attr('r', (d, i) => (this._flowParticles[i]?.radius || 1) / zoomLevel)\n }\n\n destroy (): void {\n window.cancelAnimationFrame(this._animFrameId)\n this._stopFlowAnimation()\n window.cancelAnimationFrame(this._collideLabelsAnimFrameId)\n }\n}\n"],"names":["s.background","s.features","s.areaLabel","s.links","s.points","s.flowParticles","s.sourcePoints","s.feature","s.link","s.point","s.pointCircle","s.pointLabel","s.sourcePoint","s.flowParticle","s"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/topojson-map/index.ts"],"sourcesContent":["import { Selection, select } from 'd3-selection'\nimport { D3ZoomEvent, zoom, ZoomBehavior, zoomIdentity, ZoomTransform } from 'd3-zoom'\nimport { timeout } from 'd3-timer'\nimport { easeCubicInOut } from 'd3-ease'\nimport { geoPath, GeoProjection, ExtendedFeatureCollection } from 'd3-geo'\nimport { color } from 'd3-color'\n\nimport { feature } from 'topojson-client'\nimport Supercluster from 'supercluster'\n\n// Core\nimport { ComponentCore } from 'core/component'\nimport { MapGraphDataModel } from 'data-models/map-graph'\n\n// Utils\nimport { clamp, getNumber, getString, isNumber } from 'utils/data'\nimport { smartTransition } from 'utils/d3'\nimport { getColor, hexToBrightness } from 'utils/color'\nimport { getCSSVariableValue, isStringCSSVariable, rectIntersect } from 'utils/misc'\nimport { estimateStringPixelLength } from 'utils/text'\n\n// Types\nimport { MapLink } from 'types/map'\nimport { Rect } from 'types/misc'\n\n// Local Types\nimport {\n MapData,\n MapFeature,\n MapPointLabelPosition,\n MapProjection,\n TopoJSONMapPointShape,\n TopoJSONMapPoint,\n TopoJSONMapClusterDatum,\n TopoJSONMapPointDatum,\n FlowParticle,\n FlowSourcePoint,\n} from './types'\n\n// Config\nimport { TopoJSONMapDefaultConfig, TopoJSONMapConfigInterface } from './config'\n\n// Modules\nimport { arc, getLonLat, getDonutData, getPointPathData, calculateClusterIndex, getNextZoomLevelOnClusterClick } from './utils'\nimport { updateDonut } from './modules/donut'\n\n// Styles\nimport * as s from './style'\n\nexport class TopoJSONMap<\n AreaDatum,\n PointDatum = unknown,\n LinkDatum = unknown,\n> extends ComponentCore<\n MapData<AreaDatum, PointDatum, LinkDatum>,\n TopoJSONMapConfigInterface<AreaDatum, PointDatum, LinkDatum>\n > {\n static selectors = s\n protected _defaultConfig = TopoJSONMapDefaultConfig as TopoJSONMapConfigInterface<AreaDatum, PointDatum, LinkDatum>\n public config: TopoJSONMapConfigInterface<AreaDatum, PointDatum, LinkDatum> = this._defaultConfig\n\n datamodel: MapGraphDataModel<AreaDatum, PointDatum, LinkDatum> = new MapGraphDataModel()\n g: Selection<SVGGElement, unknown, null, undefined>\n private _firstRender = true\n private _isResizing = false\n private _initialScale: number = undefined\n private _center: [number, number]\n private _currentZoomLevel: number = undefined\n private _transform: ZoomTransform\n private _path = geoPath()\n private _projection: GeoProjection\n private _prevWidth: number\n private _prevHeight: number\n private _animFrameId: number\n private _clusterIndex: Supercluster<PointDatum> | null = null\n private _expandedCluster: {\n cluster: TopoJSONMapPoint<PointDatum>;\n points: any[];\n } | null = null\n\n private _eventInitiatedByComponent = false\n private _collideLabelsAnimFrameId: ReturnType<typeof requestAnimationFrame>\n\n private _featureCollection: GeoJSON.FeatureCollection\n private _zoomBehavior: ZoomBehavior<SVGGElement, unknown> = zoom()\n private _backgroundRect = this.g.append('rect').attr('class', s.background)\n private _featuresGroup = this.g.append('g').attr('class', s.features)\n private _areaLabelsGroup = this.g.append('g').attr('class', s.areaLabel)\n private _linksGroup = this.g.append('g').attr('class', s.links)\n private _pointsGroup = this.g.append('g').attr('class', s.points)\n\n // Flow-related properties\n private _flowParticlesGroup = this.g.append('g').attr('class', s.flowParticles)\n private _sourcePointsGroup = this.g.append('g').attr('class', s.sourcePoints)\n private _flowParticles: any[] = []\n private _sourcePoints: any[] = []\n private _animationId: number | null = null\n\n events = {\n [TopoJSONMap.selectors.point]: {},\n [TopoJSONMap.selectors.feature]: {},\n }\n\n constructor (config?: TopoJSONMapConfigInterface<AreaDatum, PointDatum, LinkDatum>, data?: MapData<AreaDatum, PointDatum, LinkDatum>) {\n super()\n this._zoomBehavior.on('zoom', this._onZoom.bind(this))\n\n if (config) this.setConfig(config)\n if (data) this.setData(data)\n\n this.g.append('defs')\n .append('filter')\n .attr('id', 'heatmapFilter')\n .html(`\n <feGaussianBlur in=\"SourceGraphic\" stdDeviation=\"${this.config.heatmapModeBlurStdDeviation}\" color-interpolation-filters=\"sRGB\" result=\"blur\"></feGaussianBlur>\n <feColorMatrix class=\"blurValues\" in=\"blur\" mode=\"matrix\" values=\"1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 20 -4\"></feColorMatrix>\n `)\n }\n\n setData (data: MapData<AreaDatum, PointDatum, LinkDatum>): void {\n const { config } = this\n\n this.datamodel.pointId = config.pointId\n this.datamodel.linkSource = config.linkSource\n this.datamodel.linkTarget = config.linkTarget\n this.datamodel.data = data\n\n // Reset expanded cluster when data changes\n this._resetExpandedCluster()\n\n // Initialize clustering if enabled\n if (config.clustering && data.points?.length) {\n const dataValid = data.points.filter(d => {\n const lat = getNumber(d, config.latitude)\n const lon = getNumber(d, config.longitude)\n return isNumber(lat) && isNumber(lon)\n })\n\n this._clusterIndex = calculateClusterIndex(dataValid as any, this.config as any) as any\n } else {\n this._clusterIndex = null\n }\n\n // If there was a data change and mapFitToPoints is enabled, we will need to re-fit the map\n this._firstRender = this._firstRender || config.mapFitToPoints\n }\n\n setConfig (config?: TopoJSONMapConfigInterface<AreaDatum, PointDatum, LinkDatum>): void {\n super.setConfig(config)\n\n // Setting the default here instead of defaultConfig to prevent mutation from other TopoJSONMap instances\n const newProjection = this.config.projection ?? MapProjection.Kavrayskiy7()\n if (this._projection) {\n newProjection.scale(this._projection.scale()).translate(this._projection.translate())\n }\n this._projection = newProjection\n }\n\n _render (customDuration?: number): void {\n const { config } = this\n const duration = isNumber(customDuration) ? customDuration : config.duration\n\n this._renderBackground()\n this._renderMap(duration)\n this._renderAreaLabels(duration)\n this._renderGroups(duration)\n this._renderLinks(duration)\n this._renderPoints(duration)\n\n // Flow features\n if (config.enableFlowAnimation) {\n this._initFlowFeatures()\n this._renderSourcePoints(duration)\n this._renderFlowParticles(duration)\n this._startFlowAnimation()\n } else {\n this._stopFlowAnimation()\n }\n\n // When animation is running we need to temporary disable zoom behaviour\n if (duration && !config.disableZoom) {\n this.g.on('.zoom', null)\n timeout(() => {\n this.g.call(this._zoomBehavior)\n }, duration)\n }\n\n // When zoom behaviour is active we assign the `draggable` class to show the grabbing cursor\n this.g.classed('draggable', !config.disableZoom)\n this._firstRender = false\n }\n\n _renderBackground (): void {\n this._backgroundRect\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('transform', `translate(${-this.bleed.left}, ${-this.bleed.top})`)\n }\n\n _renderGroups (duration: number): void {\n const transformString = this._transform.toString()\n smartTransition(this._featuresGroup, duration)\n .attr('transform', transformString)\n .attr('stroke-width', 1 / this._currentZoomLevel)\n\n smartTransition(this._areaLabelsGroup, duration)\n .attr('transform', transformString)\n\n smartTransition(this._linksGroup, duration)\n .attr('transform', transformString)\n\n smartTransition(this._pointsGroup, duration)\n .attr('transform', transformString)\n\n // Flow groups\n smartTransition(this._sourcePointsGroup, duration)\n .attr('transform', transformString)\n\n smartTransition(this._flowParticlesGroup, duration)\n .attr('transform', transformString)\n }\n\n _renderMap (duration: number): void {\n const { bleed, config, datamodel } = this\n\n this.g.attr('transform', `translate(${bleed.left}, ${bleed.top})`)\n const mapData: TopoJSON.Topology = config.topojson\n const featureName = config.mapFeatureName\n const featureObject = mapData?.objects?.[featureName]\n if (!featureObject) return\n\n this._featureCollection = feature(mapData, featureObject) as GeoJSON.FeatureCollection\n const featureData = (this._featureCollection?.features ?? []) as MapFeature<AreaDatum>[]\n\n if (this._firstRender) {\n // Rendering the map for the first time.\n this._projection.fitExtent([[0, 0], [this._width, this._height]], this._featureCollection)\n this._initialScale = this._projection.scale()\n this._center = this._projection.translate()\n\n if (config.mapFitToPoints) {\n this._fitToPoints()\n }\n\n const zoomExtent = config.zoomExtent\n this._zoomBehavior.scaleExtent([zoomExtent[0] * this._initialScale, zoomExtent[1] * this._initialScale])\n this.setZoom(config.zoomFactor || 1)\n\n if (!config.disableZoom) {\n this.g.call(this._zoomBehavior)\n this._applyZoom()\n }\n\n this._prevWidth = this._width\n this._prevHeight = this._height\n }\n\n if (this._prevWidth !== this._width || this._prevHeight !== this._height) {\n this._onResize()\n }\n\n\n this._path.projection(this._projection)\n\n // Merge passed area data and map feature data\n const areaData = datamodel.areas\n areaData.forEach(a => {\n const feature = featureData.find(f => f.id.toString() === getString(a, config.areaId).toString())\n if (feature) feature.data = a\n else if (this._firstRender) console.warn(`Can't find feature by area code ${getString(a, config.areaId)}`)\n })\n\n const features = this._featuresGroup\n .selectAll<SVGPathElement, unknown>(`.${s.feature}`)\n .data(featureData)\n\n const featuresEnter = features.enter().append('path').attr('class', s.feature)\n smartTransition(featuresEnter.merge(features), duration)\n .attr('d', this._path)\n .style('fill', (d, i) => d.data ? getColor(d.data, config.areaColor, i) : null)\n .style('cursor', d => d.data ? getString(d.data, config.areaCursor) : null)\n features.exit().remove()\n }\n\n _renderAreaLabels (duration: number): void {\n const { config } = this\n\n // Early return if no area label configuration\n if (!config.areaLabel) {\n this._areaLabelsGroup.selectAll('*').remove()\n return\n }\n\n const featureData = (this._featureCollection?.features ?? []) as MapFeature<AreaDatum>[]\n\n // Prepare candidate labels with optimized filtering and calculations\n const candidateLabels = featureData\n .map(feature => {\n // Get label text from user-provided area data only\n const labelText = feature.data ? getString(feature.data, config.areaLabel) : null\n if (!labelText) return null\n\n const centroid = this._path.centroid(feature)\n\n // Skip if centroid is invalid (e.g., for very small or complex shapes)\n if (!centroid || centroid.some(coord => !isFinite(coord))) return null\n\n const bounds = this._path.bounds(feature)\n const area = (bounds[1][0] - bounds[0][0]) * (bounds[1][1] - bounds[0][1])\n\n return {\n feature,\n centroid,\n area,\n labelText,\n id: feature.data ? getString(feature.data, config.areaId) : feature.id?.toString(),\n }\n })\n .filter(Boolean) // Remove null entries\n .sort((a, b) => b.area - a.area) // Prioritize larger areas\n\n // D3 data binding with improved key function\n const labels = this._areaLabelsGroup\n .selectAll<SVGTextElement, typeof candidateLabels[0]>(`.${s.areaLabel}`)\n .data(candidateLabels, d => d.id || '')\n\n // Handle entering labels\n const labelsEnter = labels.enter()\n .append('text')\n .attr('class', s.areaLabel)\n .attr('transform', d => `translate(${d.centroid[0]},${d.centroid[1]})`)\n .style('opacity', 0)\n .style('pointer-events', 'none')\n\n // Update all labels (enter + update)\n const labelsMerged = labelsEnter.merge(labels)\n labelsMerged\n .text(d => d.labelText)\n .attr('transform', d => `translate(${d.centroid[0]},${d.centroid[1]})`)\n .style('font-size', `calc(var(--vis-map-point-label-font-size) / ${this._currentZoomLevel})`)\n .style('text-anchor', 'middle')\n .style('dominant-baseline', 'middle')\n\n // Handle exiting labels\n smartTransition(labels.exit(), duration)\n .style('opacity', 0)\n .remove()\n\n // Run collision detection immediately to prevent flickering during zoom\n if (candidateLabels.length > 0) {\n window.cancelAnimationFrame(this._collideLabelsAnimFrameId)\n // Run collision detection synchronously first\n this._collideLabels()\n\n // Then schedule follow-up collision detection for any dynamic changes\n this._collideLabelsAnimFrameId = window.requestAnimationFrame(() => {\n this._collideLabels()\n })\n }\n\n // Animate to visible state AFTER collision detection\n smartTransition(labelsMerged, duration)\n .style('opacity', 1)\n }\n\n private _collideLabels (): void {\n const labels = this._areaLabelsGroup.selectAll<SVGTextElement, any>(`.${s.areaLabel}`)\n const labelNodes = labels.nodes()\n const labelData = labels.data()\n\n if (labelNodes.length === 0) return\n\n // Reset all labels to visible and mark them as such\n labelNodes.forEach((node: any) => {\n node._labelVisible = true\n })\n\n // Helper function to get bounding box\n const getBBox = (labelData: any): Rect => {\n const [x, y] = labelData.centroid\n const labelText = labelData.labelText || ''\n const fontSize = 12 // Default font size\n\n const width = estimateStringPixelLength(labelText, fontSize, 0.6)\n const height = fontSize * 1.2 // Line height factor\n\n return {\n x: x - width / 2,\n y: y - height / 2,\n width,\n height,\n }\n }\n\n // Run collision detection similar to scatter plot\n labelNodes.forEach((node1: any, i) => {\n const data1 = labelData[i]\n if (!node1._labelVisible) return\n\n const label1BoundingRect = getBBox(data1)\n\n for (let j = 0; j < labelNodes.length; j++) {\n if (i === j) continue\n\n const node2 = labelNodes[j] as any\n const data2 = labelData[j]\n\n if (!node2._labelVisible) continue\n\n const label2BoundingRect = getBBox(data2)\n const intersect = rectIntersect(label1BoundingRect, label2BoundingRect, 2)\n\n if (intersect) {\n // Priority based on area size - larger areas keep their labels\n if (data1.area >= data2.area) {\n node2._labelVisible = false\n } else {\n node1._labelVisible = false\n break\n }\n }\n }\n })\n\n // Apply visibility based on collision detection\n labels.style('opacity', (d, i) => (labelNodes[i] as any)._labelVisible ? 1 : 0)\n }\n\n _renderLinks (duration: number): void {\n const { config, datamodel } = this\n const links = datamodel.links\n\n const edges = this._linksGroup\n .selectAll<SVGPathElement, MapLink<PointDatum, LinkDatum>>(`.${s.link}`)\n .data(links, (d, i) => getString(d, config.linkId, i))\n\n const edgesEnter = edges.enter().append('path').attr('class', s.link)\n .style('stroke-width', 0)\n\n smartTransition(edgesEnter.merge(edges), duration)\n .attr('d', link => {\n const source = this._projection(getLonLat(link.source, config.longitude, config.latitude))\n const target = this._projection(getLonLat(link.target, config.longitude, config.latitude))\n return arc(source, target)\n })\n .style('stroke-width', link => getNumber(link, config.linkWidth) / this._currentZoomLevel)\n .style('cursor', link => getString(link, config.linkCursor))\n .style('stroke', (link, i) => getColor(link, config.linkColor, i))\n edges.exit().remove()\n }\n\n private _getPointData (): TopoJSONMapPoint<PointDatum>[] {\n const { config, datamodel } = this\n\n if (!config.clustering || !this._clusterIndex || config.clusteringDistance === 0) {\n // Return regular points when clustering is disabled\n return datamodel.points.map((d, i) => {\n const pos = this._projection(getLonLat(d, config.longitude, config.latitude))\n const radius = getNumber(d, config.pointRadius)\n const shape = getString(d, config.pointShape) as TopoJSONMapPointShape || TopoJSONMapPointShape.Circle\n const donutData = getDonutData(d, config.colorMap)\n const pointColor = getColor(d, config.pointColor, i)\n\n return {\n geometry: { type: 'Point', coordinates: getLonLat(d, config.longitude, config.latitude) },\n bbox: { x1: pos[0] - radius, y1: pos[1] - radius, x2: pos[0] + radius, y2: pos[1] + radius },\n radius,\n path: getPointPathData({ x: 0, y: 0 }, radius, shape),\n color: pointColor,\n id: getString(d, config.pointId, i),\n properties: d as TopoJSONMapPointDatum<PointDatum>,\n donutData,\n isCluster: false,\n _zIndex: 0,\n } as TopoJSONMapPoint<PointDatum>\n })\n }\n\n // Convert all points to screen space first\n const allPoints = datamodel.points.map((d, i) => {\n const coords = getLonLat(d, config.longitude, config.latitude)\n const screenPos = this._projection(coords)\n const radius = getNumber(d, config.pointRadius)\n const shape = getString(d, config.pointShape) as TopoJSONMapPointShape || TopoJSONMapPointShape.Circle\n const donutData = getDonutData(d, config.colorMap)\n const pointColor = getColor(d, config.pointColor, i)\n\n return {\n geometry: { type: 'Point', coordinates: coords },\n bbox: { x1: screenPos[0] - radius, y1: screenPos[1] - radius, x2: screenPos[0] + radius, y2: screenPos[1] + radius },\n radius,\n path: getPointPathData({ x: 0, y: 0 }, radius, shape),\n color: pointColor,\n id: getString(d, config.pointId, i),\n properties: d as TopoJSONMapPointDatum<PointDatum>,\n donutData,\n isCluster: false,\n _zIndex: 0,\n screenX: screenPos[0],\n screenY: screenPos[1],\n originalData: d,\n }\n })\n\n // Perform clustering in screen space\n let geoJsonPoints = this._clusterInScreenSpace(allPoints)\n\n // Handle expanded cluster points - replace the expanded cluster with individual points\n if (this._expandedCluster) {\n // Remove expanded cluster from the data\n geoJsonPoints = geoJsonPoints.filter((c: any) => c.properties.clusterId !== (this._expandedCluster?.cluster.properties as any).clusterId)\n // Add points from the expanded cluster\n geoJsonPoints = geoJsonPoints.concat(this._expandedCluster.points as any)\n }\n\n return geoJsonPoints as any\n }\n\n _renderPoints (duration: number): void {\n const { config } = this\n const hasColorMap = config.colorMap && Object.keys(config.colorMap).length > 0\n const pointData = this._getPointData()\n\n\n const points = this._pointsGroup\n .selectAll<SVGGElement, TopoJSONMapPoint<PointDatum>>(`.${s.point}`)\n .data(pointData, (d, i) => d.id.toString())\n\n // Enter\n const pointsEnter = points.enter().append('g').attr('class', s.point)\n .attr('transform', d => {\n const pos = this._projection(d.geometry.coordinates as [number, number])\n const expandedPoint = d as any\n const dx = expandedPoint.dx || 0\n const dy = expandedPoint.dy || 0\n return `translate(${pos[0] + dx},${pos[1] + dy})`\n })\n .style('opacity', 0)\n\n pointsEnter.append('path').attr('class', s.pointCircle)\n .attr('d', 'M0,0')\n .style('fill', (d, i) => d.color)\n .style('stroke-width', d => getNumber(d.properties as PointDatum, config.pointStrokeWidth))\n\n // Add donut chart group\n pointsEnter.append('g').attr('class', 'donut-group')\n\n pointsEnter.append('text').attr('class', s.pointLabel)\n .style('opacity', 0)\n\n // Update\n const pointsMerged = pointsEnter.merge(points)\n smartTransition(pointsMerged, duration)\n .attr('transform', d => {\n const pos = this._projection(d.geometry.coordinates as [number, number])\n const expandedPoint = d as any\n const dx = expandedPoint.dx || 0\n const dy = expandedPoint.dy || 0\n return `translate(${pos[0] + dx},${pos[1] + dy})`\n })\n .style('cursor', d => {\n return (d.isCluster && (config.clusterExpandOnClick || hasColorMap)) ? 'pointer' : getString(d.properties as PointDatum, config.pointCursor)\n })\n .style('opacity', 1)\n\n // Cursor is handled by the parent point element\n\n // Add click event handler for clusters\n pointsMerged\n .style('pointer-events', 'all') // Ensure pointer events are enabled\n .on('click', (event: MouseEvent, d: TopoJSONMapPoint<PointDatum>) => {\n this._onPointClick(d, event)\n })\n\n\n smartTransition(pointsMerged.select(`.${s.pointCircle}`), duration)\n .attr('d', d => {\n const radius = d.radius / (this._currentZoomLevel || 1)\n const shape = getString(d.properties as PointDatum, config.pointShape) as TopoJSONMapPointShape || TopoJSONMapPointShape.Circle\n return getPointPathData({ x: 0, y: 0 }, radius, shape)\n })\n .style('fill', d => {\n const donutData = d.donutData\n const shape = getString(d.properties as any, config.pointShape) as TopoJSONMapPointShape || TopoJSONMapPointShape.Circle\n const isRing = shape === TopoJSONMapPointShape.Ring\n const expandedPoint = d as any\n\n // For expanded cluster points, use the preserved cluster color\n if (expandedPoint.expandedClusterPoint) {\n return expandedPoint.clusterColor || expandedPoint.expandedClusterPoint.color\n }\n\n if (donutData.length > 0) return 'transparent'\n return isRing ? 'transparent' : d.color\n })\n .style('stroke', d => {\n const expandedPoint = d as any\n // For expanded cluster points, use the preserved cluster color\n if (expandedPoint.expandedClusterPoint) {\n return expandedPoint.clusterColor || expandedPoint.expandedClusterPoint.color\n }\n return d.color\n })\n .style('stroke-width', d => {\n const shape = getString(d.properties as any, config.pointShape) as TopoJSONMapPointShape || TopoJSONMapPointShape.Circle\n const isRing = shape === TopoJSONMapPointShape.Ring\n const baseStrokeWidth = isRing ? getNumber(d.properties as any, config.pointRingWidth) : getNumber(d.properties as any, config.pointStrokeWidth)\n return baseStrokeWidth / (this._currentZoomLevel || 1)\n })\n\n // Update donut charts\n const currentZoomLevel = this._currentZoomLevel\n pointsMerged.select('.donut-group')\n .style('pointer-events', 'none') // Allow clicks to pass through donut charts\n .each(function (d) {\n if (d.donutData.length > 0) {\n const radius = getNumber(d.properties as any, config.pointRadius, 0) / (currentZoomLevel || 1)\n const arcWidth = (d.isCluster ? 4 : 2) / (currentZoomLevel || 1) // Thicker ring for clusters\n updateDonut(select(this as SVGGElement), d.donutData, radius, arcWidth, 0.05)\n } else {\n select(this as SVGGElement).selectAll('*').remove()\n }\n })\n\n const pointLabelsMerged = pointsMerged.select(`.${s.pointLabel}`)\n pointLabelsMerged\n .text(d => {\n if (d.isCluster) {\n // Use cluster label for clusters\n return getString(d as any, config.clusterLabel) ?? ''\n } else {\n // Use point label for regular points\n return getString(d.properties as any, config.pointLabel) ?? ''\n }\n })\n .style('font-size', d => {\n if (config.pointLabelPosition === MapPointLabelPosition.Bottom) {\n return `calc(var(--vis-map-point-label-font-size) / ${this._currentZoomLevel}`\n }\n const pointDiameter = 2 * getNumber(d.properties as any, config.pointRadius, 0)\n const pointLabelText = d.isCluster\n ? (getString(d as any, config.clusterLabel) || '')\n : (getString(d.properties as any, config.pointLabel) || '')\n const textLength = pointLabelText.length\n const fontSize = 0.5 * pointDiameter / Math.pow(textLength, 0.4)\n return clamp(fontSize, fontSize, 16)\n })\n .attr('y', d => {\n if (config.pointLabelPosition === MapPointLabelPosition.Center) return null\n\n const pointRadius = getNumber(d.properties as any, config.pointRadius, 0) / this._currentZoomLevel\n return pointRadius\n })\n .attr('dy', config.pointLabelPosition === MapPointLabelPosition.Center ? '0.32em' : '1em')\n\n smartTransition(pointLabelsMerged, duration)\n .style('fill', (d, i) => {\n if (config.pointLabelPosition === MapPointLabelPosition.Bottom) return null\n\n if (d.isCluster) {\n // For clusters, use contrasting color against cluster background\n const clusterColor = getColor(d as any, config.clusterColor) || '#2196F3'\n const hex = color(isStringCSSVariable(clusterColor) ? getCSSVariableValue(clusterColor, this.element) : clusterColor)?.hex()\n if (hex) {\n const brightness = hexToBrightness(hex)\n return brightness > 0.5 ? '#333' : '#fff'\n }\n return '#fff'\n } else {\n // Regular point label color logic\n const pointColor = getColor(d.properties as any, config.pointColor, i)\n const hex = color(isStringCSSVariable(pointColor) ? getCSSVariableValue(pointColor, this.element) : pointColor)?.hex()\n if (!hex) return null\n\n const brightness = hexToBrightness(hex)\n return brightness > config.pointLabelTextBrightnessRatio ? 'var(--vis-map-point-label-text-color-dark)' : 'var(--vis-map-point-label-text-color-light)'\n }\n })\n .style('font-weight', d => d.isCluster ? 'bold' : 'normal')\n .style('opacity', 1)\n\n // Exit\n points.exit().remove()\n\n // Heatmap\n this._pointsGroup.style('filter', (config.heatmapMode && this._currentZoomLevel < config.heatmapModeZoomLevelThreshold) ? 'url(#heatmapFilter)' : null)\n this._pointsGroup.selectAll(`.${s.pointLabel}`).style('display', (config.heatmapMode && (this._currentZoomLevel < config.heatmapModeZoomLevelThreshold)) ? 'none' : null)\n }\n\n _fitToPoints (points?: PointDatum[], pad = 0.1): void {\n const { config, datamodel } = this\n const pointData = points || datamodel.points\n if (pointData.length === 0) return\n\n this.fitView()\n\n const featureCollection: ExtendedFeatureCollection = {\n type: 'FeatureCollection',\n features: [{\n type: 'Feature',\n properties: {},\n geometry: {\n type: 'MultiPoint',\n coordinates: pointData.map(p => {\n return [\n getNumber(p, d => getNumber(d, config.longitude)),\n getNumber(p, d => getNumber(d, config.latitude)),\n ]\n }),\n },\n }],\n }\n\n this._projection.fitExtent([\n [this._width * pad, this._height * pad],\n [this._width * (1 - pad), this._height * (1 - pad)],\n ], featureCollection)\n\n const maxScale = config.zoomExtent[1] * this._initialScale\n const fittedScale = this._projection.scale()\n\n if (fittedScale > maxScale) {\n const fittedTranslate = this._projection.translate()\n const scaleRatio = maxScale / fittedScale\n\n this._projection.scale(maxScale)\n this._projection.translate([\n this._width / 2 - (this._width / 2 - fittedTranslate[0]) * scaleRatio,\n this._height / 2 - (this._height / 2 - fittedTranslate[1]) * scaleRatio,\n ])\n }\n\n // If we don't update the center, the next zoom will be centered around the previous value\n this._center = this._projection.translate()\n this._applyZoom()\n }\n\n _applyZoom (): void {\n const translate = this._center ?? this._projection.translate()\n const scale = this._initialScale * this._currentZoomLevel\n this.g.call(this._zoomBehavior.transform, zoomIdentity.translate(translate[0], translate[1]).scale(scale))\n }\n\n _onResize (): void {\n this._isResizing = true\n const prevTranslate = this._projection.translate()\n\n this._projection.fitExtent([[0, 0], [this._width, this._height]], this._featureCollection)\n this._initialScale = this._projection.scale()\n this._center = [\n this._projection.translate()[0] * this._center[0] / prevTranslate[0],\n this._projection.translate()[1] * this._center[1] / prevTranslate[1],\n ]\n this._applyZoom()\n\n this._isResizing = false\n this._prevWidth = this._width\n this._prevHeight = this._height\n }\n\n _onZoom (event: D3ZoomEvent<any, any>): void {\n if (this._firstRender) return // To prevent double render because of binding zoom behaviour\n const isMouseEvent = event.sourceEvent !== undefined\n const isExternalEvent = !event?.sourceEvent && !this._isResizing\n\n // Reset expanded cluster when manually zooming (but not during component-initiated zoom)\n if (isMouseEvent && !this._eventInitiatedByComponent) this._resetExpandedCluster()\n\n // Reset the flag after handling the zoom\n if (this._eventInitiatedByComponent && !isMouseEvent) {\n this._eventInitiatedByComponent = false\n }\n\n window.cancelAnimationFrame(this._animFrameId)\n this._animFrameId = window.requestAnimationFrame(this._onZoomHandler.bind(this, event.transform, isMouseEvent, isExternalEvent))\n\n if (isMouseEvent) {\n // Update the center coordinate so that the next call to _applyZoom()\n // will zoom with respect to the current view\n this._center = [event.transform.x, event.transform.y]\n }\n // _currentZoomLevel is now set in _onZoomHandler to track previous value\n }\n\n _onZoomHandler (transform: ZoomTransform, isMouseEvent: boolean, isExternalEvent: boolean): void {\n const scale = transform.k / this._initialScale || 1\n const center = this._projection.translate()\n\n this._transform = zoomIdentity\n .translate(transform.x - center[0] * scale, transform.y - center[1] * scale)\n .scale(scale)\n\n // Update zoom level for clustering calculations\n this._currentZoomLevel = (transform.k / this._initialScale) || 1\n\n const customDuration = isExternalEvent\n ? this.config.zoomDuration\n : (isMouseEvent ? 0 : null)\n\n // Call render functions that depend on this._transform\n this._renderGroups(customDuration)\n this._renderAreaLabels(customDuration)\n this._renderLinks(customDuration)\n this._renderPoints(customDuration)\n\n // Update flow features on zoom\n if (this.config.enableFlowAnimation) {\n this._renderSourcePoints(customDuration)\n this._renderFlowParticles(customDuration)\n }\n\n // Update flow features on zoom\n if (this.config.enableFlowAnimation) {\n this._renderSourcePoints(customDuration)\n this._renderFlowParticles(customDuration)\n }\n }\n\n public zoomIn (increment = 0.5): void {\n this.setZoom(this._currentZoomLevel + increment)\n }\n\n public zoomOut (increment = 0.5): void {\n this.setZoom(this._currentZoomLevel - increment)\n }\n\n public setZoom (zoomLevel: number): void {\n const { config } = this\n this._currentZoomLevel = clamp(zoomLevel, config.zoomExtent[0], config.zoomExtent[1])\n this._transform = zoomIdentity\n .translate(this._center[0] * (1 - this._currentZoomLevel), this._center[1] * (1 - this._currentZoomLevel))\n .scale(this._currentZoomLevel)\n // We are using this._applyZoom() instead of directly calling this._render(config.zoomDuration) because\n // we've to \"attach\" new transform to the map group element. Otherwise zoomBehavior will not know\n // that the zoom state has changed\n this._applyZoom()\n }\n\n public fitView (): void {\n this._projection.fitExtent([[0, 0], [this._width, this._height]], this._featureCollection)\n this._currentZoomLevel = (this._projection?.scale() / this._initialScale) || 1\n this._center = this._projection.translate()\n // We are using this._applyZoom() instead of directly calling this._render(config.zoomDuration) because\n // we've to \"attach\" new transform to the map group element. Otherwise zoomBehavior will not know\n // that the zoom state has changed\n this._applyZoom()\n }\n\n public fitViewToFlows (pad = 0.1): void {\n const { config, datamodel } = this\n const points: PointDatum[] = [...(datamodel.points || [])]\n const links = datamodel.links || []\n\n // Add flow endpoints to the points to consider for fitting\n links.forEach((link) => {\n // Try to get source point\n if (config.sourceLongitude && config.sourceLatitude) {\n const sourceLon = getNumber(link, config.sourceLongitude)\n const sourceLat = getNumber(link, config.sourceLatitude)\n if (isNumber(sourceLon) && isNumber(sourceLat)) {\n points.push({ longitude: sourceLon, latitude: sourceLat } as unknown as PointDatum)\n }\n } else {\n const sourcePoint = config.linkSource?.(link)\n if (typeof sourcePoint === 'object' && sourcePoint !== null) {\n points.push(sourcePoint as PointDatum)\n }\n }\n\n // Try to get target point\n if (config.targetLongitude && config.targetLatitude) {\n const targetLon = getNumber(link, config.targetLongitude)\n const targetLat = getNumber(link, config.targetLatitude)\n if (isNumber(targetLon) && isNumber(targetLat)) {\n points.push({ longitude: targetLon, latitude: targetLat } as unknown as PointDatum)\n }\n } else {\n const targetPoint = config.linkTarget?.(link)\n if (typeof targetPoint === 'object' && targetPoint !== null) {\n points.push(targetPoint as PointDatum)\n }\n }\n })\n\n if (points.length > 0) {\n this._fitToPoints(points, pad)\n } else {\n this.fitView()\n }\n }\n\n private _onPointClick (d: TopoJSONMapPoint<PointDatum>, event: MouseEvent): void {\n const { config } = this\n event.stopPropagation()\n\n // Handle clicking on expanded cluster points to collapse them\n const expandedPoint = d as any\n if (expandedPoint.expandedClusterPoint) {\n this._resetExpandedCluster()\n this._renderPoints(config.duration)\n return\n }\n\n if (d.isCluster && (d.properties as TopoJSONMapClusterDatum<PointDatum>).cluster) {\n // Enable click expansion when clusterExpandOnClick is true OR when colorMap is enabled (for pie chart clusters)\n const hasColorMap = config.colorMap && Object.keys(config.colorMap).length > 0\n\n if (config.clusterExpandOnClick || hasColorMap) {\n // Always expand the cluster to show individual points\n const expandedPoints = this._expandCluster(d)\n\n // Calculate the geographic center (centroid) of the expanded points and zoom to it\n if (expandedPoints && expandedPoints.length > 0) {\n const avgLat = expandedPoints.reduce((sum, p) => sum + getNumber(p, config.latitude), 0) / expandedPoints.length\n const avgLon = expandedPoints.reduce((sum, p) => sum + getNumber(p, config.longitude), 0) / expandedPoints.length\n const centroidCoordinates: [number, number] = [avgLon, avgLat]\n\n // Calculate appropriate zoom level\n const newZoomLevel = getNextZoomLevelOnClusterClick(this._currentZoomLevel || 1)\n\n // Start zoom immediately for smoother transition\n this._zoomToLocation(centroidCoordinates, newZoomLevel)\n }\n }\n }\n }\n\n private _clusterInScreenSpace (points: any[]): any[] {\n const { config } = this\n const clusteringDistance = config.clusteringDistance || 55\n\n // If clustering distance is 0, return all points as individual points\n if (clusteringDistance === 0) {\n return points\n }\n\n const clusters: any[] = []\n const processed = new Set<number>()\n\n for (let i = 0; i < points.length; i++) {\n if (processed.has(i)) continue\n\n const point = points[i]\n const nearbyPoints = [point]\n processed.add(i)\n\n // Find all points within clustering distance\n for (let j = i + 1; j < points.length; j++) {\n if (processed.has(j)) continue\n\n const otherPoint = points[j]\n const distance = Math.sqrt(\n Math.pow(point.screenX - otherPoint.screenX, 2) +\n Math.pow(point.screenY - otherPoint.screenY, 2)\n )\n\n if (distance <= clusteringDistance) {\n nearbyPoints.push(otherPoint)\n processed.add(j)\n }\n }\n\n if (nearbyPoints.length > 1) {\n // Create cluster\n const centerX = nearbyPoints.reduce((sum, p) => sum + p.screenX, 0) / nearbyPoints.length\n const centerY = nearbyPoints.reduce((sum, p) => sum + p.screenY, 0) / nearbyPoints.length\n const centerCoords = this._projection.invert ? this._projection.invert([centerX, centerY]) : [0, 0]\n\n const clusterRadius = getNumber(nearbyPoints[0].originalData, config.clusterRadius) || 10\n const clusterId = clusters.length\n const cluster = {\n geometry: { type: 'Point', coordinates: centerCoords },\n properties: {\n cluster: true,\n clusterId: clusterId,\n pointCount: nearbyPoints.length,\n clusterPoints: nearbyPoints.map(p => p.originalData),\n } as TopoJSONMapClusterDatum<PointDatum>,\n bbox: { x1: centerX - clusterRadius, y1: centerY - clusterRadius, x2: centerX + clusterRadius, y2: centerY + clusterRadius },\n radius: clusterRadius,\n path: getPointPathData({ x: 0, y: 0 }, clusterRadius, TopoJSONMapPointShape.Circle),\n color: getColor(nearbyPoints[0].originalData, config.clusterColor) || '#2196F3',\n id: `cluster-${clusterId}`,\n donutData: [] as any[],\n isCluster: true,\n _zIndex: 1,\n clusterIndex: {\n getLeaves: (id: number) => {\n if (id === clusterId) {\n return nearbyPoints.map(p => ({ properties: p.originalData }))\n }\n return []\n },\n },\n }\n\n clusters.push(cluster)\n } else {\n // Keep as individual point\n clusters.push(point)\n }\n }\n\n return clusters\n }\n\n private _expandCluster (clusterPoint: TopoJSONMapPoint<PointDatum>): PointDatum[] | undefined {\n const { config } = this\n\n if (!clusterPoint.clusterIndex) return undefined\n\n const clusterId = (clusterPoint.properties as TopoJSONMapClusterDatum<PointDatum>).clusterId as number\n const points = clusterPoint.clusterIndex.getLeaves(clusterId, Infinity)\n\n // Create expanded points at their actual geographic coordinates\n const expandedPoints = points.map((point, i) => {\n const originalData = point.properties as PointDatum\n const coords = getLonLat(originalData, config.longitude, config.latitude)\n const pos = this._projection(coords)\n const radius = getNumber(originalData, config.pointRadius) || 8\n const shape = getString(originalData, config.pointShape) as TopoJSONMapPointShape || TopoJSONMapPointShape.Circle\n const donutData = getDonutData(originalData, config.colorMap)\n // Use individual point color based on its own data\n const pointColor = getColor(originalData, config.pointColor, i)\n\n return {\n geometry: { type: 'Point' as const, coordinates: coords },\n bbox: { x1: pos[0] - radius, y1: pos[1] - radius, x2: pos[0] + radius, y2: pos[1] + radius },\n radius,\n path: getPointPathData({ x: 0, y: 0 }, radius, shape),\n color: pointColor,\n id: getString(originalData, config.pointId, i),\n properties: originalData,\n donutData,\n isCluster: false,\n _zIndex: 1,\n expandedClusterPoint: clusterPoint,\n dx: 0, // No offset needed since using actual coordinates\n dy: 0,\n } as TopoJSONMapPoint<PointDatum> & { expandedClusterPoint: TopoJSONMapPoint<PointDatum>; dx: number; dy: number }\n })\n\n this._resetExpandedCluster()\n this._expandedCluster = {\n cluster: clusterPoint,\n points: expandedPoints,\n }\n\n // Re-render to show expanded points with smooth animation\n this._renderPoints(config.duration / 2)\n\n // Return the original point data for centroid calculation\n return points.map(p => p.properties as PointDatum)\n }\n\n private _zoomToLocation (coordinates: [number, number], zoomLevel: number): void {\n const { config } = this\n\n const clampedZoomLevel = clamp(zoomLevel, config.zoomExtent[0], config.zoomExtent[1])\n\n // Project the target coordinates using the current projection\n const targetPoint = this._projection(coordinates)\n if (!targetPoint) return\n\n // Calculate the center of the viewport\n const centerX = this._width / 2\n const centerY = this._height / 2\n\n // Calculate the scale factor\n const k = this._initialScale * clampedZoomLevel\n\n // Calculate translation to center the target point\n // We need to account for the current projection center\n const currentCenter = this._projection.translate()\n const x = currentCenter[0] + (centerX - targetPoint[0]) * (k / this._initialScale)\n const y = currentCenter[1] + (centerY - targetPoint[1]) * (k / this._initialScale)\n\n const transform = zoomIdentity.translate(x, y).scale(k)\n\n // Update internal state\n this._currentZoomLevel = clampedZoomLevel\n this._center = [x, y]\n\n // Set flag to indicate this is a component-initiated zoom\n this._eventInitiatedByComponent = true\n\n // Apply the transform with smooth eased animation\n this.g\n .transition()\n .duration(config.zoomDuration)\n .ease(easeCubicInOut)\n .call(this._zoomBehavior.transform, transform)\n }\n\n private _resetExpandedCluster (): void {\n this._expandedCluster?.points?.forEach((d: any) => { delete d.expandedClusterPoint })\n this._expandedCluster = null\n }\n\n private _initFlowFeatures (): void {\n const { config, datamodel } = this\n // Use raw links data instead of processed links to avoid point lookup issues for flows\n const rawLinks = datamodel.data?.links || []\n\n // Clear existing flow data\n this._flowParticles = []\n this._sourcePoints = []\n\n if (!rawLinks || rawLinks.length === 0) return\n\n // Create source points and flow particles for each link\n rawLinks.forEach((link, i) => {\n // Try to get coordinates from flow-specific accessors first, then fall back to link endpoints\n let sourceLon: number, sourceLat: number, targetLon: number, targetLat: number\n\n if (config.sourceLongitude && config.sourceLatitude) {\n sourceLon = getNumber(link, config.sourceLongitude)\n sourceLat = getNumber(link, config.sourceLatitude)\n } else {\n // Fall back to using linkSource point coordinates\n const sourcePoint = config.linkSource?.(link)\n if (typeof sourcePoint === 'object' && sourcePoint !== null) {\n sourceLon = getNumber(sourcePoint as PointDatum, config.longitude)\n sourceLat = getNumber(sourcePoint as PointDatum, config.latitude)\n } else {\n return // Skip if can't resolve source coordinates\n }\n }\n\n if (config.targetLongitude && config.targetLatitude) {\n targetLon = getNumber(link, config.targetLongitude)\n targetLat = getNumber(link, config.targetLatitude)\n } else {\n // Fall back to using linkTarget point coordinates\n const targetPoint = config.linkTarget?.(link)\n if (typeof targetPoint === 'object' && targetPoint !== null) {\n targetLon = getNumber(targetPoint as PointDatum, config.longitude)\n targetLat = getNumber(targetPoint as PointDatum, config.latitude)\n } else {\n return // Skip if can't resolve target coordinates\n }\n }\n\n if (!isNumber(sourceLon) || !isNumber(sourceLat) || !isNumber(targetLon) || !isNumber(targetLat)) {\n return\n }\n\n const source = { lat: sourceLat, lon: sourceLon }\n const target = { lat: targetLat, lon: targetLon }\n\n // Create source point\n const sourcePos = this._projection([sourceLon, sourceLat])\n if (sourcePos) {\n const sourcePoint: FlowSourcePoint = {\n lat: sourceLat,\n lon: sourceLon,\n x: sourcePos[0],\n y: sourcePos[1],\n radius: getNumber(link, config.sourcePointRadius),\n color: getColor(link, config.sourcePointColor, i),\n flowData: link,\n }\n this._sourcePoints.push(sourcePoint)\n }\n\n // Create flow particles\n const dist = Math.sqrt((targetLat - sourceLat) ** 2 + (targetLon - sourceLon) ** 2)\n const numParticles = Math.max(1, Math.round(dist * getNumber(link, config.flowParticleDensity)))\n const velocity = getNumber(link, config.flowParticleSpeed)\n const radius = getNumber(link, config.flowParticleRadius)\n const color = getColor(link, config.flowParticleColor, i)\n\n for (let j = 0; j < numParticles; j += 1) {\n const progress = j / numParticles\n const location = {\n lat: sourceLat + (targetLat - sourceLat) * progress,\n lon: sourceLon + (targetLon - sourceLon) * progress,\n }\n\n const pos = this._projection([location.lon, location.lat])\n if (pos) {\n const particle: FlowParticle = {\n x: pos[0],\n y: pos[1],\n source,\n target,\n location,\n velocity,\n radius,\n color,\n flowData: link,\n progress: 0, // Keep for compatibility but not used in angle-based movement\n id: `${(link as any).id || i}-${j}`,\n }\n this._flowParticles.push(particle)\n }\n }\n })\n }\n\n private _renderSourcePoints (duration: number): void {\n const { config } = this\n\n const sourcePoints = this._sourcePointsGroup\n .selectAll<SVGCircleElement, FlowSourcePoint>(`.${s.sourcePoint}`)\n .data(this._sourcePoints, (d, i) => `${d.flowData}-${i}`)\n\n const sourcePointsEnter = sourcePoints.enter()\n .append('circle')\n .attr('class', s.sourcePoint)\n .attr('r', 0)\n .style('opacity', 0)\n .on('click', (event: MouseEvent, d) => {\n event.stopPropagation()\n config.onSourcePointClick?.(d.flowData, d.x, d.y, event)\n })\n .on('mouseenter', (event: MouseEvent, d) => {\n config.onSourcePointMouseEnter?.(d.flowData, d.x, d.y, event)\n })\n .on('mouseleave', (event: MouseEvent, d) => {\n config.onSourcePointMouseLeave?.(d.flowData, event)\n })\n\n smartTransition(sourcePointsEnter.merge(sourcePoints), duration)\n .attr('cx', d => d.x)\n .attr('cy', d => d.y)\n .attr('r', d => d.radius / (this._currentZoomLevel || 1))\n .style('fill', d => d.color)\n .style('stroke', d => d.color)\n .style('opacity', 1)\n\n sourcePoints.exit().remove()\n }\n\n private _renderFlowParticles (duration: number): void {\n const flowParticles = this._flowParticlesGroup\n .selectAll<SVGCircleElement, FlowParticle>(`.${s.flowParticle}`)\n .data(this._flowParticles, d => d.id)\n\n const flowParticlesEnter = flowParticles.enter()\n .append('circle')\n .attr('class', s.flowParticle)\n .attr('r', 0)\n .style('opacity', 0)\n\n smartTransition(flowParticlesEnter.merge(flowParticles), duration)\n .attr('cx', d => d.x)\n .attr('cy', d => d.y)\n .attr('r', d => d.radius / (this._currentZoomLevel || 1))\n .style('fill', d => d.color)\n .style('opacity', 0.8)\n\n flowParticles.exit().remove()\n }\n\n private _startFlowAnimation (): void {\n if (this._animationId) return // Animation already running\n\n this._animateFlow()\n }\n\n private _animateFlow (): void {\n if (!this.config.enableFlowAnimation) return\n\n this._animationId = requestAnimationFrame(() => {\n this._updateFlowParticles()\n this._animateFlow() // Recursive call like LeafletFlowMap\n })\n }\n\n private _stopFlowAnimation (): void {\n if (this._animationId) {\n cancelAnimationFrame(this._animationId)\n this._animationId = null\n }\n }\n\n private _updateFlowParticles (): void {\n if (this._flowParticles.length === 0) return\n\n const zoomLevel = this._currentZoomLevel || 1\n\n this._flowParticles.forEach(particle => {\n const { source, target } = particle\n\n // Calculate movement using angle-based velocity (like LeafletFlowMap)\n const fullDist = Math.sqrt((target.lat - source.lat) ** 2 + (target.lon - source.lon) ** 2)\n const remainedDist = Math.sqrt((target.lat - particle.location.lat) ** 2 + (target.lon - particle.location.lon) ** 2)\n const angle = Math.atan2(target.lat - source.lat, target.lon - source.lon)\n\n // Update geographic location\n particle.location.lat += particle.velocity * Math.sin(angle)\n particle.location.lon += particle.velocity * Math.cos(angle)\n\n // Reset to start when reaching target (like LeafletFlowMap)\n if (\n (((target.lat > source.lat) && (particle.location.lat > target.lat)) || ((target.lon > source.lon) && (particle.location.lon > target.lon))) ||\n (((target.lat < source.lat) && (particle.location.lat < target.lat)) || ((target.lon < source.lon) && (particle.location.lon < target.lon)))\n ) {\n particle.location.lat = source.lat\n particle.location.lon = source.lon\n }\n\n // Project to screen coordinates\n const pos = this._projection([particle.location.lon, particle.location.lat])\n if (pos) {\n // Add orthogonal arc shift (adapted from LeafletFlowMap)\n const orthogonalArcShift = -(zoomLevel ** 2 * fullDist / 8) * Math.cos(Math.PI / 2 * (fullDist / 2 - remainedDist) / (fullDist / 2)) || 0\n particle.x = pos[0]\n particle.y = pos[1] + orthogonalArcShift\n }\n })\n\n // Update DOM elements directly without data rebinding (for performance)\n this._flowParticlesGroup\n .selectAll<SVGCircleElement, any>(`.${s.flowParticle}`)\n .attr('cx', (d, i) => this._flowParticles[i]?.x || 0)\n .attr('cy', (d, i) => this._flowParticles[i]?.y || 0)\n .attr('r', (d, i) => (this._flowParticles[i]?.radius || 1) / zoomLevel)\n }\n\n destroy (): void {\n window.cancelAnimationFrame(this._animFrameId)\n this._stopFlowAnimation()\n window.cancelAnimationFrame(this._collideLabelsAnimFrameId)\n }\n}\n"],"names":["s.background","s.features","s.areaLabel","s.links","s.points","s.flowParticles","s.sourcePoints","s.feature","s.link","s.point","s.pointCircle","s.pointLabel","s.sourcePoint","s.flowParticle","s"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@unovis/ts",
|
|
3
3
|
"description": "Modular data visualization framework for React, Angular, Svelte, Vue, Solid, and vanilla TypeScript or JavaScript",
|
|
4
|
-
"version": "1.7.0-stellar.
|
|
4
|
+
"version": "1.7.0-stellar.3",
|
|
5
5
|
"packageManager": "npm@10.9.1",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|