hello

i want to find all possible paths from some start point while going in a
single direction.
first forward then optionally also backward. also i want to have on each
edge distance and travel time.

i home i understand correctly
const EdgeWeight weight = GetEdgeData(edge).distance;
is travel time in ms.

but something is wrong
the coordinates results from GetCoordinateOfNode
are too distant from the "from" coordinate and so the result is wrong.

i tested viaroute command and the routing worked correctly.

how to get coordinates or a phantom node of a node id?


Simon.

#ifndef WAYS_HPP
#define WAYS_HPP

#include "plugin_base.hpp"

#include "../util/json_renderer.hpp"
#include "../util/string_util.hpp"

#include <osrm/json_container.hpp>
#include <algorithm>
#include <string>
#include <vector>

// locates the nearest node in the road network for a given coordinate.
template <class DataFacadeT> class WaysPlugin final : public BasePlugin
{
  public:
    explicit WaysPlugin(DataFacadeT *facade) : descriptor_string("ways"),
facade(facade) {}
    const std::string GetDescriptor() const override final { return
descriptor_string; }

    int HandleRequest(const RouteParameters &route_parameters,
                      osrm::json::Object &json_result) override final
    {
        // check number of parameters
        if (route_parameters.coordinates.empty() ||
            !route_parameters.coordinates.front().is_valid())
        {
            return 400;
        }

        FixedPointCoordinate snapped_coordinate;
auto input_coordinate=route_parameters.coordinates.front();
        if (!facade->LocateClosestEndPointForCoordinate(input_coordinate,
snapped_coordinate))
        {
            json_result.values["status"] = 207;
        }
        else
        {
//////
            //bool allow_uturn = false;
//auto input_coordinate=route_parameters.coordinates.front();
PhantomNode node_at_coordinate;

facade->IncrementalFindPhantomNodeForCoordinate(snapped_coordinate,node_at_coordinate);
std::cout << "FindPhantomNodeForCoordinate: " << node_at_coordinate << '\n';
std::vector<NodeID> stack;
std::vector<std::vector<NodeID>> results;
NodeID  from;
from=node_at_coordinate.reverse_node_id;
recourceNodeIds(from,0,stack,results,node_at_coordinate);
/*
NodeID  from=node_at_coordinate.forward_node_id;
for (auto edge : facade->GetAdjacentEdgeRange(from))
{
const NodeID target = GetTarget(edge);
const EdgeWeight weight = GetEdgeData(edge).distance;
}
NodeID  from=node_at_coordinate.reverse_node_id;
for (auto edge : facade->GetAdjacentEdgeRange(from))
{
const NodeID target = GetTarget(edge);
const EdgeWeight weight = GetEdgeData(edge).distance;
}
*/
/*
struct EdgeData {
NodeID id : 31;
bool shortcut : 1;
int distance : 30;
bool forward : 1;
bool backward : 1;
}
*/

///////
            json_result.values["status"] = 0;
            osrm::json::Array json_coordinate;
            json_coordinate.values.push_back(snapped_coordinate.lat /
COORDINATE_PRECISION);
            json_coordinate.values.push_back(snapped_coordinate.lon /
COORDINATE_PRECISION);
            json_result.values["mapped_coordinate"] = json_coordinate;
        }
        return 200;
    }
void recourceNodeIds(NodeID from,int totaldistance,std::vector<NodeID>
&stack,std::vector<std::vector<NodeID>> &results,PhantomNode
node_at_coordinate)
{
if(totaldistance>60000)
{
std::vector<NodeID> saved_stack;
saved_stack=stack;
results.push_back(saved_stack);
return;
}
auto nodename=facade->get_name_for_id(node_at_coordinate.name_id);
std::cout << "nodename: " << nodename << '\n' ;
for (auto edge : facade->GetAdjacentEdgeRange(from))
{
const NodeID target = facade->GetTarget(edge);
//const EdgeWeight weight = facade->GetEdgeData(edge).distance;
auto data=facade->GetEdgeData(edge);
auto coordinate_of_from=facade->GetCoordinateOfNode(from);
auto coordinate_of_node=facade->GetCoordinateOfNode(target);
auto nameofedgeid=facade->GetNameIndexFromEdgeID(data.id);
auto nameofedge=facade->get_name_for_id(nameofedgeid);
std::cout << "GetEdgeData: " ;
std::cout  << "from: "<< from <<", target: "<<target
<<", id: " << data.id << ", "
<< "shortcut: " << data.shortcut << ", "
<< "distance: " << data.distance << ", "
<< "forward: " << data.forward << ", "
<< "backward: " << data.backward <<", "
<< "coordinate_of_node: " << coordinate_of_node <<", "
<< "coordinate_of_from: " << coordinate_of_from
<< "nameofedge: " << nameofedge
<< '\n';
// if not in history array then recourse:
//if(std::find(stack.begin(), stack.end(), target)!=stack.end())
//{
// stack.push_back(target);
// recourceNodeIds(target,totaldistance+weight,stack,results);
// stack.pop_back();
//}
}
}

  private:
    std::string descriptor_string;
    DataFacadeT *facade;
};

#endif /* WAYS_HPP */
_______________________________________________
OSRM-talk mailing list
OSRM-talk@openstreetmap.org
https://lists.openstreetmap.org/listinfo/osrm-talk

Reply via email to