From c23a535dba9fd746d0c934f69649aa230cbb1fef Mon Sep 17 00:00:00 2001 From: Kiryl Kaveryn Date: Sun, 25 Aug 2024 21:05:44 +0400 Subject: [PATCH] [gps] add timestams and altitudes to the recorded track points Signed-off-by: Kiryl Kaveryn --- map/bookmark_manager.cpp | 23 +++++++++++++++-------- map/gps_track.cpp | 6 ++++++ map/gps_track.hpp | 1 + map/gps_tracker.cpp | 5 +++++ map/gps_tracker.hpp | 1 + 5 files changed, 28 insertions(+), 8 deletions(-) diff --git a/map/bookmark_manager.cpp b/map/bookmark_manager.cpp index 484c762141..d818adf77e 100644 --- a/map/bookmark_manager.cpp +++ b/map/bookmark_manager.cpp @@ -1148,26 +1148,33 @@ void BookmarkManager::SaveTrackRecording(std::string trackName) auto const & tracker = GpsTracker::Instance(); CHECK(!tracker.IsEmpty(), ("Track recording should be not be empty")); - kml::MultiGeometry::LineT line; - tracker.ForEachTrackPoint([&line](location::GpsInfo const & pt, size_t id)->bool + kml::MultiGeometry geometry; + geometry.m_lines.emplace_back(); + geometry.m_timestamps.emplace_back(); + auto & line = geometry.m_lines.back(); + auto & timestamps = geometry.m_timestamps.back(); + auto const trackSize = tracker.GetTrackSize(); + line.reserve(trackSize); + timestamps.reserve(trackSize); + + tracker.ForEachTrackPoint([&line, ×tamps](location::GpsInfo const & pt, size_t id)->bool { - line.emplace_back(mercator::FromLatLon(pt.m_latitude, pt.m_longitude)); + line.emplace_back(mercator::FromLatLon(pt.m_latitude, pt.m_longitude), pt.m_altitude); + timestamps.emplace_back(pt.m_timestamp); return true; }); kml::TrackData trackData; + trackData.m_geometry = std::move(geometry); + if (trackName.empty()) trackName = GenerateTrackRecordingName(); kml::SetDefaultStr(trackData.m_name, trackName); - kml::MultiGeometry geometry; - geometry.m_lines.push_back(std::move(line)); - trackData.m_geometry = std::move(geometry); - kml::ColorData colorData; colorData.m_rgba = GenerateTrackRecordingColor().GetRGBA(); kml::TrackLayer layer; - layer.m_color = colorData; + layer.m_color = std::move(colorData); std::vector m_layers; m_layers.emplace_back(layer); diff --git a/map/gps_track.cpp b/map/gps_track.cpp index ec7b9f13c3..5258dc6057 100644 --- a/map/gps_track.cpp +++ b/map/gps_track.cpp @@ -94,6 +94,12 @@ void GpsTrack::Clear() ScheduleTask(); } +size_t GpsTrack::GetSize() const +{ + CHECK(m_collection != nullptr, ()); + return m_collection->GetSize(); +} + bool GpsTrack::IsEmpty() const { if (!m_collection) diff --git a/map/gps_track.hpp b/map/gps_track.hpp index 735df9e00e..d02d529285 100644 --- a/map/gps_track.hpp +++ b/map/gps_track.hpp @@ -39,6 +39,7 @@ public: void Clear(); bool IsEmpty() const; + size_t GetSize() const; /// Sets tracking duration in hours. /// @note Callback is called with 'toRemove' points, if some points were removed. diff --git a/map/gps_tracker.cpp b/map/gps_tracker.cpp index fea2a0da9a..77c4048271 100644 --- a/map/gps_tracker.cpp +++ b/map/gps_tracker.cpp @@ -99,6 +99,11 @@ bool GpsTracker::IsEmpty() const return m_track.IsEmpty(); } +size_t GpsTracker::GetTrackSize() const +{ + return m_track.GetSize(); +} + void GpsTracker::Connect(TGpsTrackDiffCallback const & fn) { m_track.SetCallback(fn); diff --git a/map/gps_tracker.hpp b/map/gps_tracker.hpp index a53b72e807..b27b19daf0 100644 --- a/map/gps_tracker.hpp +++ b/map/gps_tracker.hpp @@ -18,6 +18,7 @@ public: std::chrono::hours GetDuration() const; bool IsEmpty() const; + size_t GetTrackSize() const; void SetDuration(std::chrono::hours duration);