GPS Exchange Format library/CLI in OCaml
1(** Simple GPX example demonstrating basic functionality **)
2
3open Gpx
4
5let () =
6 Printf.printf "=== Simple GPX Example ===\n\n";
7
8 try
9 (* Create some GPS coordinates *)
10 let lat1 = Coordinate.latitude 37.7749 |> Result.get_ok in
11 let lon1 = Coordinate.longitude (-122.4194) |> Result.get_ok in
12 let lat2 = Coordinate.latitude 37.7849 |> Result.get_ok in
13 let lon2 = Coordinate.longitude (-122.4094) |> Result.get_ok in
14
15 (* Create waypoints *)
16 let waypoint1 = Waypoint.make lat1 lon1 in
17 let waypoint1 = Waypoint.with_name waypoint1 "San Francisco" in
18 let waypoint2 = Waypoint.make lat2 lon2 in
19 let waypoint2 = Waypoint.with_name waypoint2 "Near SF" in
20
21 (* Create a simple track from coordinates *)
22 let track = Track.make ~name:"SF Walk" in
23 let track_segment = Track.Segment.empty in
24 let coords = [
25 (37.7749, -122.4194);
26 (37.7759, -122.4184);
27 (37.7769, -122.4174);
28 (37.7779, -122.4164);
29 ] in
30 let track_segment = List.fold_left (fun seg (lat_f, lon_f) ->
31 match Coordinate.latitude lat_f, Coordinate.longitude lon_f with
32 | Ok lat, Ok lon ->
33 let pt = Waypoint.make lat lon in
34 Track.Segment.add_point seg pt
35 | _ -> seg
36 ) track_segment coords in
37 let track = Track.add_segment track track_segment in
38
39 (* Create a route *)
40 let route = Route.make ~name:"SF Route" in
41 let route_coords = [
42 (37.7749, -122.4194);
43 (37.7849, -122.4094);
44 ] in
45 let route = List.fold_left (fun r (lat_f, lon_f) ->
46 match Coordinate.latitude lat_f, Coordinate.longitude lon_f with
47 | Ok lat, Ok lon ->
48 let pt = Waypoint.make lat lon in
49 Route.add_point r pt
50 | _ -> r
51 ) route route_coords in
52
53 (* Create GPX document with all elements *)
54 let gpx = Gpx_doc.empty ~creator:"simple-example" in
55 let gpx = Gpx_doc.add_waypoint gpx waypoint1 in
56 let gpx = Gpx_doc.add_waypoint gpx waypoint2 in
57 let gpx = Gpx_doc.add_track gpx track in
58 let gpx = Gpx_doc.add_route gpx route in
59
60 Printf.printf "Created GPX document with:\n";
61 Printf.printf " Waypoints: %d\n" (List.length (Gpx_doc.get_waypoints gpx));
62 Printf.printf " Tracks: %d\n" (List.length (Gpx_doc.get_tracks gpx));
63 Printf.printf " Routes: %d\n" (List.length (Gpx_doc.get_routes gpx));
64 Printf.printf "\n";
65
66 (* Write to file with validation *)
67 let out_chan = open_out "example_output.gpx" in
68 let dest = (`Channel out_chan) in
69 (match write ~validate:true dest gpx with
70 | Ok () ->
71 close_out out_chan;
72 Printf.printf "Wrote GPX to example_output.gpx\n"
73 | Error e ->
74 close_out out_chan;
75 Printf.eprintf "Error writing GPX: %s\n" (Error.to_string e)
76 );
77
78 (* Read it back and verify *)
79 let in_chan = open_in "example_output.gpx" in
80 let input = Xmlm.make_input (`Channel in_chan) in
81 (match parse ~validate:true input with
82 | Ok gpx2 ->
83 close_in in_chan;
84 let waypoints = Gpx_doc.get_waypoints gpx2 in
85 let tracks = Gpx_doc.get_tracks gpx2 in
86 let routes = Gpx_doc.get_routes gpx2 in
87 Printf.printf "Read back GPX document with %d waypoints, %d tracks, %d routes\n"
88 (List.length waypoints) (List.length tracks) (List.length routes);
89
90 (* Extract coordinates from track *)
91 (match tracks with
92 | track :: _ ->
93 let segments = Track.get_segments track in
94 (match segments with
95 | seg :: _ ->
96 let points = Track.Segment.get_points seg in
97 Printf.printf "Track coordinates: %d points\n" (List.length points);
98 List.iteri (fun i pt ->
99 let lat = Coordinate.latitude_to_float (Waypoint.get_lat pt) in
100 let lon = Coordinate.longitude_to_float (Waypoint.get_lon pt) in
101 Printf.printf " Point %d: %.4f, %.4f\n" i lat lon
102 ) points
103 | [] -> Printf.printf "No track segments found\n")
104 | [] -> Printf.printf "No tracks found\n")
105 | Error e ->
106 close_in in_chan;
107 Printf.eprintf "Error reading back GPX: %s\n" (Error.to_string e));
108
109 Printf.printf "\nExample completed successfully!\n"
110
111 with
112 | Gpx_error err ->
113 Printf.eprintf "GPX Error: %s\n" (Error.to_string err);
114 exit 1
115 | exn ->
116 Printf.eprintf "Unexpected error: %s\n" (Printexc.to_string exn);
117 exit 1