GPS Exchange Format library/CLI in OCaml
1(** Example demonstrating basic GPX operations using the direct API *)
2
3open Gpx
4
5let () =
6 Printf.printf "=== mlgpx Library Example ===\n\n";
7
8 (* Create coordinates using direct API *)
9 let create_coordinate_pair lat_f lon_f =
10 match Coordinate.latitude lat_f, Coordinate.longitude lon_f with
11 | Ok lat, Ok lon -> Ok (lat, lon)
12 | Error e, _ | _, Error e -> Error (Error.invalid_coordinate e)
13 in
14
15 (* Create a simple waypoint *)
16 let result = create_coordinate_pair 37.7749 (-122.4194) in
17 match result with
18 | Ok (lat, lon) ->
19 let wpt = Waypoint.make lat lon in
20 let wpt = { wpt with name = Some "San Francisco"; desc = Some "Golden Gate Bridge area" } in
21 Printf.printf "✓ Created waypoint: %s\n" (Option.value (Waypoint.name wpt) ~default:"<unnamed>");
22
23 (* Create GPX document *)
24 let gpx = Doc.empty ~creator:"mlgpx direct API example" in
25 let gpx = Doc.add_waypoint gpx wpt in
26
27 (* Add metadata *)
28 let metadata = Metadata.empty in
29 let metadata = { metadata with name = Some "Example GPX File"; desc = Some "Demonstration of mlgpx library capabilities" } in
30 let gpx = { gpx with metadata = Some metadata } in
31
32 (* Create a simple track with points *)
33 let track = Track.make ~name:"Example Track" in
34 let track = { track with cmt = Some "Sample GPS track"; desc = Some "Demonstrates track creation" } in
35
36 (* Create track segment with points *)
37 let track_segment = Track.Segment.empty in
38 let points = [
39 (37.7749, -122.4194);
40 (37.7849, -122.4094);
41 (37.7949, -122.3994);
42 ] in
43 let track_segment =
44 List.fold_left (fun seg (lat_f, lon_f) ->
45 match Coordinate.latitude lat_f, Coordinate.longitude lon_f with
46 | Ok lat, Ok lon ->
47 let pt = Waypoint.make lat lon in
48 Track.Segment.add_point seg pt
49 | _ -> seg
50 ) track_segment points in
51
52 let track = Track.add_segment track track_segment in
53 let gpx = Doc.add_track gpx track in
54
55 Printf.printf "✓ Created track\n";
56
57 (* Validate the document *)
58 let validation = validate_gpx gpx in
59 Printf.printf "✓ GPX validation: %s\n" (if validation.is_valid then "PASSED" else "FAILED");
60
61 (* Convert to XML string *)
62 let xml_result = write_string gpx in
63 (match xml_result with
64 | Ok xml_string ->
65 Printf.printf "✓ Generated XML (%d characters)\n" (String.length xml_string);
66
67 (* Save to file - write directly using core API *)
68 let out_chan = open_out "example_direct.gpx" in
69 let dest = (`Channel out_chan) in
70 let write_result = write ~validate:true dest gpx in
71 close_out out_chan;
72 (match write_result with
73 | Ok () ->
74 Printf.printf "✓ Saved to example_direct.gpx\n";
75
76 (* Read it back to verify round-trip *)
77 let in_chan = open_in "example_direct.gpx" in
78 let input = Xmlm.make_input (`Channel in_chan) in
79 let read_result = parse ~validate:true input in
80 close_in in_chan;
81 (match read_result with
82 | Ok gpx2 ->
83 Printf.printf "✓ Successfully read back GPX\n";
84 let validation2 = validate_gpx gpx2 in
85 Printf.printf "✓ Round-trip validation: %s\n"
86 (if validation2.is_valid then "PASSED" else "FAILED");
87 Printf.printf " Waypoints: %d, Tracks: %d\n"
88 (List.length (Doc.waypoints gpx2)) (List.length (Doc.tracks gpx2))
89 | Error e ->
90 Printf.printf "✗ Error reading back: %s\n" (Error.to_string e)
91 )
92 | Error e ->
93 Printf.printf "✗ Error saving file: %s\n" (Error.to_string e)
94 )
95 | Error e ->
96 Printf.printf "✗ Error generating XML: %s\n" (Error.to_string e)
97 )
98 | Error e ->
99 Printf.printf "✗ Error creating coordinates: %s\n" (Error.to_string e);
100
101 Printf.printf "\n=== Example Complete ===\n"