void RoutingListModel::setStartAndTarget(Location* start, Location* target) { beginResetModel(); route.routeSteps.clear(); std::cout << "Routing from '" << start->getName().toLocal8Bit().data() << "' to '" << target->getName().toLocal8Bit().data() << "'" << std::endl; osmscout::TypeConfigRef typeConfig=DBThread::GetInstance()->GetTypeConfig(); osmscout::FastestPathRoutingProfile routingProfile(typeConfig); osmscout::Way routeWay; osmscout::Vehicle vehicle=osmscout::vehicleCar;//settings->GetRoutingVehicle(); if (vehicle==osmscout::vehicleFoot) { routingProfile.ParametrizeForFoot(*typeConfig, 5.0); } else if (vehicle==osmscout::vehicleBicycle) { routingProfile.ParametrizeForBicycle(*typeConfig, 20.0); } else /* car */ { std::map<std::string,double> speedMap; GetCarSpeedTable(speedMap); routingProfile.ParametrizeForCar(*typeConfig, speedMap, 160.0); } osmscout::ObjectFileRef startObject; size_t startNodeIndex; osmscout::ObjectFileRef targetObject; size_t targetNodeIndex; if (!DBThread::GetInstance()->GetClosestRoutableNode(start->getReferences().front(), vehicle, 1000, startObject, startNodeIndex)) { std::cerr << "There was an error while routing!" << std::endl; } if (!startObject.Valid()) { std::cerr << "Cannot find a routing node close to the start location" << std::endl; } if (!DBThread::GetInstance()->GetClosestRoutableNode(target->getReferences().front(), vehicle, 1000, targetObject, targetNodeIndex)) { std::cerr << "There was an error while routing!" << std::endl; } if (!targetObject.Valid()) { std::cerr << "Cannot find a routing node close to the target location" << std::endl; } if (!DBThread::GetInstance()->CalculateRoute(vehicle, routingProfile, startObject, startNodeIndex, targetObject, targetNodeIndex, route.routeData)) { std::cerr << "There was an error while routing!" << std::endl; return; } std::cout << "Route calculated" << std::endl; DBThread::GetInstance()->TransformRouteDataToRouteDescription(vehicle, routingProfile, route.routeData, route.routeDescription, start->getName().toUtf8().constData(), target->getName().toUtf8().constData()); std::cout << "Route transformed" << std::endl; size_t roundaboutCrossingCounter=0; int lastStepIndex=-1; std::list<osmscout::RouteDescription::Node>::const_iterator prevNode=route.routeDescription.Nodes().end(); for (std::list<osmscout::RouteDescription::Node>::const_iterator node=route.routeDescription.Nodes().begin(); node!=route.routeDescription.Nodes().end(); ++node) { osmscout::RouteDescription::DescriptionRef desc; osmscout::RouteDescription::NameDescriptionRef nameDescription; osmscout::RouteDescription::DirectionDescriptionRef directionDescription; osmscout::RouteDescription::NameChangedDescriptionRef nameChangedDescription; osmscout::RouteDescription::CrossingWaysDescriptionRef crossingWaysDescription; osmscout::RouteDescription::StartDescriptionRef startDescription; osmscout::RouteDescription::TargetDescriptionRef targetDescription; osmscout::RouteDescription::TurnDescriptionRef turnDescription; osmscout::RouteDescription::RoundaboutEnterDescriptionRef roundaboutEnterDescription; osmscout::RouteDescription::RoundaboutLeaveDescriptionRef roundaboutLeaveDescription; osmscout::RouteDescription::MotorwayEnterDescriptionRef motorwayEnterDescription; osmscout::RouteDescription::MotorwayChangeDescriptionRef motorwayChangeDescription; osmscout::RouteDescription::MotorwayLeaveDescriptionRef motorwayLeaveDescription; desc=node->GetDescription(osmscout::RouteDescription::WAY_NAME_DESC); if (desc.Valid()) { nameDescription=dynamic_cast<osmscout::RouteDescription::NameDescription*>(desc.Get()); } desc=node->GetDescription(osmscout::RouteDescription::DIRECTION_DESC); if (desc.Valid()) { directionDescription=dynamic_cast<osmscout::RouteDescription::DirectionDescription*>(desc.Get()); } desc=node->GetDescription(osmscout::RouteDescription::WAY_NAME_CHANGED_DESC); if (desc.Valid()) { nameChangedDescription=dynamic_cast<osmscout::RouteDescription::NameChangedDescription*>(desc.Get()); } desc=node->GetDescription(osmscout::RouteDescription::CROSSING_WAYS_DESC); if (desc.Valid()) { crossingWaysDescription=dynamic_cast<osmscout::RouteDescription::CrossingWaysDescription*>(desc.Get()); } desc=node->GetDescription(osmscout::RouteDescription::NODE_START_DESC); if (desc.Valid()) { startDescription=dynamic_cast<osmscout::RouteDescription::StartDescription*>(desc.Get()); } desc=node->GetDescription(osmscout::RouteDescription::NODE_TARGET_DESC); if (desc.Valid()) { targetDescription=dynamic_cast<osmscout::RouteDescription::TargetDescription*>(desc.Get()); } desc=node->GetDescription(osmscout::RouteDescription::TURN_DESC); if (desc.Valid()) { turnDescription=dynamic_cast<osmscout::RouteDescription::TurnDescription*>(desc.Get()); } desc=node->GetDescription(osmscout::RouteDescription::ROUNDABOUT_ENTER_DESC); if (desc.Valid()) { roundaboutEnterDescription=dynamic_cast<osmscout::RouteDescription::RoundaboutEnterDescription*>(desc.Get()); } desc=node->GetDescription(osmscout::RouteDescription::ROUNDABOUT_LEAVE_DESC); if (desc.Valid()) { roundaboutLeaveDescription=dynamic_cast<osmscout::RouteDescription::RoundaboutLeaveDescription*>(desc.Get()); } desc=node->GetDescription(osmscout::RouteDescription::MOTORWAY_ENTER_DESC); if (desc.Valid()) { motorwayEnterDescription=dynamic_cast<osmscout::RouteDescription::MotorwayEnterDescription*>(desc.Get()); } desc=node->GetDescription(osmscout::RouteDescription::MOTORWAY_CHANGE_DESC); if (desc.Valid()) { motorwayChangeDescription=dynamic_cast<osmscout::RouteDescription::MotorwayChangeDescription*>(desc.Get()); } desc=node->GetDescription(osmscout::RouteDescription::MOTORWAY_LEAVE_DESC); if (desc.Valid()) { motorwayLeaveDescription=dynamic_cast<osmscout::RouteDescription::MotorwayLeaveDescription*>(desc.Get()); } if (crossingWaysDescription.Valid() && roundaboutCrossingCounter>0 && crossingWaysDescription->GetExitCount()>1) { roundaboutCrossingCounter+=crossingWaysDescription->GetExitCount()-1; } if (startDescription.Valid()) { DumpStartDescription(startDescription, nameDescription); } else if (targetDescription.Valid()) { DumpTargetDescription(targetDescription); } else if (turnDescription.Valid()) { DumpTurnDescription(turnDescription, crossingWaysDescription, directionDescription, nameDescription); } else if (roundaboutEnterDescription.Valid()) { DumpRoundaboutEnterDescription(roundaboutEnterDescription, crossingWaysDescription); roundaboutCrossingCounter=1; } else if (roundaboutLeaveDescription.Valid()) { DumpRoundaboutLeaveDescription(roundaboutLeaveDescription, nameDescription); roundaboutCrossingCounter=0; } else if (motorwayEnterDescription.Valid()) { DumpMotorwayEnterDescription(motorwayEnterDescription, crossingWaysDescription); } else if (motorwayChangeDescription.Valid()) { DumpMotorwayChangeDescription(motorwayChangeDescription); } else if (motorwayLeaveDescription.Valid()) { DumpMotorwayLeaveDescription(motorwayLeaveDescription, directionDescription, nameDescription); } else if (nameChangedDescription.Valid()) { DumpNameChangedDescription(nameChangedDescription); } else { continue; } int currentStepIndex; if (lastStepIndex>=0) { currentStepIndex=lastStepIndex+1; } else { currentStepIndex=0; } if (currentStepIndex>=0) { route.routeSteps[currentStepIndex].distance=DistanceToString(node->GetDistance()); route.routeSteps[currentStepIndex].time=TimeToString(node->GetTime()); if (prevNode!=route.routeDescription.Nodes().end() && node->GetDistance()-prevNode->GetDistance()!=0.0) { route.routeSteps[currentStepIndex].distanceDelta=DistanceToString(node->GetDistance()-prevNode->GetDistance()); } if (prevNode!=route.routeDescription.Nodes().end() && node->GetTime()-prevNode->GetTime()!=0.0) { route.routeSteps[currentStepIndex].timeDelta=TimeToString(node->GetTime()-prevNode->GetTime()); } } lastStepIndex=route.routeSteps.size()-1; prevNode=node; } if (DBThread::GetInstance()->TransformRouteDataToWay(vehicle, route.routeData, routeWay)) { DBThread::GetInstance()->ClearRoute(); DBThread::GetInstance()->AddRoute(routeWay); } else { std::cerr << "Error while transforming route" << std::endl; } endResetModel(); }
int main(int argc, char* argv[]) { osmscout::Vehicle vehicle=osmscout::vehicleCar; osmscout::FastestPathRoutingProfile routingProfile; std::string map; double startLat; double startLon; double targetLat; double targetLon; osmscout::ObjectFileRef startObject; size_t startNodeIndex; osmscout::ObjectFileRef targetObject; size_t targetNodeIndex; bool outputGPX = false; int currentArg=1; while (currentArg<argc) { if (strcmp(argv[currentArg],"--foot")==0) { vehicle=osmscout::vehicleFoot; currentArg++; } else if (strcmp(argv[currentArg],"--bicycle")==0) { vehicle=osmscout::vehicleBicycle; currentArg++; } else if (strcmp(argv[currentArg],"--car")==0) { vehicle=osmscout::vehicleCar; currentArg++; } else if (strcmp(argv[currentArg],"--gpx")==0) { outputGPX=true; currentArg++; } else { // No more "special" arguments break; } } if (argc-currentArg!=5) { std::cout << "Routing <map directory>" <<std::endl; std::cout << " <start lat> <start lon>" << std::endl; std::cout << " <target lat> <target lon>" << std::endl; return 1; } map=argv[currentArg]; currentArg++; if (sscanf(argv[currentArg],"%lf",&startLat)!=1) { std::cerr << "lat is not numeric!" << std::endl; return 1; } currentArg++; if (sscanf(argv[currentArg],"%lf",&startLon)!=1) { std::cerr << "lon is not numeric!" << std::endl; return 1; } currentArg++; if (sscanf(argv[currentArg],"%lf",&targetLat)!=1) { std::cerr << "lat is not numeric!" << std::endl; return 1; } currentArg++; if (sscanf(argv[currentArg],"%lf",&targetLon)!=1) { std::cerr << "lon is not numeric!" << std::endl; return 1; } currentArg++; double tlat; double tlon; osmscout::GetEllipsoidalDistance(startLat, startLon, 45, 1000, tlat, tlon); if (!outputGPX) { std::cout << "[" << startLat << "," << startLon << "] => [" << tlat << "," << tlon << "]" << std::endl; } osmscout::DatabaseParameter databaseParameter; osmscout::Database database(databaseParameter); if (!database.Open(map.c_str())) { std::cerr << "Cannot open database" << std::endl; return 1; } osmscout::RouterParameter routerParameter; if (!outputGPX) { routerParameter.SetDebugPerformance(true); } osmscout::Router router(routerParameter, vehicle); if (!router.Open(map.c_str())) { std::cerr << "Cannot open routing database" << std::endl; return 1; } osmscout::TypeConfig *typeConfig=router.GetTypeConfig(); //osmscout::ShortestPathRoutingProfile routingProfile; osmscout::RouteData data; osmscout::RouteDescription description; std::map<std::string,double> carSpeedTable; switch (vehicle) { case osmscout::vehicleFoot: routingProfile.ParametrizeForFoot(*typeConfig, 5.0); break; case osmscout::vehicleBicycle: routingProfile.ParametrizeForBicycle(*typeConfig, 20.0); break; case osmscout::vehicleCar: GetCarSpeedTable(carSpeedTable); routingProfile.ParametrizeForCar(*typeConfig, carSpeedTable, 160.0); break; } if (!outputGPX) { std::cout << "Searching for routing node for start location..." << std::endl; } if (!database.GetClosestRoutableNode(startLat, startLon, vehicle, 1000, startObject, startNodeIndex)) { std::cerr << "Error while searching for routing node near start location!" << std::endl; return 1; } if (startObject.Invalid() || startObject.GetType()==osmscout::refNode) { std::cerr << "Cannot find start node for start location!" << std::endl; } if (!outputGPX) { std::cout << "Searching for routing node for target location..." << std::endl; } if (!database.GetClosestRoutableNode(targetLat, targetLon, vehicle, 1000, targetObject, targetNodeIndex)) { std::cerr << "Error while searching for routing node near target location!" << std::endl; return 1; } if (targetObject.Invalid() || targetObject.GetType()==osmscout::refNode) { std::cerr << "Cannot find start node for target location!" << std::endl; } if (!router.CalculateRoute(routingProfile, startObject, startNodeIndex, targetObject, targetNodeIndex, data)) { std::cerr << "There was an error while calculating the route!" << std::endl; router.Close(); return 1; } if (data.IsEmpty()) { std::cout << "No Route found!" << std::endl; router.Close(); return 0; } router.TransformRouteDataToRouteDescription(data,description); std::list<osmscout::RoutePostprocessor::PostprocessorRef> postprocessors; postprocessors.push_back(new osmscout::RoutePostprocessor::DistanceAndTimePostprocessor()); postprocessors.push_back(new osmscout::RoutePostprocessor::StartPostprocessor("Start")); postprocessors.push_back(new osmscout::RoutePostprocessor::TargetPostprocessor("Target")); postprocessors.push_back(new osmscout::RoutePostprocessor::WayNamePostprocessor()); postprocessors.push_back(new osmscout::RoutePostprocessor::CrossingWaysPostprocessor()); postprocessors.push_back(new osmscout::RoutePostprocessor::DirectionPostprocessor()); osmscout::RoutePostprocessor::InstructionPostprocessor *instructionProcessor=new osmscout::RoutePostprocessor::InstructionPostprocessor(); instructionProcessor->AddMotorwayType(typeConfig->GetWayTypeId("highway_motorway")); instructionProcessor->AddMotorwayLinkType(typeConfig->GetWayTypeId("highway_motorway_link")); instructionProcessor->AddMotorwayType(typeConfig->GetWayTypeId("highway_motorway_trunk")); instructionProcessor->AddMotorwayType(typeConfig->GetWayTypeId("highway_motorway_primary")); instructionProcessor->AddMotorwayType(typeConfig->GetWayTypeId("highway_trunk")); instructionProcessor->AddMotorwayLinkType(typeConfig->GetWayTypeId("highway_trunk_link")); postprocessors.push_back(instructionProcessor); osmscout::RoutePostprocessor postprocessor; size_t roundaboutCrossingCounter=0; #if defined(POINTS_DEBUG) std::list<osmscout::Point> points; if (!router.TransformRouteDataToPoints(data,points)) { std::cerr << "Error during route conversion" << std::endl; } std::cout << points.size() << " point(s)" << std::endl; for (std::list<osmscout::Point>::const_iterator point=points.begin(); point!=points.end(); ++point) { std::cout << "Point " << point->GetId() << " " << point->GetLat() << "," << point->GetLon() << std::endl; } #endif std::list<osmscout::Point> points; if(outputGPX) { if (!router.TransformRouteDataToPoints(data,points)) { std::cerr << "Error during route conversion" << std::endl; } std::cout.precision(8); std::cout << "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\" ?>\n<gpx xmlns=\"http://www.topografix.com/GPX/1/1\" creator=\"bin2gpx\" version=\"1.1\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd\">\n\t<trk>" << std::endl; std::cout << "\t\t<trkseg>" << std::endl; for (std::list<osmscout::Point>::const_iterator point=points.begin(); point!=points.end(); ++point) { std::cout << "\t\t\t<trkpt lat=\""<< point->GetLat() << "\" lon=\""<< point->GetLon() <<"\">\n\t\t\t\t</trkpt><fix>2d</fix>" << std::endl; } std::cout << "\t\t</trkseg>" << std::endl; std::cout << "\t</trk>" << std::endl; std::cout << "</gpx>" << std::endl; return 0; } if (!postprocessor.PostprocessRouteDescription(description, routingProfile, database, postprocessors)) { std::cerr << "Error during route postprocessing" << std::endl; } std::cout << "----------------------------------------------------" << std::endl; std::cout << " At| After| Time| After|" << std::endl; std::cout << "----------------------------------------------------" << std::endl; std::list<osmscout::RouteDescription::Node>::const_iterator prevNode=description.Nodes().end(); for (std::list<osmscout::RouteDescription::Node>::const_iterator node=description.Nodes().begin(); node!=description.Nodes().end(); ++node) { osmscout::RouteDescription::DescriptionRef desc; osmscout::RouteDescription::NameDescriptionRef nameDescription; osmscout::RouteDescription::DirectionDescriptionRef directionDescription; osmscout::RouteDescription::NameChangedDescriptionRef nameChangedDescription; osmscout::RouteDescription::CrossingWaysDescriptionRef crossingWaysDescription; osmscout::RouteDescription::StartDescriptionRef startDescription; osmscout::RouteDescription::TargetDescriptionRef targetDescription; osmscout::RouteDescription::TurnDescriptionRef turnDescription; osmscout::RouteDescription::RoundaboutEnterDescriptionRef roundaboutEnterDescription; osmscout::RouteDescription::RoundaboutLeaveDescriptionRef roundaboutLeaveDescription; osmscout::RouteDescription::MotorwayEnterDescriptionRef motorwayEnterDescription; osmscout::RouteDescription::MotorwayChangeDescriptionRef motorwayChangeDescription; osmscout::RouteDescription::MotorwayLeaveDescriptionRef motorwayLeaveDescription; desc=node->GetDescription(osmscout::RouteDescription::WAY_NAME_DESC); if (desc.Valid()) { nameDescription=dynamic_cast<osmscout::RouteDescription::NameDescription*>(desc.Get()); } desc=node->GetDescription(osmscout::RouteDescription::DIRECTION_DESC); if (desc.Valid()) { directionDescription=dynamic_cast<osmscout::RouteDescription::DirectionDescription*>(desc.Get()); } desc=node->GetDescription(osmscout::RouteDescription::WAY_NAME_CHANGED_DESC); if (desc.Valid()) { nameChangedDescription=dynamic_cast<osmscout::RouteDescription::NameChangedDescription*>(desc.Get()); } desc=node->GetDescription(osmscout::RouteDescription::CROSSING_WAYS_DESC); if (desc.Valid()) { crossingWaysDescription=dynamic_cast<osmscout::RouteDescription::CrossingWaysDescription*>(desc.Get()); } desc=node->GetDescription(osmscout::RouteDescription::NODE_START_DESC); if (desc.Valid()) { startDescription=dynamic_cast<osmscout::RouteDescription::StartDescription*>(desc.Get()); } desc=node->GetDescription(osmscout::RouteDescription::NODE_TARGET_DESC); if (desc.Valid()) { targetDescription=dynamic_cast<osmscout::RouteDescription::TargetDescription*>(desc.Get()); } desc=node->GetDescription(osmscout::RouteDescription::TURN_DESC); if (desc.Valid()) { turnDescription=dynamic_cast<osmscout::RouteDescription::TurnDescription*>(desc.Get()); } desc=node->GetDescription(osmscout::RouteDescription::ROUNDABOUT_ENTER_DESC); if (desc.Valid()) { roundaboutEnterDescription=dynamic_cast<osmscout::RouteDescription::RoundaboutEnterDescription*>(desc.Get()); } desc=node->GetDescription(osmscout::RouteDescription::ROUNDABOUT_LEAVE_DESC); if (desc.Valid()) { roundaboutLeaveDescription=dynamic_cast<osmscout::RouteDescription::RoundaboutLeaveDescription*>(desc.Get()); } desc=node->GetDescription(osmscout::RouteDescription::MOTORWAY_ENTER_DESC); if (desc.Valid()) { motorwayEnterDescription=dynamic_cast<osmscout::RouteDescription::MotorwayEnterDescription*>(desc.Get()); } desc=node->GetDescription(osmscout::RouteDescription::MOTORWAY_CHANGE_DESC); if (desc.Valid()) { motorwayChangeDescription=dynamic_cast<osmscout::RouteDescription::MotorwayChangeDescription*>(desc.Get()); } desc=node->GetDescription(osmscout::RouteDescription::MOTORWAY_LEAVE_DESC); if (desc.Valid()) { motorwayLeaveDescription=dynamic_cast<osmscout::RouteDescription::MotorwayLeaveDescription*>(desc.Get()); } if (crossingWaysDescription.Valid() && roundaboutCrossingCounter>0 && crossingWaysDescription->GetExitCount()>1) { roundaboutCrossingCounter+=crossingWaysDescription->GetExitCount()-1; } if (!HasRelevantDescriptions(*node)) { continue; } #if defined(HTML) std::cout << "<tr><td>"; #endif std::cout << std::setfill(' ') << std::setw(5) << std::fixed << std::setprecision(1); std::cout << node->GetDistance() << "km "; #if defined(HTML) std::cout <<"</td><td>"; #endif if (prevNode!=description.Nodes().end() && node->GetDistance()-prevNode->GetDistance()!=0.0) { std::cout << std::setfill(' ') << std::setw(4) << std::fixed << std::setprecision(1); std::cout << node->GetDistance()-prevNode->GetDistance() << "km "; } else { std::cout << " "; } #if defined(HTML) std::cout << "<tr><td>"; #endif std::cout << TimeToString(node->GetTime()) << "h "; #if defined(HTML) std::cout <<"</td><td>"; #endif if (prevNode!=description.Nodes().end() && node->GetTime()-prevNode->GetTime()!=0.0) { std::cout << TimeToString(node->GetTime()-prevNode->GetTime()) << "h "; } else { std::cout << " "; } #if defined(HTML) std::cout <<"</td><td>"; #endif size_t lineCount=0; #if defined(ROUTE_DEBUG) || defined(NODE_DEBUG) NextLine(lineCount); std::cout << "// " << node->GetTime() << "h " << std::setw(0) << std::setprecision(3) << node->GetDistance() << "km "; if (node->GetPathObject().Valid()) { std::cout << node->GetPathObject().GetTypeName() << " " << node->GetPathObject().GetFileOffset() << "[" << node->GetCurrentNodeIndex() << "] => " << node->GetPathObject().GetTypeName() << " " << node->GetPathObject().GetFileOffset() << "[" << node->GetTargetNodeIndex() << "]"; } std::cout << std::endl; for (std::list<osmscout::RouteDescription::DescriptionRef>::const_iterator d=node->GetDescriptions().begin(); d!=node->GetDescriptions().end(); ++d) { osmscout::RouteDescription::DescriptionRef desc=*d; NextLine(lineCount); std::cout << "// " << desc->GetDebugString() << std::endl; } #endif if (startDescription.Valid()) { DumpStartDescription(lineCount, startDescription, nameDescription); } else if (targetDescription.Valid()) { DumpTargetDescription(lineCount,targetDescription); } else if (turnDescription.Valid()) { DumpTurnDescription(lineCount, turnDescription, crossingWaysDescription, directionDescription, nameDescription); } else if (roundaboutEnterDescription.Valid()) { DumpRoundaboutEnterDescription(lineCount, roundaboutEnterDescription, crossingWaysDescription); roundaboutCrossingCounter=1; } else if (roundaboutLeaveDescription.Valid()) { DumpRoundaboutLeaveDescription(lineCount, roundaboutLeaveDescription, nameDescription); roundaboutCrossingCounter=0; } else if (motorwayEnterDescription.Valid()) { DumpMotorwayEnterDescription(lineCount, motorwayEnterDescription, crossingWaysDescription); } else if (motorwayChangeDescription.Valid()) { DumpMotorwayChangeDescription(lineCount, motorwayChangeDescription); } else if (motorwayLeaveDescription.Valid()) { DumpMotorwayLeaveDescription(lineCount, motorwayLeaveDescription, directionDescription, nameDescription); } else if (nameChangedDescription.Valid()) { DumpNameChangedDescription(lineCount, nameChangedDescription); } if (lineCount==0) { std::cout << std::endl; } #if defined(HTML) std::cout << "</td></tr>"; #endif prevNode=node; } router.Close(); return 0; }
void RoutingDialog::CalculateRoute() { osmscout::FastestPathRoutingProfile routingProfile; osmscout::RouteData routeData; osmscout::Way routeWay; osmscout::Vehicle vehicle=settings->GetRoutingVehicle(); if (vehicle==osmscout::vehicleFoot) { routingProfile.ParametrizeForFoot(*dbThread->GetTypeConfig(), 5.0); } else if (vehicle==osmscout::vehicleBicycle) { routingProfile.ParametrizeForBicycle(*dbThread->GetTypeConfig(), 20.0); } else /* car */ { std::map<std::string,double> speedMap; GetCarSpeedTable(speedMap); routingProfile.ParametrizeForCar(*dbThread->GetTypeConfig(), speedMap, 160.0); } osmscout::ObjectFileRef startObject; size_t startNodeIndex; osmscout::ObjectFileRef targetObject; size_t targetNodeIndex; if (!dbThread->GetClosestRoutableNode(route.startObject, vehicle, 1000, startObject, startNodeIndex)) { std::cerr << "There was an error while routing!" << std::endl; } if (!startObject.Valid()) { std::cerr << "Cannot find a routing node close to the start location" << std::endl; } if (!dbThread->GetClosestRoutableNode(route.endObject, vehicle, 1000, targetObject, targetNodeIndex)) { std::cerr << "There was an error while routing!" << std::endl; } if (!targetObject.Valid()) { std::cerr << "Cannot find a routing node close to the target location" << std::endl; } route.routeSteps.clear(); routeModel->refresh(); if (!dbThread->CalculateRoute(vehicle, routingProfile, startObject, startNodeIndex, targetObject, targetNodeIndex, routeData)) { std::cerr << "There was an error while routing!" << std::endl; return; } dbThread->TransformRouteDataToRouteDescription(vehicle, routingProfile, routeData, route.routeDescription, route.start.toUtf8().constData(), route.end.toUtf8().constData()); size_t roundaboutCrossingCounter=0; std::list<RouteStep>::iterator lastStep=route.routeSteps.end(); std::list<osmscout::RouteDescription::Node>::const_iterator prevNode=route.routeDescription.Nodes().end(); for (std::list<osmscout::RouteDescription::Node>::const_iterator node=route.routeDescription.Nodes().begin(); node!=route.routeDescription.Nodes().end(); ++node) { osmscout::RouteDescription::DescriptionRef desc; osmscout::RouteDescription::NameDescriptionRef nameDescription; osmscout::RouteDescription::DirectionDescriptionRef directionDescription; osmscout::RouteDescription::NameChangedDescriptionRef nameChangedDescription; osmscout::RouteDescription::CrossingWaysDescriptionRef crossingWaysDescription; osmscout::RouteDescription::StartDescriptionRef startDescription; osmscout::RouteDescription::TargetDescriptionRef targetDescription; osmscout::RouteDescription::TurnDescriptionRef turnDescription; osmscout::RouteDescription::RoundaboutEnterDescriptionRef roundaboutEnterDescription; osmscout::RouteDescription::RoundaboutLeaveDescriptionRef roundaboutLeaveDescription; osmscout::RouteDescription::MotorwayEnterDescriptionRef motorwayEnterDescription; osmscout::RouteDescription::MotorwayChangeDescriptionRef motorwayChangeDescription; osmscout::RouteDescription::MotorwayLeaveDescriptionRef motorwayLeaveDescription; desc=node->GetDescription(osmscout::RouteDescription::WAY_NAME_DESC); if (desc.Valid()) { nameDescription=dynamic_cast<osmscout::RouteDescription::NameDescription*>(desc.Get()); } desc=node->GetDescription(osmscout::RouteDescription::DIRECTION_DESC); if (desc.Valid()) { directionDescription=dynamic_cast<osmscout::RouteDescription::DirectionDescription*>(desc.Get()); } desc=node->GetDescription(osmscout::RouteDescription::WAY_NAME_CHANGED_DESC); if (desc.Valid()) { nameChangedDescription=dynamic_cast<osmscout::RouteDescription::NameChangedDescription*>(desc.Get()); } desc=node->GetDescription(osmscout::RouteDescription::CROSSING_WAYS_DESC); if (desc.Valid()) { crossingWaysDescription=dynamic_cast<osmscout::RouteDescription::CrossingWaysDescription*>(desc.Get()); } desc=node->GetDescription(osmscout::RouteDescription::NODE_START_DESC); if (desc.Valid()) { startDescription=dynamic_cast<osmscout::RouteDescription::StartDescription*>(desc.Get()); } desc=node->GetDescription(osmscout::RouteDescription::NODE_TARGET_DESC); if (desc.Valid()) { targetDescription=dynamic_cast<osmscout::RouteDescription::TargetDescription*>(desc.Get()); } desc=node->GetDescription(osmscout::RouteDescription::TURN_DESC); if (desc.Valid()) { turnDescription=dynamic_cast<osmscout::RouteDescription::TurnDescription*>(desc.Get()); } desc=node->GetDescription(osmscout::RouteDescription::ROUNDABOUT_ENTER_DESC); if (desc.Valid()) { roundaboutEnterDescription=dynamic_cast<osmscout::RouteDescription::RoundaboutEnterDescription*>(desc.Get()); } desc=node->GetDescription(osmscout::RouteDescription::ROUNDABOUT_LEAVE_DESC); if (desc.Valid()) { roundaboutLeaveDescription=dynamic_cast<osmscout::RouteDescription::RoundaboutLeaveDescription*>(desc.Get()); } desc=node->GetDescription(osmscout::RouteDescription::MOTORWAY_ENTER_DESC); if (desc.Valid()) { motorwayEnterDescription=dynamic_cast<osmscout::RouteDescription::MotorwayEnterDescription*>(desc.Get()); } desc=node->GetDescription(osmscout::RouteDescription::MOTORWAY_CHANGE_DESC); if (desc.Valid()) { motorwayChangeDescription=dynamic_cast<osmscout::RouteDescription::MotorwayChangeDescription*>(desc.Get()); } desc=node->GetDescription(osmscout::RouteDescription::MOTORWAY_LEAVE_DESC); if (desc.Valid()) { motorwayLeaveDescription=dynamic_cast<osmscout::RouteDescription::MotorwayLeaveDescription*>(desc.Get()); } if (crossingWaysDescription.Valid() && roundaboutCrossingCounter>0 && crossingWaysDescription->GetExitCount()>1) { roundaboutCrossingCounter+=crossingWaysDescription->GetExitCount()-1; } if (startDescription.Valid()) { DumpStartDescription(startDescription, nameDescription); } else if (targetDescription.Valid()) { DumpTargetDescription(targetDescription); } else if (turnDescription.Valid()) { DumpTurnDescription(turnDescription, crossingWaysDescription, directionDescription, nameDescription); } else if (roundaboutEnterDescription.Valid()) { DumpRoundaboutEnterDescription(roundaboutEnterDescription, crossingWaysDescription); roundaboutCrossingCounter=1; } else if (roundaboutLeaveDescription.Valid()) { DumpRoundaboutLeaveDescription(roundaboutLeaveDescription, nameDescription); roundaboutCrossingCounter=0; } else if (motorwayEnterDescription.Valid()) { DumpMotorwayEnterDescription(motorwayEnterDescription, crossingWaysDescription); } else if (motorwayChangeDescription.Valid()) { DumpMotorwayChangeDescription(motorwayChangeDescription); } else if (motorwayLeaveDescription.Valid()) { DumpMotorwayLeaveDescription(motorwayLeaveDescription, directionDescription, nameDescription); } else if (nameChangedDescription.Valid()) { DumpNameChangedDescription(nameChangedDescription); } else { continue; } std::list<RouteStep>::iterator current; if (lastStep==route.routeSteps.end()) { current=route.routeSteps.begin(); } else { current=lastStep; current++; } if (current!=route.routeSteps.end()) { current->distance=DistanceToString(node->GetDistance()); current->time=TimeToString(node->GetTime()); if (prevNode!=route.routeDescription.Nodes().end() && node->GetDistance()-prevNode->GetDistance()!=0.0) { current->distanceDelta=DistanceToString(node->GetDistance()-prevNode->GetDistance()); } if (prevNode!=route.routeDescription.Nodes().end() && node->GetTime()-prevNode->GetTime()!=0.0) { current->timeDelta=TimeToString(node->GetTime()-prevNode->GetTime()); } } while (current!=route.routeSteps.end()) { lastStep = current++; } prevNode=node; } if (dbThread->TransformRouteDataToWay(vehicle, routeData, routeWay)) { dbThread->ClearRoute(); dbThread->AddRoute(routeWay); } else { std::cerr << "Error while transforming route" << std::endl; } }