Optimized routing
Test and publish container images / test (push) Successful in 2m21s
Test and publish container images / publish (push) Failing after 4s

This commit is contained in:
BuTzZ
2026-07-27 10:18:31 +02:00
parent 55ce94066e
commit 9813a1fafb
16 changed files with 1602 additions and 364 deletions
+37 -4
View File
@@ -1,4 +1,10 @@
import type { Coordinate, RouteResult, RouteWarning, VesselProfile } from "@watermaps/shared";
import type {
Coordinate,
RouteResult,
RouteSnaps,
RouteWarning,
VesselProfile
} from "@watermaps/shared";
export const OFFLINE_VOYAGES_STORAGE_KEY = "watermaps.offline-voyages.v1";
export const LEGACY_OFFLINE_VOYAGES_STORAGE_KEY = "seacompass.offline-voyages.v1";
@@ -145,8 +151,9 @@ export function createOfflineVoyageRecord(
throw new OfflineVoyageStorageError("Ungültige Kennung für die Offline-Route.");
}
const defaultStart = { lat: first[1], lon: first[0] };
const defaultDestination = { lat: last[1], lon: last[0] };
const defaultStart = route.routeSnaps?.start.requested ?? { lat: first[1], lon: first[0] };
const defaultDestination =
route.routeSnaps?.destination.requested ?? { lat: last[1], lon: last[0] };
const planInput = input.plan ?? {};
return {
@@ -215,6 +222,8 @@ function normalizeRoute(value: unknown): RouteResult {
typeof value.departureTime === "string" ? normalizeIsoDate(value.departureTime) : undefined;
const durationMinutes =
value.durationMinutes === undefined ? undefined : finiteNumber(value.durationMinutes, 0, 10_000_000);
const routeSnaps =
value.routeSnaps === undefined ? undefined : normalizeRouteSnaps(value.routeSnaps);
return {
...(id ? { id } : {}),
@@ -228,7 +237,31 @@ function normalizeRoute(value: unknown): RouteResult {
dataSources,
...(departureTime ? { departureTime } : {}),
...(durationMinutes !== undefined ? { durationMinutes } : {}),
...(routingMode ? { routingMode } : {})
...(routingMode ? { routingMode } : {}),
...(routeSnaps ? { routeSnaps } : {})
};
}
function normalizeRouteSnaps(value: unknown): RouteSnaps {
if (!isRecord(value) || !Array.isArray(value.waypoints) || value.waypoints.length > 25) {
throw new OfflineVoyageStorageError("Die Snap-Metadaten der Offline-Route sind ungültig.");
}
return {
start: normalizeRouteSnap(value.start),
waypoints: value.waypoints.map(normalizeRouteSnap),
destination: normalizeRouteSnap(value.destination)
};
}
function normalizeRouteSnap(value: unknown): RouteSnaps["start"] {
if (!isRecord(value)) {
throw new OfflineVoyageStorageError("Ein Snap-Punkt der Offline-Route ist ungültig.");
}
return {
requested: normalizeCoordinate(value.requested),
snapped: normalizeCoordinate(value.snapped),
distanceM: finiteNumber(value.distanceM, 0, 100_000)
};
}
+15 -1
View File
@@ -38,6 +38,7 @@ describe("offline voyage storage", () => {
expect(saved.plan.destination).toEqual({ lat: 51.6814536, lon: 7.8042615 });
expect(saved.route.departureTime).toBe("2026-07-20T06:00:00.000Z");
expect(saved.route.durationMinutes).toBe(120);
expect(saved.route.routeSnaps).toEqual(routeFixture.routeSnaps);
expect(saved.route.alternatives).toBeUndefined();
expect(listOfflineVoyages(localStorage)).toHaveLength(1);
const restored = loadOfflineVoyage("voyage-test", localStorage);
@@ -83,7 +84,7 @@ const routeFixture: RouteResult = {
name: "Emden Hamm",
geometry: {
type: "LineString",
coordinates: [[7.186111, 53.344167], [7.1, 52.4], [7.8042615, 51.6814536]]
coordinates: [[7.186, 53.344], [7.1, 52.4], [7.8042, 51.6817]]
},
distanceNm: 153.69,
departureTime: "2026-07-20T06:00:00.000Z",
@@ -94,6 +95,19 @@ const routeFixture: RouteResult = {
unknownDepthRatio: 1,
dataSources: ["OSM"],
routingMode: "fairway",
routeSnaps: {
start: {
requested: { lat: 53.344167, lon: 7.186111 },
snapped: { lat: 53.344, lon: 7.186 },
distanceM: 20
},
waypoints: [],
destination: {
requested: { lat: 51.6814536, lon: 7.8042615 },
snapped: { lat: 51.6817, lon: 7.8042 },
distanceM: 28
}
},
alternatives: [{
id: "unused",
name: "Alternative",