]> git.openstreetmap.org Git - rails.git/blob - app/views/api/tracepoints/index.gpx.builder
Merge pull request #6394 from openstreetmap/dependabot/github_actions/ruby/setup...
[rails.git] / app / views / api / tracepoints / index.gpx.builder
1 # frozen_string_literal: true
2
3 xml.instruct!
4
5 xml.gpx("version" => "1.0",
6         "creator" => "OpenStreetMap.org",
7         "xmlns" => "http://www.topografix.com/GPX/1/0") do
8   # initialise these variables outside of the loop so that they
9   # stay in scope and don't get free'd up by the GC during the
10   # loop.
11   gpx_id = -1
12   trackid = -1
13   tracks = []
14   track = nil
15   trkseg = nil
16   anon_track = nil
17   anon_trkseg = nil
18
19   @points.each do |point|
20     if gpx_id != point.gpx_id
21       gpx_id = point.gpx_id
22       trackid = -1
23
24       if point.trace.trackable?
25         track = {}
26         track["trksegs"] = []
27         tracks << track
28
29         if point.trace.identifiable?
30           track["name"] = point.trace.name
31           track["desc"] = point.trace.description
32           track["url"] = url_for(:controller => "/traces", :action => "show", :display_name => point.trace.user.display_name, :id => point.trace.id)
33         end
34       else
35         # use the anonymous track segment if the user hasn't allowed
36         # their GPX points to be tracked.
37         if anon_track.nil?
38           anon_track = {}
39           anon_track["trksegs"] = []
40           tracks << anon_track
41         end
42         track = anon_track
43       end
44     end
45
46     if trackid != point.trackid
47       if point.trace.trackable?
48         trkseg = []
49         track["trksegs"] << trkseg
50         trackid = point.trackid
51       else
52         if anon_trkseg.nil?
53           anon_trkseg = []
54           anon_track["trksegs"] << anon_trkseg
55         end
56         trkseg = anon_trkseg
57       end
58     end
59
60     trkseg << point
61   end
62
63   tracks.each do |trk|
64     xml.trk do
65       if trk.key?("name")
66         xml.name trk["name"]
67         xml.desc trk["desc"]
68         xml.url trk["url"]
69       end
70       trk["trksegs"].each do |trksg|
71         xml.trkseg do
72           trksg.each do |tracepoint|
73             xml.trkpt("lat" => tracepoint.lat.to_s, "lon" => tracepoint.lon.to_s) do
74               xml.time tracepoint.timestamp.xmlschema if tracepoint.trace.trackable?
75             end
76           end
77         end
78       end
79     end
80   end
81 end