Skip to content

Commit

Permalink
[map] move the track stats calc logic from ElevationInfo to the Track…
Browse files Browse the repository at this point in the history
…Statistics

Signed-off-by: Kiryl Kaveryn <[email protected]>
  • Loading branch information
kirylkaveryn authored and vng committed Feb 21, 2025
1 parent bc6a9e4 commit 1783c90
Show file tree
Hide file tree
Showing 23 changed files with 479 additions and 225 deletions.
8 changes: 2 additions & 6 deletions iphone/CoreApi/CoreApi/Bookmarks/TrackInfo+Core.h
Original file line number Diff line number Diff line change
@@ -1,14 +1,10 @@
#import "TrackInfo.h"

#include <CoreApi/Framework.h>
#include "map/gps_track_collection.hpp"
#include "map/elevation_info.hpp"
#include "map/track_statistics.hpp"

@interface TrackInfo (Core)

- (instancetype)initWithGpsTrackInfo:(GpsTrackInfo const &)info;
- (instancetype)initWithDistance:(double)distance duration:(double)duration;

- (void)setElevationInfo:(ElevationInfo const &)elevationInfo;
- (instancetype)initWithTrackStatistics:(TrackStatistics const &)statistics;

@end
31 changes: 7 additions & 24 deletions iphone/CoreApi/CoreApi/Bookmarks/TrackInfo.mm
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@
#import "DistanceFormatter.h"
#import "DurationFormatter.h"

#include "map/elevation_info.hpp"

@implementation TrackInfo

- (BOOL)hasElevationInfo {
Expand All @@ -19,31 +17,16 @@ + (TrackInfo *)emptyInfo {

@implementation TrackInfo (Core)

- (instancetype)initWithGpsTrackInfo:(GpsTrackInfo const &)trackInfo {
if (self = [super init]) {
_distance = trackInfo.m_length;
_duration = trackInfo.m_duration;
_ascent = trackInfo.m_ascent;
_descent = trackInfo.m_descent;
_maxElevation = trackInfo.m_maxElevation;
_minElevation = trackInfo.m_minElevation;
}
return self;
}

- (instancetype)initWithDistance:(double)distance duration:(double)duration {
- (instancetype)initWithTrackStatistics:(TrackStatistics const &)statistics {
if (self = [super init]) {
_distance = distance;
_duration = duration;
_distance = statistics.m_length;
_duration = statistics.m_duration;
_ascent = statistics.m_ascent;
_descent = statistics.m_descent;
_maxElevation = statistics.m_maxElevation;
_minElevation = statistics.m_minElevation;
}
return self;
}

- (void)setElevationInfo:(ElevationInfo const &)elevationInfo {
_ascent = elevationInfo.GetAscent();
_descent = elevationInfo.GetDescent();
_maxElevation = elevationInfo.GetMaxAltitude();
_minElevation = elevationInfo.GetMinAltitude();
}

@end
4 changes: 2 additions & 2 deletions iphone/CoreApi/CoreApi/Framework/MWMFrameworkHelper.mm
Original file line number Diff line number Diff line change
Expand Up @@ -224,8 +224,8 @@ + (void)setTrackRecordingUpdateHandler:(TrackRecordingUpdatedHandler _Nullable)t
GetFramework().SetTrackRecordingUpdateHandler(nullptr);
return;
}
GetFramework().SetTrackRecordingUpdateHandler([trackRecordingDidUpdate](GpsTrackInfo const & gpsTrackInfo) {
TrackInfo * info = [[TrackInfo alloc] initWithGpsTrackInfo:gpsTrackInfo];
GetFramework().SetTrackRecordingUpdateHandler([trackRecordingDidUpdate](TrackStatistics const & statistics) {
TrackInfo * info = [[TrackInfo alloc] initWithTrackStatistics:statistics];
trackRecordingDidUpdate(info);
});
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,9 @@ - (instancetype)initWithTrack:(Track const &)track {
self = [super init];
if (self) {
_trackId = track.GetData().m_id;
_trackInfo = [[TrackInfo alloc] initWithDistance:track.GetLengthMeters()
duration:track.GetDurationInSeconds()];
_trackInfo = [[TrackInfo alloc] initWithTrackStatistics:track.GetStatistics()];
auto const & elevationInfo = track.GetElevationInfo();
if (track.HasAltitudes() && elevationInfo.has_value()) {
[_trackInfo setElevationInfo:elevationInfo.value()];
auto const & bm = GetFramework().GetBookmarkManager();
_elevationProfileData = [[ElevationProfileData alloc] initWithTrackId:_trackId
elevationInfo:elevationInfo.value()
Expand Down
2 changes: 2 additions & 0 deletions map/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@ set(SRC
search_product_info.hpp
track.cpp
track.hpp
track_statistics.cpp
track_statistics.hpp
track_mark.cpp
track_mark.hpp
traffic_manager.cpp
Expand Down
82 changes: 44 additions & 38 deletions map/elevation_info.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,54 +4,60 @@

#include "geometry/mercator.hpp"

ElevationInfo::ElevationInfo(kml::MultiGeometry const & geometry)
using namespace geometry;
using namespace mercator;

ElevationInfo::ElevationInfo(std::vector<GeometryLine> const & lines)
{
double distance = 0;
// Concatenate all segments.
for (size_t lineIndex = 0; lineIndex < geometry.m_lines.size(); ++lineIndex)
for (size_t lineIndex = 0; lineIndex < lines.size(); ++lineIndex)
{
auto const & line = geometry.m_lines[lineIndex];
auto const & line = lines[lineIndex];
if (line.empty())
{
LOG(LWARNING, ("Empty line in elevation info"));
continue;
}

if (lineIndex == 0)
if (lineIndex > 0)
m_segmentsDistances.emplace_back(m_points.back().m_distance);

AddPoints(line, true /* new segment */);
}
/// @todo(KK) Implement difficulty calculation.
m_difficulty = Difficulty::Unknown;
}

void ElevationInfo::AddGpsPoints(GpsPoints const & points)
{
GeometryLine line;
line.reserve(points.size());
for (auto const & point : points)
line.emplace_back(FromLatLon(point.m_latitude, point.m_longitude), point.m_altitude);
AddPoints(line);
}

void ElevationInfo::AddPoints(GeometryLine const & line, bool isNewSegment)
{
if (line.empty())
return;

double distance = m_points.empty() ? 0 : m_points.back().m_distance;
for (size_t pointIndex = 0; pointIndex < line.size(); ++pointIndex)
{
auto const & point = line[pointIndex];

if (m_points.empty())
{
m_minAltitude = line.front().GetAltitude();
m_maxAltitude = m_minAltitude;
m_points.emplace_back(point, distance);
continue;
}

if (lineIndex > 0)
m_segmentsDistances.emplace_back(distance);

for (size_t pointIndex = 0; pointIndex < line.size(); ++pointIndex)
if (isNewSegment && pointIndex == 0)
{
auto const & currentPoint = line[pointIndex];
auto const & currentPointAltitude = currentPoint.GetAltitude();
if (currentPointAltitude < m_minAltitude)
m_minAltitude = currentPointAltitude;
if (currentPointAltitude > m_maxAltitude)
m_maxAltitude = currentPointAltitude;

if (pointIndex == 0)
{
m_points.emplace_back(currentPoint, distance);
continue;
}

auto const & previousPoint = line[pointIndex - 1];
distance += mercator::DistanceOnEarth(previousPoint.GetPoint(), currentPoint.GetPoint());
m_points.emplace_back(currentPoint, distance);

auto const deltaAltitude = currentPointAltitude - previousPoint.GetAltitude();
if (deltaAltitude > 0)
m_ascent += deltaAltitude;
else
m_descent -= deltaAltitude;
m_points.emplace_back(point, distance);
continue;
}

auto const & previousPoint = m_points.back().m_point;
distance += mercator::DistanceOnEarth(previousPoint.GetPoint(), point.GetPoint());
m_points.emplace_back(point, distance);
}
/// @todo(KK) Implement difficulty calculation.
m_difficulty = Difficulty::Unknown;
}
22 changes: 9 additions & 13 deletions map/elevation_info.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
#include "geometry/point_with_altitude.hpp"
#include "geometry/latlon.hpp"

#include "platform/location.hpp"

#include <cstdint>
#include <string>
#include <vector>
Expand All @@ -22,6 +24,8 @@ struct ElevationInfo
};

using Points = std::vector<Point>;
using GpsPoints = std::vector<location::GpsInfo>;
using GeometryLine = kml::MultiGeometry::LineT;
using SegmentsDistances = std::vector<double>;

enum Difficulty : uint8_t
Expand All @@ -33,31 +37,23 @@ struct ElevationInfo
};

ElevationInfo() = default;
explicit ElevationInfo(kml::MultiGeometry const & geometry);
explicit ElevationInfo(std::vector<GeometryLine> const & lines);

void AddGpsPoints(GpsPoints const & points);

size_t GetSize() const { return m_points.size(); };
Points const & GetPoints() const { return m_points; };
uint32_t GetAscent() const { return m_ascent; }
uint32_t GetDescent() const { return m_descent; }
geometry::Altitude GetMinAltitude() const { return m_minAltitude; }
geometry::Altitude GetMaxAltitude() const { return m_maxAltitude; }
uint8_t GetDifficulty() const { return m_difficulty; }
SegmentsDistances const & GetSegmentsDistances() const { return m_segmentsDistances; };

private:
// Points with distance from start of the track and altitude.
Points m_points;
// Ascent in meters.
uint32_t m_ascent = 0;
// Descent in meters.
uint32_t m_descent = 0;
// Altitude in meters.
geometry::Altitude m_minAltitude = 0;
// Altitude in meters.
geometry::Altitude m_maxAltitude = 0;
// Some digital difficulty level with value in range [0-kMaxDifficulty]
// or kInvalidDifficulty when difficulty is not found or incorrect.
Difficulty m_difficulty = Difficulty::Unknown;
// Distances to the start of each segment.
SegmentsDistances m_segmentsDistances;

void AddPoints(GeometryLine const & line, bool isNewSegment = false);
};
6 changes: 3 additions & 3 deletions map/framework.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1736,7 +1736,7 @@ void Framework::SetTrackRecordingUpdateHandler(TrackRecordingUpdateHandler && tr
{
m_trackRecordingUpdateHandler = std::move(trackRecordingDidUpdate);
if (m_trackRecordingUpdateHandler)
m_trackRecordingUpdateHandler(GpsTracker::Instance().GetTrackInfo());
m_trackRecordingUpdateHandler(GpsTracker::Instance().GetTrackStatistics());
}

void Framework::StopTrackRecording()
Expand Down Expand Up @@ -1768,7 +1768,7 @@ bool Framework::IsTrackRecordingEnabled() const

void Framework::OnUpdateGpsTrackPointsCallback(vector<pair<size_t, location::GpsInfo>> && toAdd,
pair<size_t, size_t> const & toRemove,
GpsTrackInfo const & trackInfo)
TrackStatistics const & trackStatistics)
{
ASSERT(m_drapeEngine.get() != nullptr, ());

Expand Down Expand Up @@ -1797,7 +1797,7 @@ void Framework::OnUpdateGpsTrackPointsCallback(vector<pair<size_t, location::Gps
m_drapeEngine->UpdateGpsTrackPoints(std::move(pointsAdd), std::move(indicesRemove));

if (m_trackRecordingUpdateHandler)
m_trackRecordingUpdateHandler(trackInfo);
m_trackRecordingUpdateHandler(trackStatistics);
}

void Framework::MarkMapStyle(MapStyle mapStyle)
Expand Down
6 changes: 3 additions & 3 deletions map/framework.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@
#include "map/search_api.hpp"
#include "map/search_mark.hpp"
#include "map/track.hpp"
#include "map/track_statistics.hpp"
#include "map/traffic_manager.hpp"
#include "map/transit/transit_reader.hpp"
#include "map/gps_track_collection.hpp"

#include "drape_frontend/gui/skin.hpp"
#include "drape_frontend/drape_api.hpp"
Expand Down Expand Up @@ -437,7 +437,7 @@ class Framework : public PositionProvider,
void ConnectToGpsTracker();
void DisconnectFromGpsTracker();

using TrackRecordingUpdateHandler = platform::SafeCallback<void(GpsTrackInfo const & trackInfo)>;
using TrackRecordingUpdateHandler = platform::SafeCallback<void(TrackStatistics const & trackStatistics)>;
void StartTrackRecording();
void SetTrackRecordingUpdateHandler(TrackRecordingUpdateHandler && trackRecordingDidUpdate);
void StopTrackRecording();
Expand Down Expand Up @@ -468,7 +468,7 @@ class Framework : public PositionProvider,

void OnUpdateGpsTrackPointsCallback(std::vector<std::pair<size_t, location::GpsInfo>> && toAdd,
std::pair<size_t, size_t> const & toRemove,
GpsTrackInfo const & trackInfo);
TrackStatistics const & trackStatistics);

TrackRecordingUpdateHandler m_trackRecordingUpdateHandler;

Expand Down
8 changes: 4 additions & 4 deletions map/gps_track.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -79,9 +79,9 @@ void GpsTrack::AddPoints(vector<location::GpsInfo> const & points)
ScheduleTask();
}

GpsTrackInfo GpsTrack::GetTrackInfo() const
TrackStatistics GpsTrack::GetTrackStatistics() const
{
return m_collection ? m_collection->GetTrackInfo() : GpsTrackInfo();
return m_collection ? m_collection->GetTrackStatistics() : TrackStatistics();
}

void GpsTrack::Clear()
Expand Down Expand Up @@ -303,7 +303,7 @@ void GpsTrack::NotifyCallback(pair<size_t, size_t> const & addedIds, pair<size_t
if (toAdd.empty())
return; // nothing to send

m_callback(std::move(toAdd), make_pair(kInvalidId, kInvalidId), m_collection->GetTrackInfo());
m_callback(std::move(toAdd), make_pair(kInvalidId, kInvalidId), m_collection->GetTrackStatistics());
}
else
{
Expand All @@ -324,6 +324,6 @@ void GpsTrack::NotifyCallback(pair<size_t, size_t> const & addedIds, pair<size_t
if (toAdd.empty() && evictedIds.first == kInvalidId)
return; // nothing to send

m_callback(std::move(toAdd), evictedIds, m_collection->GetTrackInfo());
m_callback(std::move(toAdd), evictedIds, m_collection->GetTrackStatistics());
}
}
4 changes: 2 additions & 2 deletions map/gps_track.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ class GpsTrack final
void AddPoints(std::vector<location::GpsInfo> const & points);

/// Returns track statistics
GpsTrackInfo GetTrackInfo() const;
TrackStatistics GetTrackStatistics() const;

/// Clears any previous tracking info
/// @note Callback is called with 'toRemove' points, if some points were removed.
Expand All @@ -47,7 +47,7 @@ class GpsTrack final
using TGpsTrackDiffCallback =
std::function<void(std::vector<std::pair<size_t, location::GpsInfo>> && toAdd,
std::pair<size_t, size_t> const & toRemove,
GpsTrackInfo const & trackInfo)>;
TrackStatistics const & trackStatistics)>;

/// Sets callback on change of gps track.
/// @param callback - callback callable object
Expand Down
Loading

0 comments on commit 1783c90

Please sign in to comment.