Files
nodeMap/utils/geometryUtils.js

54 lines
1.8 KiB
JavaScript

// utils/geometryUtils.js
export const findClosestPoints = (coordinates, newPoint, map) => {
if (!map) {
console.error("Map is not defined. Cannot find closest points.");
return [];
}
let minDist = Infinity;
let closestPair = [];
for (let i = 1; i < coordinates.length; i++) {
const dist = L.LineUtil.pointToSegmentDistance(map.latLngToLayerPoint(newPoint), map.latLngToLayerPoint(coordinates[i - 1]), map.latLngToLayerPoint(coordinates[i]));
if (dist < minDist) {
minDist = dist;
closestPair = [coordinates[i - 1], coordinates[i], i];
}
}
return closestPair;
};
// Hilfsfunktion zur Berechnung der Entfernung zwischen zwei Punkten (LatLng)
export function getDistance(latlng1, latlng2) {
const R = 6371e3; // Erdradius in Metern
const lat1 = latlng1.lat * (Math.PI / 180);
const lat2 = latlng2.lat * (Math.PI / 180);
const deltaLat = (latlng2.lat - latlng1.lat) * (Math.PI / 180);
const deltaLng = (latlng2.lng - latlng1.lng) * (Math.PI / 180);
const a = Math.sin(deltaLat / 2) * Math.sin(deltaLat / 2) + Math.cos(lat1) * Math.cos(lat2) * Math.sin(deltaLng / 2) * Math.sin(deltaLng / 2);
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
return R * c; // Entfernung in Metern
}
// Funktion zum Finden der nächsten Linie basierend auf der Mausposition
export function findNearestPolyline(map, mouseLatLng) {
let nearestPolyline = null;
let minDistance = Infinity;
map.eachLayer(function (layer) {
if (layer instanceof L.Polyline) {
const latlngs = layer.getLatLngs();
latlngs.forEach((latlng) => {
const distance = getDistance(mouseLatLng, latlng);
if (distance < minDistance) {
minDistance = distance;
nearestPolyline = layer;
}
});
}
});
return nearestPolyline;
}