blob: be61d4b57c357187dd4e5a5d36ed4695a5216113 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
export interface PlannerSearchResult {
name?: string;
label?: string;
lat: number;
lon: number;
layer?: string;
}
export interface RoutePlan {
itineraries: Itinerary[];
timeOffsetSeconds?: number;
}
export interface Itinerary {
durationSeconds: number;
startTime: string;
endTime: string;
walkDistanceMeters: number;
walkTimeSeconds: number;
transitTimeSeconds: number;
waitingTimeSeconds: number;
legs: Leg[];
cashFareEuro?: number;
cardFareEuro?: number;
}
export interface Leg {
mode?: string;
routeName?: string;
routeShortName?: string;
routeLongName?: string;
routeColor?: string;
headsign?: string;
agencyName?: string;
from?: PlannerPlace;
to?: PlannerPlace;
startTime: string;
endTime: string;
distanceMeters: number;
geometry?: PlannerGeometry;
steps: Step[];
intermediateStops?: PlannerPlace[];
}
export interface PlannerPlace {
name?: string;
lat: number;
lon: number;
stopId?: string;
stopCode?: string;
}
export interface PlannerGeometry {
type: string;
coordinates: number[][];
}
export interface Step {
distanceMeters: number;
relativeDirection?: string;
absoluteDirection?: string;
streetName?: string;
lat: number;
lon: number;
}
export async function searchPlaces(
query: string
): Promise<PlannerSearchResult[]> {
const response = await fetch(
`/api/planner/autocomplete?query=${encodeURIComponent(query)}`
);
if (!response.ok) return [];
return response.json();
}
export async function reverseGeocode(
lat: number,
lon: number
): Promise<PlannerSearchResult | null> {
const response = await fetch(`/api/planner/reverse?lat=${lat}&lon=${lon}`);
if (!response.ok) return null;
return response.json();
}
export async function planRoute(
fromLat: number,
fromLon: number,
toLat: number,
toLon: number,
time?: Date,
arriveBy: boolean = false
): Promise<RoutePlan> {
let url = `/api/planner/plan?fromLat=${fromLat}&fromLon=${fromLon}&toLat=${toLat}&toLon=${toLon}&arriveBy=${arriveBy}`;
if (time) {
url += `&time=${time.toISOString()}`;
}
const response = await fetch(url);
if (!response.ok) throw new Error("Failed to plan route");
return response.json();
}
|