From 0bcf6cec26b3a11f1ffb0f7f5fae95b5bec9ae78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20G=C3=BCndling?= Date: Sat, 2 Nov 2024 14:30:38 +0100 Subject: [PATCH] fix level changes: propagate kNoLevel --- CMakeLists.txt | 2 +- exe/backend/src/http_server.cc | 12 +- include/osr/extract/tags.h | 5 +- include/osr/geojson.h | 12 +- include/osr/location.h | 2 +- include/osr/platforms.h | 2 +- include/osr/routing/profiles/bike_sharing.h | 4 +- include/osr/routing/profiles/car_parking.h | 4 +- include/osr/routing/profiles/foot.h | 14 +- include/osr/types.h | 39 +- src/route.cc | 4 +- test/level_test.cc | 9 +- test/lvl_wildcard_test.cc | 90 ++ test/stuttgart.osm.pbf | Bin 0 -> 40871 bytes web/index.html | 952 ++++++-------------- 15 files changed, 411 insertions(+), 740 deletions(-) create mode 100644 test/lvl_wildcard_test.cc create mode 100644 test/stuttgart.osm.pbf diff --git a/CMakeLists.txt b/CMakeLists.txt index 46354ae..889b339 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -145,7 +145,7 @@ configure_file( file(GLOB_RECURSE osr-test-files test/*cc) add_executable(osr-test ${osr-test-files}) target_include_directories(osr-test PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/generated) -target_link_libraries(osr-test gtest osr) +target_link_libraries(osr-test gtest osr boost-json) # --- MIMALLOC --- if (OSR_MIMALLOC) diff --git a/exe/backend/src/http_server.cc b/exe/backend/src/http_server.cc index 8dbbe83..4eb87cd 100644 --- a/exe/backend/src/http_server.cc +++ b/exe/backend/src/http_server.cc @@ -58,7 +58,7 @@ web_server::string_res_t json_response( location parse_location(json::value const& v) { auto const& obj = v.as_object(); return {obj.at("lat").as_double(), obj.at("lng").as_double(), - obj.contains("level") ? to_level(obj.at("level").to_number()) + obj.contains("level") ? level_t{obj.at("level").to_number()} : kNoLevel}; } @@ -132,7 +132,7 @@ struct http_server::impl { {"type", "Feature"}, { "properties", - {{"level", to_float(s.from_level_)}, + {{"level", s.from_level_.to_float()}, {"osm_way_id", s.way_ == way_idx_t::invalid() ? 0U @@ -162,7 +162,7 @@ struct http_server::impl { } }); auto levels_sorted = - utl::to_vec(levels, [](level_t const l) { return to_float(l); }); + utl::to_vec(levels, [](level_t const l) { return l.to_float(); }); utl::sort(levels_sorted, [](auto&& a, auto&& b) { return a > b; }); cb(json_response(req, json::serialize(utl::all(levels_sorted) // @@ -184,10 +184,10 @@ struct http_server::impl { switch (profile) { case search_profile::kFoot: - send_graph_response>(req, cb, gj); + send_graph_response>(req, cb, gj); break; case search_profile::kWheelchair: - send_graph_response>(req, cb, gj); + send_graph_response>(req, cb, gj); break; case search_profile::kBike: send_graph_response(req, cb, gj); break; case search_profile::kCar: send_graph_response(req, cb, gj); break; @@ -229,7 +229,7 @@ struct http_server::impl { auto const query = boost::json::parse(req.body()).as_object(); auto const level = query.contains("level") - ? to_level(query.at("level").to_number()) + ? level_t{query.at("level").to_number()} : kNoLevel; auto const waypoints = query.at("waypoints").as_array(); auto const min = point::from_latlng( diff --git a/include/osr/extract/tags.h b/include/osr/extract/tags.h index 19dea54..59da382 100644 --- a/include/osr/extract/tags.h +++ b/include/osr/extract/tags.h @@ -53,13 +53,16 @@ struct tags { is_platform_ = true; } break; + case cista::hash("layer"): + // not correct but layer seems to be used like level in some places :/ + [[fallthrough]]; case cista::hash("level"): { has_level_ = true; auto s = utl::cstr{t.value()}; while (s) { auto l = 0.0F; utl::parse_arg(s, l); - auto const lvl = to_level(std::clamp(l, kMinLevel, kMaxLevel)); + auto const lvl = level_t{std::clamp(l, kMinLevel, kMaxLevel)}; level_bits_ |= (1U << to_idx(lvl)); if (s) { ++s; diff --git a/include/osr/geojson.h b/include/osr/geojson.h index 8500a29..a9ee766 100644 --- a/include/osr/geojson.h +++ b/include/osr/geojson.h @@ -64,7 +64,7 @@ struct geojson_writer { {"properties", {{"type", is_way(r) ? "way" : "node"}, {"platform_idx", to_idx(i)}, - {"level", to_float(platforms_->get_level(w_, i))}, + {"level", platforms_->get_level(w_, i).to_float()}, {"names", platform_names(*platforms_, i)}}}, {"geometry", geometry}}); } @@ -94,8 +94,8 @@ struct geojson_writer { {"oneway_car", p.is_oneway_car()}, {"oneway_bike", p.is_oneway_bike()}, {"max_speed", p.max_speed_km_per_h()}, - {"from_level", to_float(level_t{p.from_level()})}, - {"to_level", to_float(level_t{p.to_level()})}, + {"from_level", p.from_level().to_float()}, + {"to_level", p.to_level().to_float()}, {"is_elevator", p.is_elevator()}, {"is_steps", p.is_steps()}, {"is_parking", p.is_parking_}}}, @@ -116,8 +116,8 @@ struct geojson_writer { {"oneway_car", p.is_oneway_car()}, {"oneway_bike", p.is_oneway_bike()}, {"max_speed", p.max_speed_km_per_h()}, - {"from_level", to_float(level_t{p.from_level()})}, - {"to_level", to_float(level_t{p.to_level()})}, + {"from_level", p.from_level().to_float()}, + {"to_level", p.to_level().to_float()}, {"is_elevator", p.is_elevator()}, {"is_steps", p.is_steps()}}}, {"geometry", to_line_string(w_.way_polylines_[i])}}); @@ -142,7 +142,7 @@ struct geojson_writer { auto levels = std::vector(); foot::for_each_elevator_level( - *w_.r_, n, [&](auto&& l) { levels.push_back(to_float(level_t{l})); }); + *w_.r_, n, [&](level_t const l) { levels.push_back(l.to_float()); }); auto properties = boost::json::object{ {"osm_node_id", to_idx(w_.node_to_osm_[n])}, diff --git a/include/osr/location.h b/include/osr/location.h index 2959734..dc6b227 100644 --- a/include/osr/location.h +++ b/include/osr/location.h @@ -14,7 +14,7 @@ struct location { CISTA_FRIEND_COMPARABLE(location) friend std::ostream& operator<<(std::ostream& out, location const& l) { - return out << "{ pos=" << l.pos_ << ", lvl=" << to_float(l.lvl_) << " }"; + return out << "{ pos=" << l.pos_ << ", lvl=" << l.lvl_.to_float() << " }"; } geo::latlng pos_; diff --git a/include/osr/platforms.h b/include/osr/platforms.h index dc913b4..b459d13 100644 --- a/include/osr/platforms.h +++ b/include/osr/platforms.h @@ -133,7 +133,7 @@ struct platforms { level_t get_level(ways const& w, platform_idx_t const i) const { if (i == platform_idx_t::invalid()) { - return to_level(0.0); + return level_t{0.0F}; } return std::visit( utl::overloaded{ diff --git a/include/osr/routing/profiles/bike_sharing.h b/include/osr/routing/profiles/bike_sharing.h index b3267f3..d39d68e 100644 --- a/include/osr/routing/profiles/bike_sharing.h +++ b/include/osr/routing/profiles/bike_sharing.h @@ -83,14 +83,14 @@ struct bike_sharing { boost::json::object geojson_properties(ways const& w) const { auto properties = boost::json::object{{"osm_node_id", to_idx(w.node_to_osm_[n_])}, - {"level", to_float(lvl_)}, + {"level", lvl_.to_float()}, {"type", node_type_to_str(type_)}}; return properties; } std::ostream& print(std::ostream& out, ways const& w) const { return out << "(node=" << w.node_to_osm_[n_] - << ", level=" << to_float(lvl_) + << ", level=" << lvl_.to_float() << ", type=" << node_type_to_str(type_) << ")"; } diff --git a/include/osr/routing/profiles/car_parking.h b/include/osr/routing/profiles/car_parking.h index d91b26a..d35722d 100644 --- a/include/osr/routing/profiles/car_parking.h +++ b/include/osr/routing/profiles/car_parking.h @@ -42,7 +42,7 @@ struct car_parking { boost::json::object geojson_properties(ways const& w) const { auto properties = boost::json::object{{"osm_node_id", to_idx(w.node_to_osm_[n_])}, - {"level", to_float(lvl_)}, + {"level", lvl_.to_float()}, {"type", node_type_to_str(type_)}}; if (is_car_node()) { properties.emplace("direction", to_str(dir_)); @@ -52,7 +52,7 @@ struct car_parking { std::ostream& print(std::ostream& out, ways const& w) const { return out << "(node=" << w.node_to_osm_[n_] - << ", level=" << to_float(lvl_) << ", dir=" << to_str(dir_) + << ", level=" << lvl_.to_float() << ", dir=" << to_str(dir_) << ", way=" << w.way_osm_idx_[w.r_->node_ways_[n_][way_]] << ", type=" << node_type_to_str(type_) << ")"; } diff --git a/include/osr/routing/profiles/foot.h b/include/osr/routing/profiles/foot.h index a05bfa7..7074a45 100644 --- a/include/osr/routing/profiles/foot.h +++ b/include/osr/routing/profiles/foot.h @@ -28,8 +28,7 @@ struct foot { static constexpr mode get_mode() noexcept { return mode::kFoot; } std::ostream& print(std::ostream& out, ways const& w) const { - return out << "(node=" << w.node_to_osm_[n_] - << ", level=" << to_float(lvl_) << ")"; + return out << "(node=" << w.node_to_osm_[n_] << ", level=" << lvl_ << ")"; } node_idx_t n_; @@ -107,9 +106,9 @@ struct foot { if (lvl == kNoLevel || (p.from_level() == lvl || p.to_level() == lvl || can_use_elevator(w, n, lvl)) || - (lvl == to_level(0.F) && + (lvl == level_t{0.F} && (p.from_level() == kNoLevel && p.to_level() == kNoLevel))) { - f(node{n, lvl == kNoLevel ? p.from_level() : lvl}); + f(node{n, p.from_level()}); } } @@ -243,7 +242,7 @@ struct foot { return way_prop.from_level(); } else if (way_prop.from_level() == from_level || way_prop.from_level() == kNoLevel || from_level == kNoLevel) { - return from_level; + return way_prop.from_level(); } else { return std::nullopt; } @@ -263,8 +262,9 @@ struct foot { Fn&& f) { auto const p = w.node_properties_[n]; if (p.is_multi_level()) { - utl::for_each_set_bit(get_elevator_multi_levels(w, n), - [&](auto&& l) { f(level_t{l}); }); + utl::for_each_set_bit(get_elevator_multi_levels(w, n), [&](auto&& l) { + f(level_t{static_cast(l)}); + }); } else { f(p.from_level()); f(p.to_level()); diff --git a/include/osr/types.h b/include/osr/types.h index d2ad0b3..0085c4c 100644 --- a/include/osr/types.h +++ b/include/osr/types.h @@ -138,19 +138,26 @@ constexpr direction to_direction(std::string_view s) { } // level +constexpr auto const kMinLevel = -4.0F; +constexpr auto const kMaxLevel = 3.5F; + struct level_t { + static constexpr auto kNoLevel = 0U; + friend constexpr std::uint8_t to_idx(level_t l) { return l.v_; } friend std::ostream& operator<<(std::ostream& out, level_t const l) { - if (to_idx(l) == 0) { - return out << "-"; - } else { - return out << (-4.0 + ((to_idx(l) - 1U) / 4.0F)); - } + return (l.v_ == kNoLevel) ? (out << "-") : (out << l.to_float()); } - template - explicit constexpr level_t(X x) : v_{static_cast(x)} {} + explicit constexpr level_t(std::uint8_t const x) : v_{x} {} + + explicit constexpr level_t(float const f) + : v_{static_cast((f - kMinLevel) / 0.25F + 1U)} {} + + constexpr float to_float() const { + return (v_ == kNoLevel) ? 0.0F : (kMinLevel + ((v_ - 1U) / 4.0F)); + } constexpr level_t() = default; @@ -161,20 +168,10 @@ struct level_t { std::uint8_t v_; }; -constexpr auto const kNoLevel = level_t{0U}; -constexpr auto const kMinLevel = -4.0F; -constexpr auto const kMaxLevel = 3.5F; - -constexpr level_t to_level(float const f) { - return level_t{static_cast((f - kMinLevel) / 0.25F + 1U)}; -} - -constexpr float to_float(level_t const l) { - return (l == kNoLevel) ? 0.0F : (kMinLevel + ((to_idx(l) - 1U) / 4.0F)); -} +constexpr auto const kNoLevel = level_t{std::uint8_t{0U}}; constexpr auto const kLevelBits = cista::constexpr_trailing_zeros( - cista::next_power_of_two(to_idx(to_level(kMaxLevel)) + 1U)); + cista::next_power_of_two(to_idx(level_t{kMaxLevel}) + 1U)); using level_bits_t = std::uint32_t; @@ -186,8 +183,8 @@ constexpr std::tuple get_levels( auto from = kNoLevel, to = kNoLevel; utl::for_each_set_bit(levels, [&](auto&& bit) { from == kNoLevel // - ? from = level_t{bit} - : to = level_t{bit}; + ? from = level_t{static_cast(bit)} + : to = level_t{static_cast(bit)}; }); return {from, to == kNoLevel ? from : to, std::popcount(levels) > 2}; } diff --git a/src/route.cc b/src/route.cc index f893238..9ea7769 100644 --- a/src/route.cc +++ b/src/route.cc @@ -133,8 +133,8 @@ double add_path(ways const& w, } } } else { - segment.from_level_ = to_level(0); - segment.to_level_ = to_level(0); + segment.from_level_ = level_t{0.0F}; + segment.to_level_ = level_t{0.0F}; segment.from_ = from.get_node(); segment.to_ = to.get_node(); // polyline has to be filled by the caller, because we don't know diff --git a/test/level_test.cc b/test/level_test.cc index b7807e4..db25aad 100644 --- a/test/level_test.cc +++ b/test/level_test.cc @@ -9,12 +9,15 @@ using namespace osr; TEST(osr, level) { - auto const lvl_0 = to_float(to_level(0.1F)); + auto const lvl_0 = level_t{0.1F}.to_float(); EXPECT_EQ(0.0F, lvl_0); - auto const lvl_4 = to_float(to_level(4.0F)); + auto const lvl_neg4 = level_t{-4.0F}.to_float(); + EXPECT_EQ(-4.0F, lvl_neg4); + + auto const lvl_4 = level_t{4.0F}.to_float(); EXPECT_EQ(4.0F, lvl_4); - auto const lvl_minus_3 = to_float(to_level(-3.0F)); + auto const lvl_minus_3 = level_t{-3.0F}.to_float(); EXPECT_EQ(-3.0F, lvl_minus_3); } \ No newline at end of file diff --git a/test/lvl_wildcard_test.cc b/test/lvl_wildcard_test.cc new file mode 100644 index 0000000..db87d63 --- /dev/null +++ b/test/lvl_wildcard_test.cc @@ -0,0 +1,90 @@ +#ifdef _WIN32 +#include "windows.h" +#endif + +#include "gtest/gtest.h" + +#include + +#include "boost/json.hpp" + +#include "utl/pipes.h" + +#include "fmt/core.h" +#include "fmt/ranges.h" + +#include "osr/extract/extract.h" +#include "osr/geojson.h" +#include "osr/lookup.h" +#include "osr/routing/route.h" +#include "osr/ways.h" + +namespace json = boost::json; +namespace fs = std::filesystem; +using namespace osr; + +TEST(routing, no_lvl_wildcard) { + constexpr auto const kTestFolder = "/tmp/osr_stuttgart"; + + auto ec = std::error_code{}; + fs::remove_all(kTestFolder, ec); + fs::create_directories(kTestFolder, ec); + + extract(false, "test/stuttgart.osm.pbf", kTestFolder); + + auto w = osr::ways{kTestFolder, cista::mmap::protection::READ}; + auto l = osr::lookup{w}; + + auto const p = route(w, l, search_profile::kFoot, // + {{48.7829, 9.18212}, level_t{0.F}}, + {{48.7847, 9.18337}, level_t{1.F}}, // + 3600, direction::kForward, 100); + + ASSERT_TRUE(p.has_value()); + + auto const path = json::serialize(json::object{ + {"type", "FeatureCollection"}, + {"metadata", {{"duration", p->cost_}, {"distance", p->dist_}}}, + {"features", + utl::all(p->segments_) | utl::transform([&](const path::segment& s) { + return json::object{ + {"type", "Feature"}, + { + "properties", + {{"level", s.from_level_.to_float()}, + {"osm_way_id", s.way_ == way_idx_t::invalid() + ? 0U + : to_idx(w.way_osm_idx_[s.way_])}, + {"cost", s.cost_}, + {"distance", s.dist_}}, + }, + {"geometry", to_line_string(s.polyline_)}}; + }) | utl::emplace_back_to()}}); + EXPECT_EQ( + "{\"type\":\"FeatureCollection\",\"metadata\":{\"duration\":385," + "\"distance\":4.2683610950337305E2},\"features\":[{\"type\":\"Feature\"," + "\"properties\":{\"level\":0E0,\"osm_way_id\":0,\"cost\":32,\"distance\":" + "36},\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[9.18212E0,4." + "87829E1],[9.1824098E0,4.87829011E1],[9.1825297E0,4.87829369E1],[9." + "1826092E0,4.87829279E1]]}},{\"type\":\"Feature\",\"properties\":{" + "\"level\":1E0,\"osm_way_id\":1016875485,\"cost\":308,\"distance\":339}," + "\"geometry\":{\"type\":\"LineString\",\"coordinates\":[[9.1826092E0,4." + "87829279E1],[9.1827967E0,4.87828835E1],[9.1830696E0,4.87828214E1],[9." + "1836147E0,4.87829191E1],[9.1844751E0,4.87833829E1],[9.1845214E0,4." + "87834284E1],[9.1845395E0,4.87835258E1],[9.1845748E0,4.87835747E1],[9." + "1846319E0,4.8783605E1],[9.1846862E0,4.87836279E1],[9.1847208E0,4." + "8783654E1],[9.1847473E0,4.8783684E1],[9.1847559E0,4.87837162E1],[9." + "1847516E0,4.8783756E1],[9.1846579E0,4.87840841E1],[9.1846341E0,4." + "8784113E1],[9.1845471E0,4.87841486E1],[9.1844849E0,4.87841546E1],[9." + "1841289E0,4.87841629E1],[9.1840357E0,4.87841863E1],[9.1838475E0,4." + "87842531E1],[9.1835E0,4.8784369E1],[9.1835041E0,4.87843773E1]]}},{" + "\"type\":\"Feature\",\"properties\":{\"level\":1E0,\"osm_way_id\":" + "713810685,\"cost\":4,\"distance\":4},\"geometry\":{\"type\":" + "\"LineString\",\"coordinates\":[[9.1835041E0,4.87843773E1],[9.1835086E0," + "4.87844171E1]]}},{\"type\":\"Feature\",\"properties\":{\"level\":1E0," + "\"osm_way_id\":0,\"cost\":41,\"distance\":47},\"geometry\":{\"type\":" + "\"LineString\",\"coordinates\":[[9.1835086E0,4.87844171E1],[9.1834509E0," + "4.87844364E1],[9.1832201E0,4.87845268E1],[9.183214598396768E0,4." + "8784528970208854E1],[9.18337E0,4.87847E1]]}}]}", + path); +} \ No newline at end of file diff --git a/test/stuttgart.osm.pbf b/test/stuttgart.osm.pbf new file mode 100644 index 0000000000000000000000000000000000000000..8a2350da6ee6f3b38069b2da8a92c31e26b6e0ca GIT binary patch literal 40871 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 Open Street Router - + - + -
- -
-
- - -
- - - -
-
-
+G +
+ + +
+ Test
-
- - - -
-
+