From 92bd6b609db7c5de7f3e9976a887a90cc05470c3 Mon Sep 17 00:00:00 2001 From: vng Date: Sat, 3 Jul 2021 12:51:52 +0300 Subject: [PATCH] [generator] Added smoothness=intermediate. Added more paving tags. Signed-off-by: vng --- generator/generator_tests/osm_type_test.cpp | 9 ++++ generator/osm2type.cpp | 55 +++++++++------------ 2 files changed, 31 insertions(+), 33 deletions(-) diff --git a/generator/generator_tests/osm_type_test.cpp b/generator/generator_tests/osm_type_test.cpp index 9b411c307e..bc8c0d6d49 100644 --- a/generator/generator_tests/osm_type_test.cpp +++ b/generator/generator_tests/osm_type_test.cpp @@ -532,17 +532,26 @@ UNIT_CLASS_TEST(TestWithClassificator, OsmType_Surface) TestSurfaceTypes("asphalt", "", "", "paved_good"); TestSurfaceTypes("asphalt", "bad", "", "paved_bad"); TestSurfaceTypes("asphalt", "", "0", "paved_bad"); + TestSurfaceTypes("fine_gravel", "intermediate", "", "paved_bad"); + TestSurfaceTypes("gravel", "intermediate", "", "unpaved_bad"); + TestSurfaceTypes("paved", "intermediate", "", "paved_good"); + TestSurfaceTypes("", "intermediate", "", "paved_good"); TestSurfaceTypes("paved", "", "2", "paved_good"); TestSurfaceTypes("", "excellent", "", "paved_good"); TestSurfaceTypes("wood", "", "", "paved_bad"); TestSurfaceTypes("wood", "good", "", "paved_good"); TestSurfaceTypes("wood", "", "3", "paved_good"); + TestSurfaceTypes("pebblestone", "", "4", "paved_good"); TestSurfaceTypes("unpaved", "", "", "unpaved_good"); TestSurfaceTypes("mud", "", "", "unpaved_bad"); + + /// @todo Is it ok here that default no-tags equals to smoothness=bad? TestSurfaceTypes("", "bad", "", "unpaved_good"); + TestSurfaceTypes("", "horrible", "", "unpaved_bad"); TestSurfaceTypes("ground", "", "1", "unpaved_bad"); TestSurfaceTypes("mud", "", "3", "unpaved_good"); + TestSurfaceTypes("ground", "", "5", "unpaved_good"); TestSurfaceTypes("unknown", "", "", "unpaved_good"); TestSurfaceTypes("", "unknown", "", "unpaved_good"); } diff --git a/generator/osm2type.cpp b/generator/osm2type.cpp index e46d874e5e..a2822cd6ca 100644 --- a/generator/osm2type.cpp +++ b/generator/osm2type.cpp @@ -442,57 +442,46 @@ string DetermineSurface(OsmElement * p) return {}; static base::StringIL pavedSurfaces = { - "paved", "asphalt", "cobblestone", "cobblestone:flattened", - "sett", "concrete", "concrete:lanes", "concrete:plates", - "paving_stones", "metal", "wood", "chipseal"}; + "paved", "asphalt", "cobblestone", "cobblestone:flattened", "unhewn_cobblestone", + "sett", "concrete", "concrete:lanes", "concrete:plates", "pebblestone", + "paving_stones", "metal", "wood", "chipseal", "fine_gravel" }; - static base::StringIL badSurfaces = {"cobblestone", "sett", "metal", "wood", "grass", - "gravel", "mud", "sand", "snow", "woodchips"}; + static base::StringIL badSurfaces = {"cobblestone", "sett", "pebblestone" "metal", "wood", "grass", "dirt", "earth", + "fine_gravel", "gravel", "unhewn_cobblestone", "mud", "sand", "snow", "woodchips", "ground" }; static base::StringIL badSmoothness = { "bad", "very_bad", "horrible", "very_horrible", "impassable", "robust_wheels", "high_clearance", "off_road_wheels", "rough"}; + static base::StringIL goodSmoothness = { "excellent", "good", "intermediate" }; + + auto const Has = [](base::StringIL const & il, std::string const & v) + { + return std::find(il.begin(), il.end(), v) != il.end(); + }; + bool isPaved = false; bool isGood = true; if (!surface.empty()) - { - for (auto const & value : pavedSurfaces) - { - if (surface == value) - isPaved = true; - } - } + isPaved = Has(pavedSurfaces, surface); else - { - isPaved = smoothness == "excellent" || smoothness == "good"; - } + isPaved = !smoothness.empty() && Has(goodSmoothness, smoothness); if (!smoothness.empty()) { - for (auto const & value : badSmoothness) - { - if (smoothness == value) - isGood = false; - } + if (smoothness == "intermediate" && !surface.empty()) + isGood = !Has(badSurfaces, surface); + else + isGood = !Has(badSmoothness, smoothness); + + /// @todo Hm, looks like some hack, but will not change it now .. if (smoothness == "bad" && !isPaved) isGood = true; } else if (surface_grade == "0" || surface_grade == "1") - { isGood = false; - } - else - { - if (surface_grade != "3") - { - for (auto const & value : badSurfaces) - { - if (surface == value) - isGood = false; - } - } - } + else if (surface_grade.empty() || surface_grade == "2") + isGood = surface.empty() || !Has(badSurfaces, surface); string psurface = isPaved ? "paved_" : "unpaved_"; psurface += isGood ? "good" : "bad";