Repo created
This commit is contained in:
parent
4af19165ec
commit
68073add76
12458 changed files with 12350765 additions and 2 deletions
63
libs/map/elevation_info.cpp
Normal file
63
libs/map/elevation_info.cpp
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
#include "map/elevation_info.hpp"
|
||||
|
||||
#include "base/logging.hpp"
|
||||
|
||||
#include "geometry/mercator.hpp"
|
||||
|
||||
using namespace geometry;
|
||||
using namespace mercator;
|
||||
|
||||
ElevationInfo::ElevationInfo(std::vector<GeometryLine> const & lines)
|
||||
{
|
||||
// Concatenate all segments.
|
||||
for (size_t lineIndex = 0; lineIndex < lines.size(); ++lineIndex)
|
||||
{
|
||||
auto const & line = lines[lineIndex];
|
||||
if (line.empty())
|
||||
continue;
|
||||
|
||||
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_points.emplace_back(point, distance);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (isNewSegment && pointIndex == 0)
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue