UI: Fix Map icon marker pos calculation.

This commit is contained in:
Igor Kulikov 2025-03-14 15:51:02 +02:00
parent 3b4ee01aac
commit 4791be633e

View File

@ -115,9 +115,9 @@ const defaultTripIconContainerDefinition: MarkerIconContainerDefinition = {
iconColor: () => tinycolor('#000'), iconColor: () => tinycolor('#000'),
iconAlpha: () => 1, iconAlpha: () => 1,
appendIcon: (svgElement, iconElement, iconSize) => { appendIcon: (svgElement, iconElement, iconSize) => {
const box = iconElement.bbox(); const iconCenter = calculateIconCenter(iconElement, iconSize);
const cx = iconSize/2 + box.x; const cx = iconCenter.cx;
const cy = iconSize/2 + box.y; const cy = iconCenter.cy;
let elements = svgElement.getElementsByClassName('icon-mask-exclude'); let elements = svgElement.getElementsByClassName('icon-mask-exclude');
if (elements.length) { if (elements.length) {
elements = elements[0].getElementsByClassName('marker-icon-container'); elements = elements[0].getElementsByClassName('marker-icon-container');
@ -310,8 +310,8 @@ export const createColorMarkerIconElement = (iconRegistry: MatIconRegistry, domS
if (elements.length) { if (elements.length) {
const iconContainer = new G(elements[0] as SVGGElement); const iconContainer = new G(elements[0] as SVGGElement);
iconContainer.add(iconElement); iconContainer.add(iconElement);
const box = iconElement.bbox(); const iconCenter = calculateIconCenter(iconElement, iconSize);
iconElement.translate(-(iconSize/2 + box.x), -(iconSize/2 + box.y)); iconElement.translate(-iconCenter.cx, -iconCenter.cy);
} }
} }
} }
@ -322,8 +322,8 @@ export const createColorMarkerIconElement = (iconRegistry: MatIconRegistry, domS
const iconContainer = new G(); const iconContainer = new G();
iconContainer.translate(iconSize/2,iconSize/2); iconContainer.translate(iconSize/2,iconSize/2);
iconContainer.add(iconElement); iconContainer.add(iconElement);
const box = iconElement.bbox(); const iconCenter = calculateIconCenter(iconElement, iconSize);
iconElement.translate(-(iconSize/2 + box.x), -(iconSize/2 + box.y)); iconElement.translate(-iconCenter.cx, -iconCenter.cy);
svg.add(iconContainer); svg.add(iconContainer);
return svg.node; return svg.node;
} }
@ -344,3 +344,18 @@ export const createPlaceItemIcon = (iconRegistry: MatIconRegistry, domSanitizer:
); );
return placeItemIconURI$; return placeItemIconURI$;
} }
const calculateIconCenter = (iconElement: Element, iconSize: number): {cx: number, cy: number} => {
const box = iconElement.bbox();
if (iconElement.type === 'text') {
return {
cx: iconSize/2 + box.x,
cy: iconSize/2 + box.y
};
} else {
return {
cx: box.cx,
cy: box.cy
};
}
}