diff options
-rw-r--r-- | generator/road_access_generator.cpp | 3 | ||||
-rw-r--r-- | iphone/Maps/Core/Routing/MWMCoreRouterType.h | 1 | ||||
-rw-r--r-- | map/mwm_url.cpp | 4 | ||||
-rw-r--r-- | map/routing_manager.cpp | 8 | ||||
-rw-r--r-- | platform/marketing_service.cpp | 2 | ||||
-rw-r--r-- | platform/marketing_service.hpp | 2 | ||||
-rw-r--r-- | qt/search_panel.cpp | 2 | ||||
-rw-r--r-- | routing/edge_estimator.cpp | 3 | ||||
-rw-r--r-- | routing/index_router.cpp | 24 | ||||
-rw-r--r-- | routing/road_access_serialization.cpp | 2 | ||||
-rw-r--r-- | routing/road_access_serialization.hpp | 26 | ||||
-rw-r--r-- | routing/router.cpp | 3 | ||||
-rw-r--r-- | routing/router.hpp | 1 | ||||
-rw-r--r-- | routing/routing_settings.cpp | 1 | ||||
-rw-r--r-- | routing/vehicle_mask.cpp | 3 | ||||
-rw-r--r-- | routing/vehicle_mask.hpp | 5 | ||||
-rw-r--r-- | routing_common/CMakeLists.txt | 1 | ||||
-rw-r--r-- | routing_common/routing_common.pro | 1 | ||||
-rw-r--r-- | routing_common/transit_max_speed.hpp | 6 | ||||
-rw-r--r-- | xcode/routing_common/routing_common.xcodeproj/project.pbxproj | 4 |
20 files changed, 86 insertions, 16 deletions
diff --git a/generator/road_access_generator.cpp b/generator/road_access_generator.cpp index 41b59dc8b4..235eea6209 100644 --- a/generator/road_access_generator.cpp +++ b/generator/road_access_generator.cpp @@ -35,6 +35,8 @@ char constexpr kDelim[] = " \t\r\n"; using TagMapping = routing::RoadAccessTagProcessor::TagMapping; +TagMapping const kEmptyTagMapping = {}; + TagMapping const kCarTagMapping = { {OsmElement::Tag("access", "no"), RoadAccess::Type::No}, {OsmElement::Tag("vehicle", "no"), RoadAccess::Type::No}, @@ -144,6 +146,7 @@ RoadAccessTagProcessor::RoadAccessTagProcessor(VehicleType vehicleType) case VehicleType::Car: m_tagMapping = &kCarTagMapping; break; case VehicleType::Pedestrian: m_tagMapping = &kPedestrianTagMapping; break; case VehicleType::Bicycle: m_tagMapping = &kBicycleTagMapping; break; + case VehicleType::Transit: m_tagMapping = &kEmptyTagMapping; break; case VehicleType::Count: CHECK(false, ("Bad vehicle type")); break; } } diff --git a/iphone/Maps/Core/Routing/MWMCoreRouterType.h b/iphone/Maps/Core/Routing/MWMCoreRouterType.h index b9690f9368..812d0170b4 100644 --- a/iphone/Maps/Core/Routing/MWMCoreRouterType.h +++ b/iphone/Maps/Core/Routing/MWMCoreRouterType.h @@ -18,6 +18,7 @@ static inline MWMRouterType routerType(routing::RouterType type) switch (type) { case routing::RouterType::Vehicle: return MWMRouterTypeVehicle; + case routing::RouterType::Transit: // TODO: AddTransitType case routing::RouterType::Pedestrian: return MWMRouterTypePedestrian; case routing::RouterType::Bicycle: return MWMRouterTypeBicycle; case routing::RouterType::Taxi: return MWMRouterTypeTaxi; diff --git a/map/mwm_url.cpp b/map/mwm_url.cpp index 6c12ca29e2..2c3291dc1f 100644 --- a/map/mwm_url.cpp +++ b/map/mwm_url.cpp @@ -85,6 +85,7 @@ char const * kRouteType = "type"; char const * kRouteTypeVehicle = "vehicle"; char const * kRouteTypePedestrian = "pedestrian"; char const * kRouteTypeBicycle = "bicycle"; +char const * kRouteTypeTransit = "transit"; } // namespace route namespace search @@ -285,7 +286,8 @@ bool ParsedMapApi::RouteKeyValue(string const & key, string const & value, vecto else if (key == kRouteType) { string const lowerValue = strings::MakeLowerCase(value); - if (lowerValue == kRouteTypePedestrian || lowerValue == kRouteTypeVehicle || lowerValue == kRouteTypeBicycle) + if (lowerValue == kRouteTypePedestrian || lowerValue == kRouteTypeVehicle || + lowerValue == kRouteTypeBicycle || lowerValue == kRouteTypeTransit) { m_routingType = lowerValue; } diff --git a/map/routing_manager.cpp b/map/routing_manager.cpp index 41f1ad2104..914b1346ad 100644 --- a/map/routing_manager.cpp +++ b/map/routing_manager.cpp @@ -209,6 +209,7 @@ VehicleType GetVehicleType(RouterType routerType) case RouterType::Bicycle: return VehicleType::Bicycle; case RouterType::Vehicle: case RouterType::Taxi: return VehicleType::Car; + case RouterType::Transit: return VehicleType::Transit; case RouterType::Count: CHECK(false, ("Invalid type", routerType)); return VehicleType::Count; } } @@ -348,7 +349,8 @@ RouterType RoutingManager::GetLastUsedRouter() const switch (routerType) { case RouterType::Pedestrian: - case RouterType::Bicycle: return routerType; + case RouterType::Bicycle: + case RouterType::Transit: return routerType; default: return RouterType::Vehicle; } } @@ -469,6 +471,7 @@ void RoutingManager::InsertRoute(Route const & route) subroute->m_turns); break; case RouterType::Pedestrian: + case RouterType::Transit: // TODO: AddTransitType subroute->m_routeType = df::RouteType::Pedestrian; subroute->m_color = df::kRoutePedestrian; subroute->m_pattern = df::RoutePattern(4.0, 2.0); @@ -791,6 +794,9 @@ void RoutingManager::BuildRoute(uint32_t timeoutSec) case RouterType::Taxi: tag = isP2P ? marketing::kRoutingP2PTaxiDiscovered : marketing::kRoutingTaxiDiscovered; break; + case RouterType::Transit: + tag = isP2P ? marketing::kRoutingP2PTransitDiscovered : marketing::kRoutingTransitDiscovered; + break; case RouterType::Count: CHECK(false, ("Bad router type", m_currentRouterType)); } GetPlatform().GetMarketingService().SendPushWooshTag(tag); diff --git a/platform/marketing_service.cpp b/platform/marketing_service.cpp index 01726f2e82..5b02fa75ea 100644 --- a/platform/marketing_service.cpp +++ b/platform/marketing_service.cpp @@ -13,10 +13,12 @@ char const * const kRoutingP2PVehicleDiscovered = "routing_p2p_vehicle_discovere char const * const kRoutingP2PPedestrianDiscovered = "routing_p2p_pedestrian_discovered"; char const * const kRoutingP2PBicycleDiscovered = "routing_p2p_bicycle_discovered"; char const * const kRoutingP2PTaxiDiscovered = "routing_p2p_taxi_discovered"; +char const * const kRoutingP2PTransitDiscovered = "routing_p2p_transit_discovered"; char const * const kRoutingVehicleDiscovered = "routing_vehicle_discovered"; char const * const kRoutingPedestrianDiscovered = "routing_pedestrian_discovered"; char const * const kRoutingBicycleDiscovered = "routing_bicycle_discovered"; char const * const kRoutingTaxiDiscovered = "routing_taxi_discovered"; +char const * const kRoutingTransitDiscovered = "routing_transit_discovered"; char const * const kEditorAddDiscovered = "editor_add_discovered"; char const * const kEditorEditDiscovered = "editor_edit_discovered"; char const * const kTrafficDiscovered = "traffic_discovered"; diff --git a/platform/marketing_service.hpp b/platform/marketing_service.hpp index 3b5bf40374..bac4604c80 100644 --- a/platform/marketing_service.hpp +++ b/platform/marketing_service.hpp @@ -18,10 +18,12 @@ extern char const * const kRoutingP2PVehicleDiscovered; extern char const * const kRoutingP2PPedestrianDiscovered; extern char const * const kRoutingP2PBicycleDiscovered; extern char const * const kRoutingP2PTaxiDiscovered; +extern char const * const kRoutingP2PTransitDiscovered; extern char const * const kRoutingVehicleDiscovered; extern char const * const kRoutingPedestrianDiscovered; extern char const * const kRoutingBicycleDiscovered; extern char const * const kRoutingTaxiDiscovered; +extern char const * const kRoutingTransitDiscovered; extern char const * const kEditorAddDiscovered; extern char const * const kEditorEditDiscovered; extern char const * const kTrafficDiscovered; diff --git a/qt/search_panel.cpp b/qt/search_panel.cpp index 52111c8573..d3633cadc7 100644 --- a/qt/search_panel.cpp +++ b/qt/search_panel.cpp @@ -140,6 +140,8 @@ bool SearchPanel::TryChangeRouterCmd(QString const & str) routerType = routing::RouterType::Vehicle; else if (str == "?bicycle") routerType = routing::RouterType::Bicycle; + else if (str == "?transit") + routerType = routing::RouterType::Transit; else return false; diff --git a/routing/edge_estimator.cpp b/routing/edge_estimator.cpp index 59377afb6c..d8cf56c319 100644 --- a/routing/edge_estimator.cpp +++ b/routing/edge_estimator.cpp @@ -190,7 +190,8 @@ shared_ptr<EdgeEstimator> EdgeEstimator::Create(VehicleType vehicleType, double { switch (vehicleType) { - case VehicleType::Pedestrian: return make_shared<PedestrianEstimator>(maxSpeedKMpH); + case VehicleType::Pedestrian: + case VehicleType::Transit: return make_shared<PedestrianEstimator>(maxSpeedKMpH); case VehicleType::Bicycle: return make_shared<BicycleEstimator>(maxSpeedKMpH); case VehicleType::Car: return make_shared<CarEstimator>(trafficStash, maxSpeedKMpH); case VehicleType::Count: diff --git a/routing/index_router.cpp b/routing/index_router.cpp index 87d2895504..9223f2b423 100644 --- a/routing/index_router.cpp +++ b/routing/index_router.cpp @@ -21,6 +21,7 @@ #include "routing_common/bicycle_model.hpp" #include "routing_common/car_model.hpp" #include "routing_common/pedestrian_model.hpp" +#include "routing_common/transit_max_speed.hpp" #include "indexer/feature_altitude.hpp" @@ -53,8 +54,13 @@ double constexpr kMinDistanceToFinishM = 10000; // Limit of adjust in seconds. double constexpr kAdjustLimitSec = 5 * 60; -double CalcMaxSpeed(NumMwmIds const & numMwmIds, VehicleModelFactoryInterface const & vehicleModelFactory) +double CalcMaxSpeed(NumMwmIds const & numMwmIds, + VehicleModelFactoryInterface const & vehicleModelFactory, + VehicleType vehicleType) { + if (vehicleType == VehicleType::Transit) + return kTransitMaxSpeedKMpH; + double maxSpeed = 0.0; numMwmIds.ForEachId([&](NumMwmId id) { string const & country = numMwmIds.GetFile(id).GetName(); @@ -72,6 +78,7 @@ shared_ptr<VehicleModelFactoryInterface> CreateVehicleModelFactory( switch (vehicleType) { case VehicleType::Pedestrian: + case VehicleType::Transit: return make_shared<PedestrianModelFactory>(countryParentNameGetterFn); case VehicleType::Bicycle: return make_shared<BicycleModelFactory>(countryParentNameGetterFn); case VehicleType::Car: return make_shared<CarModelFactory>(countryParentNameGetterFn); @@ -86,7 +93,8 @@ unique_ptr<IDirectionsEngine> CreateDirectionsEngine(VehicleType vehicleType, { switch (vehicleType) { - case VehicleType::Pedestrian: return make_unique<PedestrianDirectionsEngine>(numMwmIds); + case VehicleType::Pedestrian: + case VehicleType::Transit: return make_unique<PedestrianDirectionsEngine>(numMwmIds); case VehicleType::Bicycle: // @TODO Bicycle turn generation engine is used now. It's ok for the time being. // But later a special car turn generation engine should be implemented. @@ -289,11 +297,13 @@ IndexRouter::IndexRouter(VehicleType vehicleType, bool loadAltitudes, , m_trafficStash(CreateTrafficStash(m_vehicleType, m_numMwmIds, trafficCache)) , m_indexManager(countryFileFn, m_index) , m_roadGraph(m_index, - vehicleType == VehicleType::Pedestrian ? IRoadGraph::Mode::IgnoreOnewayTag - : IRoadGraph::Mode::ObeyOnewayTag, + vehicleType == VehicleType::Pedestrian || vehicleType == VehicleType::Transit + ? IRoadGraph::Mode::IgnoreOnewayTag + : IRoadGraph::Mode::ObeyOnewayTag, m_vehicleModelFactory) , m_estimator(EdgeEstimator::Create( - m_vehicleType, CalcMaxSpeed(*m_numMwmIds, *m_vehicleModelFactory), m_trafficStash)) + m_vehicleType, CalcMaxSpeed(*m_numMwmIds, *m_vehicleModelFactory, m_vehicleType), + m_trafficStash)) , m_directionsEngine(CreateDirectionsEngine(m_vehicleType, m_numMwmIds, m_index)) { CHECK(!m_name.empty(), ()); @@ -487,12 +497,16 @@ IRouter::ResultCode IndexRouter::CalculateSubroute(Checkpoints const & checkpoin { case VehicleType::Pedestrian: case VehicleType::Bicycle: + case VehicleType::Transit: starter.GetGraph().SetMode(WorldGraph::Mode::NoLeaps); break; case VehicleType::Car: starter.GetGraph().SetMode(AreMwmsNear(starter.GetMwms()) ? WorldGraph::Mode::LeapsIfPossible : WorldGraph::Mode::LeapsOnly); break; + case VehicleType::Count: + CHECK(false, ("Unknown vehicle type:", m_vehicleType)); + break; } LOG(LINFO, ("Routing in mode:", starter.GetGraph().GetMode())); diff --git a/routing/road_access_serialization.cpp b/routing/road_access_serialization.cpp index acdd59f22d..fcdeeb4c8d 100644 --- a/routing/road_access_serialization.cpp +++ b/routing/road_access_serialization.cpp @@ -3,5 +3,5 @@ namespace routing { // static -uint32_t const RoadAccessSerializer::kLatestVersion = 0; +uint32_t const RoadAccessSerializer::kLatestVersion = 1; } // namespace routing diff --git a/routing/road_access_serialization.hpp b/routing/road_access_serialization.hpp index ad3d26a251..856479ba1f 100644 --- a/routing/road_access_serialization.hpp +++ b/routing/road_access_serialization.hpp @@ -61,16 +61,30 @@ public: template <class Source> static void Deserialize(Source & src, VehicleType vehicleType, RoadAccess & roadAccess) { + auto const subsectionNumberToVehicleType = [](uint32_t version, size_t subsection) + { + if (version == 0) + { + switch (subsection) + { + case 0: return VehicleType::Pedestrian; + case 1: return VehicleType::Bicycle; + case 2: return VehicleType::Car; + default: return VehicleType::Count; + } + } + return static_cast<VehicleType>(subsection); + }; + uint32_t const header = ReadPrimitiveFromSource<uint32_t>(src); - CHECK_EQUAL(header, kLatestVersion, ()); - std::array<uint32_t, static_cast<size_t>(VehicleType::Count)> sectionSizes; - for (size_t i = 0; i < sectionSizes.size(); ++i) - sectionSizes[i] = ReadPrimitiveFromSource<uint32_t>(src); + std::vector<uint32_t> sectionSizes; + for (size_t i = 0; subsectionNumberToVehicleType(header, i) < VehicleType::Count; ++i) + sectionSizes.push_back(ReadPrimitiveFromSource<uint32_t>(src)); - for (size_t i = 0; i < static_cast<size_t>(VehicleType::Count); ++i) + for (size_t i = 0; subsectionNumberToVehicleType(header, i) < VehicleType::Count; ++i) { - if (vehicleType != static_cast<VehicleType>(i)) + if (vehicleType != subsectionNumberToVehicleType(header, i)) { src.Skip(sectionSizes[i]); continue; diff --git a/routing/router.cpp b/routing/router.cpp index ba6303a027..4135cfc84f 100644 --- a/routing/router.cpp +++ b/routing/router.cpp @@ -10,6 +10,7 @@ std::string ToString(RouterType type) case RouterType::Pedestrian: return "pedestrian"; case RouterType::Bicycle: return "bicycle"; case RouterType::Taxi: return "taxi"; + case RouterType::Transit: return "transit"; case RouterType::Count: return "count"; } ASSERT(false, ()); @@ -26,6 +27,8 @@ RouterType FromString(std::string const & str) return RouterType::Bicycle; if (str == "taxi") return RouterType::Taxi; + if (str == "transit") + return RouterType::Transit; ASSERT(false, ("Incorrect routing string:", str)); return RouterType::Vehicle; diff --git a/routing/router.hpp b/routing/router.hpp index d1a30670ee..ebd24a5e92 100644 --- a/routing/router.hpp +++ b/routing/router.hpp @@ -29,6 +29,7 @@ enum class RouterType Pedestrian, /// For A star pedestrian routing. Bicycle, /// For A star bicycle routing. Taxi, /// For taxi route calculation Vehicle routing is used. + Transit, /// For A star pedestrian + transit routing. Count /// Number of router types. }; diff --git a/routing/routing_settings.cpp b/routing/routing_settings.cpp index b166154eeb..c52e35c77a 100644 --- a/routing/routing_settings.cpp +++ b/routing/routing_settings.cpp @@ -7,6 +7,7 @@ RoutingSettings GetRoutingSettings(VehicleType vehicleType) switch (vehicleType) { case VehicleType::Pedestrian: + case VehicleType::Transit: return {true /* m_matchRoute */, false /* m_soundDirection */, 20. /* m_matchingThresholdM */, true /* m_keepPedestrianInfo */, false /* m_showTurnAfterNext */, false /* m_speedCameraWarning*/}; diff --git a/routing/vehicle_mask.cpp b/routing/vehicle_mask.cpp index b529b24329..bf9a60cff1 100644 --- a/routing/vehicle_mask.cpp +++ b/routing/vehicle_mask.cpp @@ -16,6 +16,7 @@ string DebugPrint(VehicleType vehicleType) case VehicleType::Pedestrian: return "Pedestrian"; case VehicleType::Bicycle: return "Bicycle"; case VehicleType::Car: return "Car"; + case VehicleType::Transit: return "Transit"; case VehicleType::Count: return "Count"; } } @@ -30,6 +31,8 @@ void FromString(string const & s, VehicleType & vehicleType) vehicleType = VehicleType::Bicycle; else if (s == "Car") vehicleType = VehicleType::Car; + else if (s == "Transit") + vehicleType = VehicleType::Transit; else { ASSERT(false, ("Could not read VehicleType from string", s)); diff --git a/routing/vehicle_mask.hpp b/routing/vehicle_mask.hpp index 3b8277a18d..11046157fa 100644 --- a/routing/vehicle_mask.hpp +++ b/routing/vehicle_mask.hpp @@ -5,12 +5,15 @@ namespace routing { +// Declaration order matters. There are sections in mwm with the same order +// of subsections. New vehicle types should be added after existent types. enum class VehicleType { Pedestrian = 0, Bicycle = 1, Car = 2, - Count = 3 + Transit = 3, + Count = 4 }; using VehicleMask = uint32_t; diff --git a/routing_common/CMakeLists.txt b/routing_common/CMakeLists.txt index e1c15d6259..4858cbaf13 100644 --- a/routing_common/CMakeLists.txt +++ b/routing_common/CMakeLists.txt @@ -8,6 +8,7 @@ set( car_model.hpp pedestrian_model.cpp pedestrian_model.hpp + transit_max_speed.hpp vehicle_model.cpp vehicle_model.hpp ) diff --git a/routing_common/routing_common.pro b/routing_common/routing_common.pro index 450f01cb42..51ad9161d2 100644 --- a/routing_common/routing_common.pro +++ b/routing_common/routing_common.pro @@ -23,4 +23,5 @@ HEADERS += \ bicycle_model.hpp \ car_model.hpp \ pedestrian_model.hpp \ + transit_max_speed.hpp \ vehicle_model.hpp \ diff --git a/routing_common/transit_max_speed.hpp b/routing_common/transit_max_speed.hpp new file mode 100644 index 0000000000..53319a6004 --- /dev/null +++ b/routing_common/transit_max_speed.hpp @@ -0,0 +1,6 @@ +#pragma once + +namespace routing +{ +double constexpr kTransitMaxSpeedKMpH = 400; +} // namespace routing diff --git a/xcode/routing_common/routing_common.xcodeproj/project.pbxproj b/xcode/routing_common/routing_common.xcodeproj/project.pbxproj index 17da24f5dd..649ca207cf 100644 --- a/xcode/routing_common/routing_common.xcodeproj/project.pbxproj +++ b/xcode/routing_common/routing_common.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 40576F7A1F7AA1B4000B593B /* transit_max_speed.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 40576F791F7AA1B4000B593B /* transit_max_speed.hpp */; }; 40FF45D01F388EF80046BD40 /* vehicle_model_for_country_test.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 40FF45CF1F388EF80046BD40 /* vehicle_model_for_country_test.cpp */; }; 671E78881E6A3C5D00B2859B /* bicycle_model.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 671E78801E6A3C5D00B2859B /* bicycle_model.cpp */; }; 671E78891E6A3C5D00B2859B /* bicycle_model.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 671E78811E6A3C5D00B2859B /* bicycle_model.hpp */; }; @@ -35,6 +36,7 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 40576F791F7AA1B4000B593B /* transit_max_speed.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = transit_max_speed.hpp; sourceTree = "<group>"; }; 40FF45CF1F388EF80046BD40 /* vehicle_model_for_country_test.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vehicle_model_for_country_test.cpp; sourceTree = "<group>"; }; 671E78721E6A3BE200B2859B /* librouting_common.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = librouting_common.a; sourceTree = BUILT_PRODUCTS_DIR; }; 671E78801E6A3C5D00B2859B /* bicycle_model.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = bicycle_model.cpp; sourceTree = "<group>"; }; @@ -128,6 +130,7 @@ 671E78831E6A3C5D00B2859B /* car_model.hpp */, 671E78841E6A3C5D00B2859B /* pedestrian_model.cpp */, 671E78851E6A3C5D00B2859B /* pedestrian_model.hpp */, + 40576F791F7AA1B4000B593B /* transit_max_speed.hpp */, 671E78861E6A3C5D00B2859B /* vehicle_model.cpp */, 671E78871E6A3C5D00B2859B /* vehicle_model.hpp */, ); @@ -176,6 +179,7 @@ files = ( 671E788D1E6A3C5D00B2859B /* pedestrian_model.hpp in Headers */, 671E78891E6A3C5D00B2859B /* bicycle_model.hpp in Headers */, + 40576F7A1F7AA1B4000B593B /* transit_max_speed.hpp in Headers */, 671E788B1E6A3C5D00B2859B /* car_model.hpp in Headers */, 671E788F1E6A3C5D00B2859B /* vehicle_model.hpp in Headers */, ); |