2024-10-20 14:23:58 -04:00
|
|
|
import { createPopupContent } from "./popups";
|
|
|
|
|
|
|
|
|
|
export function createMarkersArray(markersData, userSettings) {
|
2025-01-14 17:23:46 -05:00
|
|
|
// Create a canvas renderer
|
|
|
|
|
const renderer = L.canvas({ padding: 0.5 });
|
|
|
|
|
|
2024-10-20 14:23:58 -04:00
|
|
|
if (userSettings.pointsRenderingMode === "simplified") {
|
2025-01-14 17:23:46 -05:00
|
|
|
return createSimplifiedMarkers(markersData, renderer);
|
2024-10-20 14:23:58 -04:00
|
|
|
} else {
|
|
|
|
|
return markersData.map((marker) => {
|
|
|
|
|
const [lat, lon] = marker;
|
|
|
|
|
const popupContent = createPopupContent(marker, userSettings.timezone, userSettings.distanceUnit);
|
2024-12-11 10:18:40 -05:00
|
|
|
let markerColor = marker[5] < 0 ? "orange" : "blue";
|
2025-01-14 17:23:46 -05:00
|
|
|
|
2024-12-25 07:05:42 -05:00
|
|
|
return L.circleMarker([lat, lon], {
|
2025-01-14 17:23:46 -05:00
|
|
|
renderer: renderer, // Use canvas renderer
|
2024-12-25 07:05:42 -05:00
|
|
|
radius: 4,
|
|
|
|
|
color: markerColor,
|
2025-01-07 08:31:06 -05:00
|
|
|
zIndexOffset: 1000,
|
|
|
|
|
pane: 'markerPane'
|
2024-12-25 07:05:42 -05:00
|
|
|
}).bindPopup(popupContent, { autoClose: false });
|
2024-10-20 14:23:58 -04:00
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-01-14 17:23:46 -05:00
|
|
|
export function createSimplifiedMarkers(markersData, renderer) {
|
2024-10-20 14:23:58 -04:00
|
|
|
const distanceThreshold = 50; // meters
|
|
|
|
|
const timeThreshold = 20000; // milliseconds (3 seconds)
|
|
|
|
|
|
|
|
|
|
const simplifiedMarkers = [];
|
|
|
|
|
let previousMarker = markersData[0]; // Start with the first marker
|
|
|
|
|
simplifiedMarkers.push(previousMarker); // Always keep the first marker
|
|
|
|
|
|
|
|
|
|
markersData.forEach((currentMarker, index) => {
|
|
|
|
|
if (index === 0) return; // Skip the first marker
|
|
|
|
|
|
|
|
|
|
const [prevLat, prevLon, prevTimestamp] = previousMarker;
|
|
|
|
|
const [currLat, currLon, currTimestamp] = currentMarker;
|
|
|
|
|
|
|
|
|
|
const timeDiff = currTimestamp - prevTimestamp;
|
|
|
|
|
const distance = haversineDistance(prevLat, prevLon, currLat, currLon, 'km') * 1000; // Convert km to meters
|
|
|
|
|
|
|
|
|
|
// Keep the marker if it's far enough in distance or time
|
|
|
|
|
if (distance >= distanceThreshold || timeDiff >= timeThreshold) {
|
|
|
|
|
simplifiedMarkers.push(currentMarker);
|
|
|
|
|
previousMarker = currentMarker;
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Now create markers for the simplified data
|
|
|
|
|
return simplifiedMarkers.map((marker) => {
|
|
|
|
|
const [lat, lon] = marker;
|
2024-12-11 10:18:40 -05:00
|
|
|
const popupContent = createPopupContent(marker);
|
|
|
|
|
let markerColor = marker[5] < 0 ? "orange" : "blue";
|
2025-01-14 17:23:46 -05:00
|
|
|
|
2025-01-07 08:31:06 -05:00
|
|
|
return L.circleMarker(
|
|
|
|
|
[lat, lon],
|
2025-01-14 17:23:46 -05:00
|
|
|
{
|
|
|
|
|
renderer: renderer, // Use canvas renderer
|
|
|
|
|
radius: 4,
|
|
|
|
|
color: markerColor,
|
|
|
|
|
zIndexOffset: 1000
|
|
|
|
|
}
|
2025-01-07 08:31:06 -05:00
|
|
|
).bindPopup(popupContent);
|
2024-10-20 14:23:58 -04:00
|
|
|
});
|
|
|
|
|
}
|