From 36824a459cf539d024a5c0bd07e2e7257b986ffd Mon Sep 17 00:00:00 2001 From: vng Date: Tue, 29 Oct 2013 16:46:47 +0300 Subject: [PATCH] [tracks] Track::GetLengthMeters. --- map/track.cpp | 22 ++++++++++++++++++++++ map/track.hpp | 2 +- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/map/track.cpp b/map/track.cpp index 0f84f75e1f..f645f06279 100644 --- a/map/track.cpp +++ b/map/track.cpp @@ -1,5 +1,7 @@ #include "track.hpp" +#include "../indexer/mercator.hpp" + #include "../graphics/screen.hpp" #include "../graphics/pen.hpp" #include "../graphics/depth_constants.hpp" @@ -7,6 +9,7 @@ #include "../geometry/distance.hpp" #include "../geometry/simplification.hpp" +#include "../geometry/distance_on_sphere.hpp" #include "../base/timer.hpp" #include "../base/logging.hpp" @@ -80,6 +83,25 @@ void Track::CreateDisplayList(graphics::Screen * dlScreen, MatrixT const & matri dlScreen->endFrame(); } +double Track::GetLengthMeters() const +{ + double res = 0.0; + + PolylineD::IterT i = m_polyline.Begin(); + double lat1 = MercatorBounds::YToLat(i->y); + double lon1 = MercatorBounds::XToLon(i->x); + for (++i; i != m_polyline.End(); ++i) + { + double const lat2 = MercatorBounds::YToLat(i->y); + double const lon2 = MercatorBounds::XToLon(i->x); + res += ms::DistanceOnEarth(lat1, lon1, lat2, lon2); + lat1 = lat2; + lon1 = lon2; + } + + return res; +} + double Track::GetShortestSquareDistance(m2::PointD const & point) const { double res = numeric_limits::max(); diff --git a/map/track.hpp b/map/track.hpp index 85eb587b0e..d9669fcd63 100644 --- a/map/track.hpp +++ b/map/track.hpp @@ -68,7 +68,7 @@ public: m2::RectD const & GetLimitRect() const { return m_rect; } //@} - double GetLength() const { return m_polyline.GetLength(); } + double GetLengthMeters() const; double GetShortestSquareDistance(m2::PointD const & point) const; void Swap(Track & rhs);