Files
nodeMap/utils/mapUtils.js
ISA fe3ecaa900 feat(map): OMS (OverlappingMarkerSpiderfier) vollständig integriert
- Marker werden nun korrekt bei OMS registriert
- Klick auf Plus-Icon spiderfied überlappende Marker
- useDynamicDeviceLayers um oms erweitert
- checkOverlappingMarkers optimiert für dynamische Marker-Gruppen
- Fehlerbehandlung für ungültige Marker-Typen ergänzt
2025-05-28 14:23:11 +02:00

80 lines
2.4 KiB
JavaScript

// /utils/mapUtils.js
import L from "leaflet";
// Call this function on page load to restore zoom and center
export const restoreMapSettings = (map) => {
const savedZoom = localStorage.getItem("mapZoom");
const savedCenter = localStorage.getItem("mapCenter");
if (savedZoom && savedCenter) {
try {
const centerCoords = JSON.parse(savedCenter);
map.setView(centerCoords, parseInt(savedZoom));
} catch (e) {
console.error("Error parsing stored map center:", e);
map.setView([53.111111, 8.4625], 12); // Standardkoordinaten und -zoom
}
}
};
// Now update checkOverlappingMarkers to check if oms is initialized
// Globales Array, um Plus-Icons zu speichern
let plusMarkers = [];
export const checkOverlappingMarkers = (map, markers, plusIcon, oms) => {
if (!Array.isArray(markers)) {
console.warn("⚠️ checkOverlappingMarkers erwartet ein Array, aber erhielt:", markers);
return;
}
const overlappingGroups = {};
markers.forEach((marker) => {
if (map.hasLayer(marker)) {
const latlngStr = marker.getLatLng().toString();
if (overlappingGroups[latlngStr]) {
overlappingGroups[latlngStr].push(marker);
} else {
overlappingGroups[latlngStr] = [marker];
}
}
});
plusMarkers.forEach((plusMarker) => map.removeLayer(plusMarker));
plusMarkers = [];
for (const coords in overlappingGroups) {
if (overlappingGroups[coords].length > 1) {
const latLng = L.latLng(coords.match(/[-.\d]+/g).map(Number));
const plusMarker = L.marker(latLng, { icon: plusIcon }).addTo(map);
plusMarkers.push(plusMarker);
plusMarker.on("click", () => {
const nearbyMarkers = overlappingGroups[coords];
if (oms && nearbyMarkers.length > 0) {
oms.spiderfy(nearbyMarkers); // ✅ Zeige Marker als Spider
}
});
}
}
};
export const handlePlusIconClick = (map, markers, oms, clickedLatLng) => {
// Debugging-Ausgabe
console.log("Plus-Icon Position:", clickedLatLng);
// Finde Marker in der Nähe der Klickposition
const nearbyMarkers = markers.filter((marker) => map.distance(marker.getLatLng(), clickedLatLng) < 50);
// Debugging-Ausgabe
console.log("Gefundene Marker in der Nähe:", nearbyMarkers);
if (oms && nearbyMarkers.length > 0) {
// Spiderfy die gefundenen Marker
oms.spiderfy(nearbyMarkers);
} else {
console.log("Keine überlappenden Marker gefunden.");
}
};