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