forked from aarav214/Terrafik
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathroute-diff.patch
More file actions
122 lines (122 loc) · 2.78 KB
/
Copy pathroute-diff.patch
File metadata and controls
122 lines (122 loc) · 2.78 KB
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
diff --git a/src/lib/osrm-route.ts b/src/lib/osrm-route.ts
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/lib/osrm-route.ts
@@
+import type MapLibreGL from "maplibre-gl";
+
+export type OsrmRoute = {
+ geometry: GeoJSON.LineString;
+ distance: number;
+ duration: number;
+};
+
+export async function getRoute(
+ start: [number, number],
+ end: [number, number],
+): Promise<OsrmRoute> {
+ const url = `https://router.project-osrm.org/route/v1/driving/${start[0]},${start[1]};${end[0]},${end[1]}?overview=full&geometries=geojson`;
+
+ const res = await fetch(url);
+ if (!res.ok) {
+ throw new Error(`OSRM request failed: ${res.status} ${res.statusText}`);
+ }
+
+ const data = await res.json();
+ const route = data?.routes?.[0];
+
+ if (!route) {
+ throw new Error("No route returned from OSRM");
+ }
+
+ return route;
+}
+
+export async function drawRoute(
+ map: MapLibreGL.Map,
+ start: [number, number],
+ end: [number, number],
+) {
+ const route = await getRoute(start, end);
+
+ const geojson: GeoJSON.Feature<GeoJSON.LineString> = {
+ type: "Feature",
+ geometry: route.geometry,
+ properties: {},
+ };
+
+ if (map.getSource("route")) {
+ if (map.getLayer("route")) {
+ map.removeLayer("route");
+ }
+ map.removeSource("route");
+ }
+
+ map.addSource("route", {
+ type: "geojson",
+ data: geojson,
+ });
+
+ map.addLayer({
+ id: "route",
+ type: "line",
+ source: "route",
+ layout: {
+ "line-join": "round",
+ "line-cap": "round",
+ },
+ paint: {
+ "line-color": "#00ffcc",
+ "line-width": 4,
+ "line-opacity": 0.9,
+ },
+ });
+
+ return route;
+}
+
diff --git a/src/app/(main)/mymap/page.tsx b/src/app/(main)/mymap/page.tsx
index e69de29..0000000 100644
--- a/src/app/(main)/mymap/page.tsx
+++ b/src/app/(main)/mymap/page.tsx
@@
-import { Map, MapControls } from "@/registry/map";
-
-export default function MyMap() {
- return (
- <div className="h-screen w-full">
- <Map center={[-74.006, 40.7128]} zoom={11}>
- <MapControls />
- </Map>
- </div>
- );
-}
+"use client";
+
+import { useEffect, useRef } from "react";
+import { Map, MapControls, type MapRef } from "@/registry/map";
+import { drawRoute } from "@/lib/osrm-route";
+
+const START: [number, number] = [-74.006, 40.7128];
+const END: [number, number] = [-73.935242, 40.73061];
+
+export default function MyMap() {
+ const mapRef = useRef<MapRef | null>(null);
+
+ useEffect(() => {
+ if (!mapRef.current) return;
+
+ drawRoute(mapRef.current, START, END).catch((error) => {
+ console.error("Route drawing failed:", error);
+ });
+ }, []);
+
+ return (
+ <div className="h-screen w-full">
+ <Map ref={mapRef} center={START} zoom={11}>
+ <MapControls />
+ </Map>
+ </div>
+ );
+}