52 lines
1.2 KiB
TypeScript
52 lines
1.2 KiB
TypeScript
import { OSMWay } from "@repo/db";
|
|
import { centroid, distance } from "@turf/turf";
|
|
|
|
function toPolygonFeature(nodes: { lat: number; lon: number }[]) {
|
|
if (!nodes || nodes.length < 3) return null;
|
|
|
|
const coords = nodes.map((n) => [n.lon, n.lat]);
|
|
const isClosed =
|
|
coords.length >= 1 &&
|
|
coords[0]![0] === coords[coords.length - 1]![0] &&
|
|
coords[0]![1] === coords[coords.length - 1]![1];
|
|
if (!isClosed) coords.push(coords[0]!); // Polygon schließen
|
|
|
|
return {
|
|
type: "Feature",
|
|
geometry: {
|
|
type: "Polygon",
|
|
coordinates: [coords],
|
|
},
|
|
properties: {},
|
|
};
|
|
}
|
|
|
|
// Hauptfunktion: findet das nächstgelegene Polygon zu einem Punkt
|
|
export function findClosestPolygon(
|
|
ways: OSMWay[],
|
|
referencePoint: {
|
|
lat: number;
|
|
lon: number;
|
|
},
|
|
): OSMWay | null {
|
|
let closest: OSMWay | null = null;
|
|
let minDistance = Infinity;
|
|
|
|
for (const way of ways) {
|
|
const polygon = toPolygonFeature(way.nodes);
|
|
if (!polygon) continue;
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
const center = centroid(polygon as any).geometry.coordinates; // [lon, lat]
|
|
|
|
const newDistance = distance([referencePoint.lon, referencePoint.lat], center);
|
|
|
|
if (newDistance < minDistance) {
|
|
minDistance = newDistance;
|
|
closest = way;
|
|
}
|
|
}
|
|
|
|
return closest;
|
|
}
|