| 69 | } |
| 70 | |
| 71 | ankerl::unordered_dense::map<FeatureID, std::vector<m2::PointD>> ReadPoints(df::MapDataProvider & model, |
| 72 | MetalineData const & metaline) |
| 73 | { |
| 74 | auto features = metaline.m_features; |
| 75 | std::sort(features.begin(), features.end()); |
| 76 | |
| 77 | ankerl::unordered_dense::map<FeatureID, std::vector<m2::PointD>> result; |
| 78 | model.ReadFeatures([&metaline, &result](FeatureType & ft) |
| 79 | { |
| 80 | ft.ParseGeometry(FeatureType::BEST_GEOMETRY); |
| 81 | size_t const count = ft.GetPointsCount(); |
| 82 | |
| 83 | std::vector<m2::PointD> featurePoints; |
| 84 | featurePoints.reserve(count); |
| 85 | featurePoints.push_back(ft.GetPoint(0)); |
| 86 | |
| 87 | for (size_t i = 1; i < count; ++i) |
| 88 | { |
| 89 | auto const & pt = ft.GetPoint(i); |
| 90 | if (!featurePoints.back().EqualDxDy(pt, kMwmPointAccuracy)) |
| 91 | featurePoints.push_back(pt); |
| 92 | } |
| 93 | |
| 94 | if (metaline.m_reversed.find(ft.GetID()) != metaline.m_reversed.cend()) |
| 95 | std::reverse(featurePoints.begin(), featurePoints.end()); |
| 96 | |
| 97 | result.emplace(ft.GetID(), std::move(featurePoints)); |
| 98 | }, features); |
| 99 | |
| 100 | return result; |
| 101 | } |
| 102 | |
| 103 | std::vector<m2::PointD> MergePoints(ankerl::unordered_dense::map<FeatureID, std::vector<m2::PointD>> && points, |
| 104 | std::vector<FeatureID> const & featuresOrder) |
no test coverage detected