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