From b76951123d0a78d354045012ae9b853668cef767 Mon Sep 17 00:00:00 2001 From: Lev Dragunov Date: Mon, 18 Jan 2016 14:17:58 +0300 Subject: [PATCH] OSRM mapsme plugin small mwm fix. --- .../osrm-backend/plugins/MapsMePlugin.hpp | 40 ++++++++++++++++--- 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/3party/osrm/osrm-backend/plugins/MapsMePlugin.hpp b/3party/osrm/osrm-backend/plugins/MapsMePlugin.hpp index 322eb8c7b4..7c24d2b45c 100644 --- a/3party/osrm/osrm-backend/plugins/MapsMePlugin.hpp +++ b/3party/osrm/osrm-backend/plugins/MapsMePlugin.hpp @@ -187,7 +187,9 @@ public: return 400; } // Get mwm names - vector> usedMwms; + vector> usedMwms; + size_t lastUsedMwm = numeric_limits::max(); + vector mwmPoints; for (auto i : osrm::irange(0, raw_route.unpacked_path_segments.size())) { @@ -203,13 +205,39 @@ public: GetByPoint doGet(m_regions, pt); ForEachCountry(pt, doGet); - if (doGet.m_res != std::numeric_limits::max()) - usedMwms.emplace_back(make_pair(m_countries[doGet.m_res].m_name, pt)); + auto const & index = doGet.m_res; + if (index == std::numeric_limits::max()) + continue; + + if (index != lastUsedMwm) + { + if (!mwmPoints.empty()) + { + // Get the middlest point (max far from borders). + size_t delta = std::distance(mwmPoints.begin(), mwmPoints.end()) / 2; + usedMwms.emplace_back(lastUsedMwm, mwmPoints[delta]); + mwmPoints.clear(); + } + lastUsedMwm = index; + } + mwmPoints.push_back(pt); } } + // Get point from last mwm. + if (!mwmPoints.empty()) + { + size_t delta = std::distance(mwmPoints.begin(), mwmPoints.end()) / 2; + usedMwms.emplace_back(lastUsedMwm, mwmPoints[delta]); + mwmPoints.clear(); + } - auto const it = std::unique(usedMwms.begin(), usedMwms.end(), [&] - (pair const & a, pair const & b) + std::sort(usedMwms.begin(), usedMwms.end(), [] + (pair const & a, pair const & b) + { + return a.first < b.first; + }); + auto const it = std::unique(usedMwms.begin(), usedMwms.end(), [] + (pair const & a, pair const & b) { return a.first == b.first; }); @@ -221,7 +249,7 @@ public: osrm::json::Array pointArray; pointArray.values.push_back(mwm.second.x); pointArray.values.push_back(mwm.second.y); - pointArray.values.push_back(mwm.first); + pointArray.values.push_back(m_countries[mwm.first].m_name); json_array.values.push_back(pointArray); } reply.values["used_mwms"] = json_array;