at main 4.0 kB view raw
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"