1(** Core GPX types matching the GPX 1.1 XSD schema *) 2 3[@@@warning "-30"] 4 5(** Geographic coordinates with validation constraints *) 6type latitude = private float 7type longitude = private float 8type degrees = private float 9 10(** Smart constructors for validated coordinates *) 11val latitude : float -> (latitude, string) result 12val longitude : float -> (longitude, string) result 13val degrees : float -> (degrees, string) result 14 15(** Convert back to float *) 16val latitude_to_float : latitude -> float 17val longitude_to_float : longitude -> float 18val degrees_to_float : degrees -> float 19 20(** GPS fix types as defined in GPX spec *) 21type fix_type = 22 | None_fix 23 | Fix_2d 24 | Fix_3d 25 | Dgps 26 | Pps 27 28(** Person information *) 29type person = { 30 name : string option; 31 email : string option; 32 link : link option; 33} 34 35(** Link information *) 36and link = { 37 href : string; 38 text : string option; 39 type_ : string option; 40} 41 42(** Copyright information *) 43type copyright = { 44 author : string; 45 year : int option; 46 license : string option; 47} 48 49(** Bounding box *) 50type bounds = { 51 minlat : latitude; 52 minlon : longitude; 53 maxlat : latitude; 54 maxlon : longitude; 55} 56 57(** Metadata container *) 58type metadata = { 59 name : string option; 60 desc : string option; 61 author : person option; 62 copyright : copyright option; 63 links : link list; 64 time : Ptime.t option; 65 keywords : string option; 66 bounds : bounds option; 67 extensions : extension list; 68} 69 70(** Extension mechanism for custom elements *) 71and extension = { 72 namespace : string option; 73 name : string; 74 attributes : (string * string) list; 75 content : extension_content; 76} 77 78and extension_content = 79 | Text of string 80 | Elements of extension list 81 | Mixed of string * extension list 82 83(** Base waypoint data shared by wpt, rtept, trkpt *) 84type waypoint_data = { 85 lat : latitude; 86 lon : longitude; 87 ele : float option; 88 time : Ptime.t option; 89 magvar : degrees option; 90 geoidheight : float option; 91 name : string option; 92 cmt : string option; 93 desc : string option; 94 src : string option; 95 links : link list; 96 sym : string option; 97 type_ : string option; 98 fix : fix_type option; 99 sat : int option; 100 hdop : float option; 101 vdop : float option; 102 pdop : float option; 103 ageofdgpsdata : float option; 104 dgpsid : int option; 105 extensions : extension list; 106} 107 108(** Waypoint *) 109type waypoint = waypoint_data 110 111(** Route point *) 112type route_point = waypoint_data 113 114(** Track point *) 115type track_point = waypoint_data 116 117(** Route definition *) 118type route = { 119 name : string option; 120 cmt : string option; 121 desc : string option; 122 src : string option; 123 links : link list; 124 number : int option; 125 type_ : string option; 126 extensions : extension list; 127 rtepts : route_point list; 128} 129 130(** Track segment *) 131type track_segment = { 132 trkpts : track_point list; 133 extensions : extension list; 134} 135 136(** Track definition *) 137type track = { 138 name : string option; 139 cmt : string option; 140 desc : string option; 141 src : string option; 142 links : link list; 143 number : int option; 144 type_ : string option; 145 extensions : extension list; 146 trksegs : track_segment list; 147} 148 149(** Main GPX document *) 150type gpx = { 151 version : string; (* Always "1.1" for this version *) 152 creator : string; 153 metadata : metadata option; 154 waypoints : waypoint list; 155 routes : route list; 156 tracks : track list; 157 extensions : extension list; 158} 159 160(** Parser/Writer errors *) 161type error = 162 | Invalid_xml of string 163 | Invalid_coordinate of string 164 | Missing_required_attribute of string * string 165 | Missing_required_element of string 166 | Validation_error of string 167 | Xml_error of string 168 | IO_error of string 169 170exception Gpx_error of error 171 172(** Result type for operations that can fail *) 173type 'a result = ('a, error) Result.t 174 175(** Utility functions *) 176 177(** Convert fix_type to string *) 178val fix_type_to_string : fix_type -> string 179 180(** Parse fix_type from string *) 181val fix_type_of_string : string -> fix_type option 182 183(** Create empty waypoint_data with required coordinates *) 184val make_waypoint_data : latitude -> longitude -> waypoint_data 185 186(** Create empty metadata *) 187val empty_metadata : metadata 188 189(** Create empty GPX document *) 190val make_gpx : creator:string -> gpx