Optimized routing
This commit is contained in:
@@ -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)
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user