Offset Shek Kong map marker to avoid overlap
This commit is contained in:
@@ -30,6 +30,22 @@ interface UseLeafletMapArgs {
|
|||||||
const AUTO_NEARBY_MIN_ZOOM = 8;
|
const AUTO_NEARBY_MIN_ZOOM = 8;
|
||||||
const AUTO_NEARBY_MAX_DISTANCE_M = 120000;
|
const AUTO_NEARBY_MAX_DISTANCE_M = 120000;
|
||||||
const MAP_MAX_ZOOM = 19;
|
const MAP_MAX_ZOOM = 19;
|
||||||
|
const CITY_MARKER_DISPLAY_OFFSETS: Record<
|
||||||
|
string,
|
||||||
|
{ x: number; y: number; zIndexOffset?: number }
|
||||||
|
> = {
|
||||||
|
// Shek Kong sits between the Hong Kong and Shenzhen cards and gets visually buried
|
||||||
|
// by their wide marker bubbles. Shift only the rendered marker, not the true point.
|
||||||
|
"shek kong": { x: 34, y: -26, zIndexOffset: 320 },
|
||||||
|
};
|
||||||
|
|
||||||
|
function getMarkerDisplayOffset(cityName: string) {
|
||||||
|
return CITY_MARKER_DISPLAY_OFFSETS[String(cityName || "").toLowerCase()] || {
|
||||||
|
x: 0,
|
||||||
|
y: 0,
|
||||||
|
zIndexOffset: 0,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
function createMarkerIcon(
|
function createMarkerIcon(
|
||||||
city: CityListItem,
|
city: CityListItem,
|
||||||
@@ -41,11 +57,16 @@ function createMarkerIcon(
|
|||||||
const shortName = label.length > 10 ? `${label.substring(0, 8)}...` : label;
|
const shortName = label.length > 10 ? `${label.substring(0, 8)}...` : label;
|
||||||
const tempText =
|
const tempText =
|
||||||
snapshot?.current?.temp != null ? `${snapshot.current.temp}${unit}` : "--";
|
snapshot?.current?.temp != null ? `${snapshot.current.temp}${unit}` : "--";
|
||||||
|
const offset = getMarkerDisplayOffset(city.name);
|
||||||
|
const styleAttr =
|
||||||
|
offset.x || offset.y
|
||||||
|
? ` style="transform: translate(${offset.x}px, ${offset.y}px);"`
|
||||||
|
: "";
|
||||||
|
|
||||||
return L.divIcon({
|
return L.divIcon({
|
||||||
className: "",
|
className: "",
|
||||||
html: `
|
html: `
|
||||||
<div class="city-marker" data-city="${city.name}">
|
<div class="city-marker" data-city="${city.name}"${styleAttr}>
|
||||||
<div class="marker-bubble ${riskClass}">${tempText}</div>
|
<div class="marker-bubble ${riskClass}">${tempText}</div>
|
||||||
<div class="marker-name">${shortName}</div>
|
<div class="marker-name">${shortName}</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -252,6 +273,7 @@ export function useLeafletMap({
|
|||||||
// Create new marker
|
// Create new marker
|
||||||
const marker = L.marker([city.lat, city.lon], {
|
const marker = L.marker([city.lat, city.lon], {
|
||||||
icon: createMarkerIcon(city, snapshot),
|
icon: createMarkerIcon(city, snapshot),
|
||||||
|
zIndexOffset: getMarkerDisplayOffset(city.name).zIndexOffset || 0,
|
||||||
}).addTo(map);
|
}).addTo(map);
|
||||||
|
|
||||||
marker.on("click", () => {
|
marker.on("click", () => {
|
||||||
|
|||||||
Reference in New Issue
Block a user