switch edge-expanded street name indexes to be first segment names (18 failed tests left)
This commit is contained in:
parent
549bcb502b
commit
752fb880be
@ -318,14 +318,6 @@ void EdgeBasedGraphFactory::InsertEdgeBasedNode(
|
|||||||
|
|
||||||
BOOST_ASSERT( m_geometry_compressor.HasEntryForID(e1) == m_geometry_compressor.HasEntryForID(e2) );
|
BOOST_ASSERT( m_geometry_compressor.HasEntryForID(e1) == m_geometry_compressor.HasEntryForID(e2) );
|
||||||
if( m_geometry_compressor.HasEntryForID(e1) ) {
|
if( m_geometry_compressor.HasEntryForID(e1) ) {
|
||||||
if(forward_data.edgeBasedNodeID == 16176) {
|
|
||||||
SimpleLogger().Write(logDEBUG) << "reverse_data.edgeBasedNodeID=" << reverse_data.edgeBasedNodeID;
|
|
||||||
SimpleLogger().Write(logDEBUG) << "u: " << u << ", v: " << v << " at " << m_node_info_list.at(u).lat/COORDINATE_PRECISION << ","
|
|
||||||
<< m_node_info_list.at(u).lon/COORDINATE_PRECISION << "<->" << m_node_info_list.at(v).lat/COORDINATE_PRECISION << ","
|
|
||||||
<< m_node_info_list.at(v).lon/COORDINATE_PRECISION;
|
|
||||||
SimpleLogger().Write(logDEBUG) << "pos(" << e1 << ")=" << m_geometry_compressor.GetPositionForID(e1);
|
|
||||||
SimpleLogger().Write(logDEBUG) << "pos(" << e2 << ")=" << m_geometry_compressor.GetPositionForID(e2);
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOST_ASSERT( m_geometry_compressor.HasEntryForID(e2) );
|
BOOST_ASSERT( m_geometry_compressor.HasEntryForID(e2) );
|
||||||
|
|
||||||
@ -605,6 +597,7 @@ void EdgeBasedGraphFactory::Run(
|
|||||||
forward_weight1 + (add_traffic_signal_penalty ? speed_profile.trafficSignalPenalty :0),
|
forward_weight1 + (add_traffic_signal_penalty ? speed_profile.trafficSignalPenalty :0),
|
||||||
forward_weight2
|
forward_weight2
|
||||||
);
|
);
|
||||||
|
SimpleLogger().Write(logDEBUG) << "compressing fwd segment with name " << m_node_based_graph->GetEdgeData(forward_e1).nameID;
|
||||||
m_geometry_compressor.CompressEdge(
|
m_geometry_compressor.CompressEdge(
|
||||||
reverse_e1,
|
reverse_e1,
|
||||||
reverse_e2,
|
reverse_e2,
|
||||||
@ -613,8 +606,14 @@ void EdgeBasedGraphFactory::Run(
|
|||||||
reverse_weight1 ,
|
reverse_weight1 ,
|
||||||
reverse_weight2 + (add_traffic_signal_penalty ? speed_profile.trafficSignalPenalty :0)
|
reverse_weight2 + (add_traffic_signal_penalty ? speed_profile.trafficSignalPenalty :0)
|
||||||
);
|
);
|
||||||
|
SimpleLogger().Write(logDEBUG) << "compressing rev segment with name " << m_node_based_graph->GetEdgeData(reverse_e1).nameID;
|
||||||
++removed_node_count;
|
++removed_node_count;
|
||||||
|
|
||||||
|
BOOST_ASSERT
|
||||||
|
(
|
||||||
|
m_node_based_graph->GetEdgeData(forward_e1).nameID ==
|
||||||
|
m_node_based_graph->GetEdgeData(reverse_e1).nameID
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
SimpleLogger().Write() << "removed " << removed_node_count << " nodes";
|
SimpleLogger().Write() << "removed " << removed_node_count << " nodes";
|
||||||
@ -840,7 +839,7 @@ void EdgeBasedGraphFactory::Run(
|
|||||||
original_edge_data_vector.push_back(
|
original_edge_data_vector.push_back(
|
||||||
OriginalEdgeData(
|
OriginalEdgeData(
|
||||||
(edge_is_compressed ? m_geometry_compressor.GetPositionForID(e1) : v),
|
(edge_is_compressed ? m_geometry_compressor.GetPositionForID(e1) : v),
|
||||||
edge_data2.nameID,
|
(edge_is_compressed ? edge_data1.nameID : edge_data1.nameID),
|
||||||
turn_instruction,
|
turn_instruction,
|
||||||
edge_is_compressed
|
edge_is_compressed
|
||||||
)
|
)
|
||||||
|
@ -42,7 +42,6 @@ struct PhantomNode {
|
|||||||
forward_offset(0),
|
forward_offset(0),
|
||||||
reverse_offset(0),
|
reverse_offset(0),
|
||||||
packed_geometry_id(SPECIAL_EDGEID),
|
packed_geometry_id(SPECIAL_EDGEID),
|
||||||
ratio(0.),
|
|
||||||
fwd_segment_position(0)
|
fwd_segment_position(0)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
@ -54,11 +53,10 @@ struct PhantomNode {
|
|||||||
int forward_offset;
|
int forward_offset;
|
||||||
int reverse_offset;
|
int reverse_offset;
|
||||||
unsigned packed_geometry_id;
|
unsigned packed_geometry_id;
|
||||||
double ratio;
|
// double ratio;
|
||||||
FixedPointCoordinate location;
|
FixedPointCoordinate location;
|
||||||
unsigned short fwd_segment_position;
|
unsigned short fwd_segment_position;
|
||||||
|
|
||||||
|
|
||||||
int GetForwardWeightPlusOffset() const
|
int GetForwardWeightPlusOffset() const
|
||||||
{
|
{
|
||||||
SimpleLogger().Write(logDEBUG) << "->fwd_offset: " << forward_offset << ", weight: " << forward_weight;
|
SimpleLogger().Write(logDEBUG) << "->fwd_offset: " << forward_offset << ", weight: " << forward_weight;
|
||||||
@ -79,7 +77,7 @@ struct PhantomNode {
|
|||||||
reverse_weight = INVALID_EDGE_WEIGHT;
|
reverse_weight = INVALID_EDGE_WEIGHT;
|
||||||
forward_offset = 0;
|
forward_offset = 0;
|
||||||
reverse_offset = 0;
|
reverse_offset = 0;
|
||||||
ratio = 0.;
|
// ratio = 0.;
|
||||||
location.Reset();
|
location.Reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -106,8 +104,8 @@ struct PhantomNode {
|
|||||||
(forward_weight != INVALID_EDGE_WEIGHT) ||
|
(forward_weight != INVALID_EDGE_WEIGHT) ||
|
||||||
(reverse_weight != INVALID_EDGE_WEIGHT)
|
(reverse_weight != INVALID_EDGE_WEIGHT)
|
||||||
) &&
|
) &&
|
||||||
(ratio >= 0.) &&
|
// (ratio >= 0.) &&
|
||||||
(ratio <= 1.) &&
|
// (ratio <= 1.) &&
|
||||||
(name_id != std::numeric_limits<unsigned>::max()
|
(name_id != std::numeric_limits<unsigned>::max()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -162,7 +160,7 @@ inline std::ostream& operator<<(std::ostream &out, const PhantomNode & pn) {
|
|||||||
"rev-w: " << pn.reverse_weight << ", " <<
|
"rev-w: " << pn.reverse_weight << ", " <<
|
||||||
"fwd-o: " << pn.forward_offset << ", " <<
|
"fwd-o: " << pn.forward_offset << ", " <<
|
||||||
"rev-o: " << pn.reverse_offset << ", " <<
|
"rev-o: " << pn.reverse_offset << ", " <<
|
||||||
"ratio: " << pn.ratio << ", " <<
|
// "ratio: " << pn.ratio << ", " <<
|
||||||
"geom: " << pn.packed_geometry_id << ", " <<
|
"geom: " << pn.packed_geometry_id << ", " <<
|
||||||
"pos: " << pn.fwd_segment_position << ", " <<
|
"pos: " << pn.fwd_segment_position << ", " <<
|
||||||
"loc: " << pn.location;
|
"loc: " << pn.location;
|
||||||
|
@ -70,10 +70,19 @@ struct RawRouteData {
|
|||||||
unsigned checkSum;
|
unsigned checkSum;
|
||||||
int lengthOfShortestPath;
|
int lengthOfShortestPath;
|
||||||
int lengthOfAlternativePath;
|
int lengthOfAlternativePath;
|
||||||
|
bool source_traversed_in_reverse;
|
||||||
|
bool target_traversed_in_reverse;
|
||||||
|
bool alt_source_traversed_in_reverse;
|
||||||
|
bool alt_target_traversed_in_reverse;
|
||||||
|
|
||||||
RawRouteData() :
|
RawRouteData() :
|
||||||
checkSum(UINT_MAX),
|
checkSum(UINT_MAX),
|
||||||
lengthOfShortestPath(INT_MAX),
|
lengthOfShortestPath(INT_MAX),
|
||||||
lengthOfAlternativePath(INT_MAX)
|
lengthOfAlternativePath(INT_MAX),
|
||||||
|
source_traversed_in_reverse(false),
|
||||||
|
target_traversed_in_reverse(false),
|
||||||
|
alt_source_traversed_in_reverse(false),
|
||||||
|
alt_target_traversed_in_reverse(false)
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -771,12 +771,12 @@ public:
|
|||||||
{
|
{
|
||||||
result_phantom_node.reverse_weight *= 1.-ratio;
|
result_phantom_node.reverse_weight *= 1.-ratio;
|
||||||
}
|
}
|
||||||
result_phantom_node.ratio = ratio;
|
// result_phantom_node.ratio = ratio;
|
||||||
|
|
||||||
SimpleLogger().Write(logDEBUG) << "result location: " << result_phantom_node.location << ", start: " << current_start_coordinate << ", end: " << current_end_coordinate;
|
SimpleLogger().Write(logDEBUG) << "result location: " << result_phantom_node.location << ", start: " << current_start_coordinate << ", end: " << current_end_coordinate;
|
||||||
SimpleLogger().Write(logDEBUG) << "fwd node: " << result_phantom_node.forward_node_id << ", rev node: " << result_phantom_node.reverse_node_id;
|
SimpleLogger().Write(logDEBUG) << "fwd node: " << result_phantom_node.forward_node_id << ", rev node: " << result_phantom_node.reverse_node_id;
|
||||||
SimpleLogger().Write(logDEBUG) << "fwd weight: " << result_phantom_node.forward_weight << ", rev weight: " << result_phantom_node.reverse_weight << ", ratio: " << result_phantom_node.ratio;
|
SimpleLogger().Write(logDEBUG) << "fwd weight: " << result_phantom_node.forward_weight << ", rev weight: " << result_phantom_node.reverse_weight;// << ", ratio: " << result_phantom_node.ratio;
|
||||||
SimpleLogger().Write(logDEBUG) << "fwd offset: " << result_phantom_node.forward_offset << ", rev offset: " << result_phantom_node.reverse_offset << ", ratio: " << result_phantom_node.ratio;
|
SimpleLogger().Write(logDEBUG) << "fwd offset: " << result_phantom_node.forward_offset << ", rev offset: " << result_phantom_node.reverse_offset;// << ", ratio: " << result_phantom_node.ratio;
|
||||||
SimpleLogger().Write(logDEBUG) << "bidirected: " << (result_phantom_node.isBidirected() ? "y" : "n");
|
SimpleLogger().Write(logDEBUG) << "bidirected: " << (result_phantom_node.isBidirected() ? "y" : "n");
|
||||||
SimpleLogger().Write(logDEBUG) << "name id: " << result_phantom_node.name_id;
|
SimpleLogger().Write(logDEBUG) << "name id: " << result_phantom_node.name_id;
|
||||||
SimpleLogger().Write(logDEBUG) << "geom id: " << result_phantom_node.packed_geometry_id;
|
SimpleLogger().Write(logDEBUG) << "geom id: " << result_phantom_node.packed_geometry_id;
|
||||||
|
@ -31,18 +31,18 @@ DescriptionFactory::DescriptionFactory() : entireLength(0) { }
|
|||||||
|
|
||||||
DescriptionFactory::~DescriptionFactory() { }
|
DescriptionFactory::~DescriptionFactory() { }
|
||||||
|
|
||||||
inline double DescriptionFactory::DegreeToRadian(const double degree) const {
|
inline double DescriptionFactory::DegreeToRadian(const double degree) const
|
||||||
return degree * (M_PI/180);
|
{
|
||||||
|
return degree * (M_PI/180.);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline double DescriptionFactory::RadianToDegree(const double radian) const {
|
inline double DescriptionFactory::RadianToDegree(const double radian) const
|
||||||
return radian * (180/M_PI);
|
{
|
||||||
|
return radian * (180./M_PI);
|
||||||
}
|
}
|
||||||
|
|
||||||
double DescriptionFactory::GetBearing(
|
double DescriptionFactory::GetBearing(const FixedPointCoordinate & A, const FixedPointCoordinate & B) const
|
||||||
const FixedPointCoordinate & A,
|
{
|
||||||
const FixedPointCoordinate & B
|
|
||||||
) const {
|
|
||||||
double delta_long = DegreeToRadian(B.lon/COORDINATE_PRECISION - A.lon/COORDINATE_PRECISION);
|
double delta_long = DegreeToRadian(B.lon/COORDINATE_PRECISION - A.lon/COORDINATE_PRECISION);
|
||||||
|
|
||||||
const double lat1 = DegreeToRadian(A.lat/COORDINATE_PRECISION);
|
const double lat1 = DegreeToRadian(A.lat/COORDINATE_PRECISION);
|
||||||
@ -51,24 +51,42 @@ double DescriptionFactory::GetBearing(
|
|||||||
const double y = sin(delta_long) * cos(lat2);
|
const double y = sin(delta_long) * cos(lat2);
|
||||||
const double x = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(delta_long);
|
const double x = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(delta_long);
|
||||||
double result = RadianToDegree(atan2(y, x));
|
double result = RadianToDegree(atan2(y, x));
|
||||||
while(result < 0.) {
|
while (result < 0.)
|
||||||
|
{
|
||||||
result += 360.;
|
result += 360.;
|
||||||
}
|
}
|
||||||
while(result >= 360.) {
|
|
||||||
|
while (result >= 360.)
|
||||||
|
{
|
||||||
result -= 360.;
|
result -= 360.;
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DescriptionFactory::SetStartSegment(const PhantomNode & start) {
|
void DescriptionFactory::SetStartSegment(const PhantomNode & source, const bool source_traversed_in_reverse)
|
||||||
start_phantom = start;
|
{
|
||||||
|
int fwd_weight = source.forward_weight;
|
||||||
|
int rev_weight = source.reverse_weight;
|
||||||
|
int fwd_offset = source.forward_offset;
|
||||||
|
int rev_offset = source.reverse_offset;
|
||||||
|
SimpleLogger().Write(logDEBUG) << "df source, traversed in reverse: " << (source_traversed_in_reverse ? "y" : "n") << ", location: " << source.location << ", fwd_weight: " << fwd_weight << ", fwd_offset: " << fwd_offset << ", rev_weight: " << rev_weight << ", rev_offset: " << rev_offset;
|
||||||
|
SimpleLogger().Write(logDEBUG) << "duration of first segment: " << (source_traversed_in_reverse ? source.GetReverseWeightPlusOffset() : source.GetForwardWeightPlusOffset());
|
||||||
|
start_phantom = source;
|
||||||
AppendSegment(
|
AppendSegment(
|
||||||
start.location,
|
source.location,
|
||||||
PathData(0, start.name_id, 10, start.forward_weight)
|
PathData(0, source.name_id, 10, source.forward_weight)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DescriptionFactory::SetEndSegment(const PhantomNode & target) {
|
void DescriptionFactory::SetEndSegment(const PhantomNode & target, const bool target_traversed_in_reverse)
|
||||||
|
{
|
||||||
|
int fwd_weight = target.forward_weight;
|
||||||
|
int rev_weight = target.reverse_weight;
|
||||||
|
int fwd_offset = target.forward_offset;
|
||||||
|
int rev_offset = target.reverse_offset;
|
||||||
|
SimpleLogger().Write(logDEBUG) << "df target, traversed in reverse: " << (target_traversed_in_reverse ? "y" : "n") << ", location: " << target.location << ", fwd_weight: " << fwd_weight << ", fwd_offset: " << fwd_offset << ", rev_weight: " << rev_weight << ", rev_offset: " << rev_offset;
|
||||||
|
SimpleLogger().Write(logDEBUG) << "duration of last segment: " << (target_traversed_in_reverse ? target.GetReverseWeightPlusOffset() : target.GetForwardWeightPlusOffset());
|
||||||
|
|
||||||
target_phantom = target;
|
target_phantom = target;
|
||||||
pathDescription.push_back(
|
pathDescription.push_back(
|
||||||
SegmentInformation(
|
SegmentInformation(
|
||||||
@ -86,22 +104,22 @@ void DescriptionFactory::AppendSegment(
|
|||||||
const FixedPointCoordinate & coordinate,
|
const FixedPointCoordinate & coordinate,
|
||||||
const PathData & data
|
const PathData & data
|
||||||
) {
|
) {
|
||||||
if(
|
// if(
|
||||||
( 1 == pathDescription.size()) &&
|
// ( 1 == pathDescription.size()) &&
|
||||||
( pathDescription.back().location == coordinate)
|
// ( pathDescription.back().location == coordinate)
|
||||||
) {
|
// ) {
|
||||||
pathDescription.back().name_id = data.name_id;
|
// pathDescription.back().name_id = data.name_id;
|
||||||
} else {
|
// } else {
|
||||||
pathDescription.push_back(
|
pathDescription.push_back(
|
||||||
SegmentInformation(
|
SegmentInformation(
|
||||||
coordinate,
|
coordinate,
|
||||||
data.name_id,
|
data.name_id,
|
||||||
data.durationOfSegment,
|
data.durationOfSegment,
|
||||||
0,
|
0,
|
||||||
data.turnInstruction
|
data.turnInstruction
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
void DescriptionFactory::AppendEncodedPolylineString(
|
void DescriptionFactory::AppendEncodedPolylineString(
|
||||||
|
@ -87,8 +87,8 @@ public:
|
|||||||
void AppendUnencodedPolylineString(std::vector<std::string> &output) const;
|
void AppendUnencodedPolylineString(std::vector<std::string> &output) const;
|
||||||
void AppendSegment(const FixedPointCoordinate & coordinate, const PathData & data);
|
void AppendSegment(const FixedPointCoordinate & coordinate, const PathData & data);
|
||||||
void BuildRouteSummary(const double distance, const unsigned time);
|
void BuildRouteSummary(const double distance, const unsigned time);
|
||||||
void SetStartSegment(const PhantomNode & start_phantom);
|
void SetStartSegment(const PhantomNode & start_phantom, const bool source_traversed_in_reverse);
|
||||||
void SetEndSegment(const PhantomNode & start_phantom);
|
void SetEndSegment(const PhantomNode & start_phantom, const bool target_traversed_in_reverse);
|
||||||
void AppendEncodedPolylineString(
|
void AppendEncodedPolylineString(
|
||||||
const bool return_encoded,
|
const bool return_encoded,
|
||||||
std::vector<std::string> & output
|
std::vector<std::string> & output
|
||||||
@ -105,15 +105,17 @@ public:
|
|||||||
|
|
||||||
/** starts at index 1 */
|
/** starts at index 1 */
|
||||||
pathDescription[0].length = 0;
|
pathDescription[0].length = 0;
|
||||||
for(unsigned i = 1; i < pathDescription.size(); ++i)
|
for (unsigned i = 1; i < pathDescription.size(); ++i)
|
||||||
{
|
{
|
||||||
|
//move down names by one, q&d hack
|
||||||
|
pathDescription[i-1].name_id = pathDescription[i].name_id;
|
||||||
pathDescription[i].length = FixedPointCoordinate::ApproximateEuclideanDistance(pathDescription[i-1].location, pathDescription[i].location);
|
pathDescription[i].length = FixedPointCoordinate::ApproximateEuclideanDistance(pathDescription[i-1].location, pathDescription[i].location);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (unsigned i = 0; i < pathDescription.size(); ++i)
|
for (unsigned i = 0; i < pathDescription.size(); ++i)
|
||||||
{
|
{
|
||||||
const std::string name = facade->GetEscapedNameForNameID(pathDescription[0].name_id);
|
const std::string name = facade->GetEscapedNameForNameID(pathDescription[0].name_id);
|
||||||
SimpleLogger().Write(logDEBUG) << "[" << i << "] name: " << name << ", duration: " << pathDescription[i].duration << ", length: " << pathDescription[i].length << ", coordinate: " << pathDescription[i].location;
|
SimpleLogger().Write(logDEBUG) << "df [" << i << "] name: " << name << ", duration: " << pathDescription[i].duration << ", length: " << pathDescription[i].length << ", coordinate: " << pathDescription[i].location;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*Simplify turn instructions
|
/*Simplify turn instructions
|
||||||
@ -186,7 +188,7 @@ public:
|
|||||||
target_phantom.name_id = (pathDescription.end()-2)->name_id;
|
target_phantom.name_id = (pathDescription.end()-2)->name_id;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
pathDescription[segment_start_index].duration *= (1.-target_phantom.ratio);
|
// pathDescription[segment_start_index].duration *= (1.-target_phantom.ratio);
|
||||||
}
|
}
|
||||||
if(std::numeric_limits<double>::epsilon() > pathDescription[0].length) {
|
if(std::numeric_limits<double>::epsilon() > pathDescription[0].length) {
|
||||||
if(pathDescription.size() > 2) {
|
if(pathDescription.size() > 2) {
|
||||||
@ -196,7 +198,7 @@ public:
|
|||||||
start_phantom.name_id = pathDescription[0].name_id;
|
start_phantom.name_id = pathDescription[0].name_id;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
pathDescription[0].duration *= start_phantom.ratio;
|
// pathDescription[0].duration *= start_phantom.ratio;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Generalize poly line
|
//Generalize poly line
|
||||||
|
@ -99,7 +99,7 @@ public:
|
|||||||
FixedPointCoordinate current_coordinate;
|
FixedPointCoordinate current_coordinate;
|
||||||
BOOST_FOREACH(const PathData & path_data, route_leg) {
|
BOOST_FOREACH(const PathData & path_data, route_leg) {
|
||||||
current_coordinate = facade->GetCoordinateOfNode(path_data.node);
|
current_coordinate = facade->GetCoordinateOfNode(path_data.node);
|
||||||
description_factory.AppendSegment(current_coordinate, path_data );
|
description_factory.AppendSegment(current_coordinate, path_data);
|
||||||
++added_element_count;
|
++added_element_count;
|
||||||
}
|
}
|
||||||
// description_factory.SetEndSegment( leg_phantoms.target_phantom );
|
// description_factory.SetEndSegment( leg_phantoms.target_phantom );
|
||||||
@ -120,7 +120,8 @@ public:
|
|||||||
"{\"status\":"
|
"{\"status\":"
|
||||||
);
|
);
|
||||||
|
|
||||||
if(INT_MAX == raw_route.lengthOfShortestPath) {
|
if (INVALID_EDGE_WEIGHT == raw_route.lengthOfShortestPath)
|
||||||
|
{
|
||||||
//We do not need to do much, if there is no route ;-)
|
//We do not need to do much, if there is no route ;-)
|
||||||
reply.content.push_back(
|
reply.content.push_back(
|
||||||
"207,\"status_message\": \"Cannot find route between points\"}"
|
"207,\"status_message\": \"Cannot find route between points\"}"
|
||||||
@ -128,12 +129,87 @@ public:
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
description_factory.SetStartSegment(phantom_nodes.source_phantom);
|
std::string name = facade->GetEscapedNameForNameID(phantom_nodes.source_phantom.name_id);
|
||||||
|
int fwd_weight = phantom_nodes.source_phantom.forward_weight;
|
||||||
|
int rev_weight = phantom_nodes.source_phantom.reverse_weight;
|
||||||
|
int fwd_offset = phantom_nodes.source_phantom.forward_offset;
|
||||||
|
int rev_offset = phantom_nodes.source_phantom.reverse_offset;
|
||||||
|
SimpleLogger().Write(logDEBUG) << "json source: " << name << ", location: " << phantom_nodes.source_phantom.location << ", fwd_weight: " << fwd_weight << ", fwd_offset: " << fwd_offset << ", rev_weight: " << rev_weight << ", rev_offset: " << rev_offset;
|
||||||
|
name = facade->GetEscapedNameForNameID(phantom_nodes.target_phantom.name_id);
|
||||||
|
fwd_weight = phantom_nodes.target_phantom.forward_weight;
|
||||||
|
rev_weight = phantom_nodes.target_phantom.reverse_weight;
|
||||||
|
fwd_offset = phantom_nodes.target_phantom.forward_offset;
|
||||||
|
rev_offset = phantom_nodes.target_phantom.reverse_offset;
|
||||||
|
SimpleLogger().Write(logDEBUG) << "json target: " << name << ", location: " << phantom_nodes.target_phantom.location << ", fwd_weight: " << fwd_weight << ", fwd_offset: " << fwd_offset << ", rev_weight: " << rev_weight << ", rev_offset: " << rev_offset;
|
||||||
|
|
||||||
|
|
||||||
|
//TODO: replace the previous logic with this one.
|
||||||
|
|
||||||
|
//check if first segment is non-zero
|
||||||
|
std::string road_name;
|
||||||
|
int source_duration = phantom_nodes.source_phantom.GetForwardWeightPlusOffset();
|
||||||
|
SimpleLogger().Write(logDEBUG) << "-> source_traversed_in_reverse: " << (raw_route.source_traversed_in_reverse ? "y" : "n");
|
||||||
|
if (!raw_route.source_traversed_in_reverse)
|
||||||
|
{
|
||||||
|
source_duration = phantom_nodes.source_phantom.GetReverseWeightPlusOffset();
|
||||||
|
}
|
||||||
|
BOOST_ASSERT(source_duration >= 0);
|
||||||
|
road_name = facade->GetEscapedNameForNameID(phantom_nodes.source_phantom.name_id);
|
||||||
|
if (source_duration > 0)
|
||||||
|
{
|
||||||
|
SimpleLogger().Write(logDEBUG) << "adding source \"" << road_name << "\" at " << phantom_nodes.source_phantom.location << ", duration: " << source_duration;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SimpleLogger().Write(logDEBUG) << "ignoring source \"" << road_name << "\"";
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO, for each unpacked segment add the leg to the description
|
||||||
|
BOOST_ASSERT( raw_route.unpacked_path_segments.size() == raw_route.segmentEndCoordinates.size() );
|
||||||
|
|
||||||
|
for (unsigned i = 0; i < raw_route.unpacked_path_segments.size(); ++i)
|
||||||
|
{
|
||||||
|
const std::vector<PathData> & leg_path = raw_route.unpacked_path_segments[i];
|
||||||
|
const PhantomNodes & leg_phantoms = raw_route.segmentEndCoordinates[i];
|
||||||
|
SimpleLogger().Write(logDEBUG) << " Describing leg from " << leg_phantoms.source_phantom.location << " and " << leg_phantoms.target_phantom.location;
|
||||||
|
FixedPointCoordinate current_coordinate;
|
||||||
|
BOOST_FOREACH(const PathData & path_data, leg_path)
|
||||||
|
{
|
||||||
|
current_coordinate = facade->GetCoordinateOfNode(path_data.node);
|
||||||
|
road_name = facade->GetEscapedNameForNameID(path_data.name_id);
|
||||||
|
SimpleLogger().Write(logDEBUG) << " adding way point for \"" << road_name << "\" at " << current_coordinate << ", duration: " << path_data.durationOfSegment;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//check if last segment is non-zero
|
||||||
|
road_name = facade->GetEscapedNameForNameID(phantom_nodes.target_phantom.name_id);
|
||||||
|
|
||||||
|
int target_duration = phantom_nodes.target_phantom.GetForwardWeightPlusOffset();
|
||||||
|
if (raw_route.target_traversed_in_reverse)
|
||||||
|
{
|
||||||
|
target_duration = phantom_nodes.target_phantom.GetReverseWeightPlusOffset();
|
||||||
|
}
|
||||||
|
BOOST_ASSERT(target_duration >= 0);
|
||||||
|
|
||||||
|
if (target_duration > 0)
|
||||||
|
{
|
||||||
|
SimpleLogger().Write(logDEBUG) << "adding target \"" << road_name << "\" at " << phantom_nodes.target_phantom.location << ", duration: " << target_duration;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SimpleLogger().Write(logDEBUG) << "ignoring target \"" << road_name << "\"";
|
||||||
|
}
|
||||||
|
SimpleLogger().Write(logDEBUG) << "-> target_traversed_in_reverse: " << (raw_route.target_traversed_in_reverse ? "y" : "n");
|
||||||
|
|
||||||
|
//END OF TODO
|
||||||
|
|
||||||
|
description_factory.SetStartSegment(phantom_nodes.source_phantom, raw_route.source_traversed_in_reverse);
|
||||||
reply.content.push_back("0,"
|
reply.content.push_back("0,"
|
||||||
"\"status_message\": \"Found route between points\",");
|
"\"status_message\": \"Found route between points\",");
|
||||||
|
|
||||||
BOOST_ASSERT( raw_route.unpacked_path_segments.size() == raw_route.segmentEndCoordinates.size() );
|
BOOST_ASSERT( raw_route.unpacked_path_segments.size() == raw_route.segmentEndCoordinates.size() );
|
||||||
for( unsigned i = 0; i < raw_route.unpacked_path_segments.size(); ++i ) {
|
for (unsigned i = 0; i < raw_route.unpacked_path_segments.size(); ++i)
|
||||||
|
{
|
||||||
const int added_segments = DescribeLeg(
|
const int added_segments = DescribeLeg(
|
||||||
raw_route.unpacked_path_segments[i],
|
raw_route.unpacked_path_segments[i],
|
||||||
raw_route.segmentEndCoordinates[i]
|
raw_route.segmentEndCoordinates[i]
|
||||||
@ -143,7 +219,7 @@ public:
|
|||||||
added_segments + shortest_leg_end_indices.back()
|
added_segments + shortest_leg_end_indices.back()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
description_factory.SetEndSegment(phantom_nodes.target_phantom);
|
description_factory.SetEndSegment(phantom_nodes.target_phantom, raw_route.target_traversed_in_reverse);
|
||||||
description_factory.Run(facade, config.zoom_level);
|
description_factory.Run(facade, config.zoom_level);
|
||||||
|
|
||||||
reply.content.push_back("\"route_geometry\": ");
|
reply.content.push_back("\"route_geometry\": ");
|
||||||
@ -195,14 +271,16 @@ public:
|
|||||||
|
|
||||||
//only one alternative route is computed at this time, so this is hardcoded
|
//only one alternative route is computed at this time, so this is hardcoded
|
||||||
|
|
||||||
if(raw_route.lengthOfAlternativePath != INT_MAX) {
|
|
||||||
alternate_descriptionFactory.SetStartSegment(phantom_nodes.source_phantom);
|
if(raw_route.lengthOfAlternativePath != INVALID_EDGE_WEIGHT)
|
||||||
|
{
|
||||||
|
alternate_descriptionFactory.SetStartSegment(phantom_nodes.source_phantom, raw_route.alt_source_traversed_in_reverse);
|
||||||
//Get all the coordinates for the computed route
|
//Get all the coordinates for the computed route
|
||||||
BOOST_FOREACH(const PathData & path_data, raw_route.unpacked_alternative) {
|
BOOST_FOREACH(const PathData & path_data, raw_route.unpacked_alternative) {
|
||||||
current = facade->GetCoordinateOfNode(path_data.node);
|
current = facade->GetCoordinateOfNode(path_data.node);
|
||||||
alternate_descriptionFactory.AppendSegment(current, path_data );
|
alternate_descriptionFactory.AppendSegment(current, path_data );
|
||||||
}
|
}
|
||||||
alternate_descriptionFactory.SetEndSegment(phantom_nodes.target_phantom);
|
alternate_descriptionFactory.SetEndSegment(phantom_nodes.target_phantom, raw_route.alt_target_traversed_in_reverse);
|
||||||
}
|
}
|
||||||
alternate_descriptionFactory.Run(facade, config.zoom_level);
|
alternate_descriptionFactory.Run(facade, config.zoom_level);
|
||||||
|
|
||||||
|
@ -316,8 +316,9 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
//Unpack shortest path and alternative, if they exist
|
//Unpack shortest path and alternative, if they exist
|
||||||
if( INVALID_EDGE_WEIGHT != upper_bound_to_shortest_path_distance ) {
|
if( INVALID_EDGE_WEIGHT != upper_bound_to_shortest_path_distance )
|
||||||
BOOST_ASSERT( !packed_shortest_path.empty() );
|
{
|
||||||
|
BOOST_ASSERT(!packed_shortest_path.empty());
|
||||||
raw_route_data.unpacked_path_segments.resize(1);
|
raw_route_data.unpacked_path_segments.resize(1);
|
||||||
// SimpleLogger().Write() << "fwd offset1: " << phantom_node_pair.source_phantom.fwd_segment_position;
|
// SimpleLogger().Write() << "fwd offset1: " << phantom_node_pair.source_phantom.fwd_segment_position;
|
||||||
// SimpleLogger().Write() << "fwd offset2: " << phantom_node_pair.source_phantom.rev_segment_position;
|
// SimpleLogger().Write() << "fwd offset2: " << phantom_node_pair.source_phantom.rev_segment_position;
|
||||||
@ -332,6 +333,9 @@ public:
|
|||||||
// SimpleLogger().Write(logDEBUG) << "phantom_node_pair.target_phantom.packed_geometry_id: " << phantom_node_pair.target_phantom.packed_geometry_id;
|
// SimpleLogger().Write(logDEBUG) << "phantom_node_pair.target_phantom.packed_geometry_id: " << phantom_node_pair.target_phantom.packed_geometry_id;
|
||||||
// SimpleLogger().Write(logDEBUG) << "packed_shortest_path.back(): " << packed_shortest_path.back();
|
// SimpleLogger().Write(logDEBUG) << "packed_shortest_path.back(): " << packed_shortest_path.back();
|
||||||
|
|
||||||
|
raw_route_data.source_traversed_in_reverse = (packed_shortest_path.front() != phantom_node_pair.source_phantom.forward_node_id);
|
||||||
|
raw_route_data.target_traversed_in_reverse = (packed_shortest_path.back() != phantom_node_pair.target_phantom.forward_node_id);
|
||||||
|
|
||||||
super::UnpackPath(
|
super::UnpackPath(
|
||||||
// -- packed input
|
// -- packed input
|
||||||
packed_shortest_path,
|
packed_shortest_path,
|
||||||
@ -357,6 +361,9 @@ public:
|
|||||||
packed_alternate_path
|
packed_alternate_path
|
||||||
);
|
);
|
||||||
|
|
||||||
|
raw_route_data.source_traversed_in_reverse = (packed_alternate_path.front() != phantom_node_pair.source_phantom.forward_node_id);
|
||||||
|
raw_route_data.target_traversed_in_reverse = (packed_alternate_path.back() != phantom_node_pair.target_phantom.forward_node_id);
|
||||||
|
|
||||||
// unpack the alternate path
|
// unpack the alternate path
|
||||||
super::UnpackPath(
|
super::UnpackPath(
|
||||||
packed_alternate_path,
|
packed_alternate_path,
|
||||||
|
@ -186,6 +186,7 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if( SPECIAL_EDGEID == smaller_edge_id ){
|
if( SPECIAL_EDGEID == smaller_edge_id ){
|
||||||
|
SimpleLogger().Write() << "checking reverse";
|
||||||
for(
|
for(
|
||||||
EdgeID edge_id = facade->BeginEdges(edge.second);
|
EdgeID edge_id = facade->BeginEdges(edge.second);
|
||||||
edge_id < facade->EndEdges(edge.second);
|
edge_id < facade->EndEdges(edge.second);
|
||||||
@ -234,6 +235,9 @@ public:
|
|||||||
|
|
||||||
const int start_index = ( unpacked_path.empty() ? ( ( start_traversed_in_reverse ) ? id_vector.size() - phantom_node_pair.source_phantom.fwd_segment_position - 1 : phantom_node_pair.source_phantom.fwd_segment_position ) : 0 );
|
const int start_index = ( unpacked_path.empty() ? ( ( start_traversed_in_reverse ) ? id_vector.size() - phantom_node_pair.source_phantom.fwd_segment_position - 1 : phantom_node_pair.source_phantom.fwd_segment_position ) : 0 );
|
||||||
const int end_index = id_vector.size();
|
const int end_index = id_vector.size();
|
||||||
|
std::string name = facade->GetEscapedNameForNameID(name_index);
|
||||||
|
SimpleLogger().Write(logDEBUG) << "compressed via segment " << name << " from [" << start_index << "," << end_index << "]";
|
||||||
|
|
||||||
|
|
||||||
BOOST_ASSERT( start_index >= 0 );
|
BOOST_ASSERT( start_index >= 0 );
|
||||||
BOOST_ASSERT( start_index <= end_index );
|
BOOST_ASSERT( start_index <= end_index );
|
||||||
@ -293,7 +297,7 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// SimpleLogger().Write(logDEBUG) << "fetching from [" << start_index << "," << end_index << "]";
|
SimpleLogger().Write(logDEBUG) << "fetching target segment from [" << start_index << "," << end_index << "]";
|
||||||
|
|
||||||
BOOST_ASSERT( start_index >= 0 );
|
BOOST_ASSERT( start_index >= 0 );
|
||||||
for(
|
for(
|
||||||
@ -302,10 +306,10 @@ public:
|
|||||||
( start_index < end_index ? ++i :--i)
|
( start_index < end_index ? ++i :--i)
|
||||||
) {
|
) {
|
||||||
BOOST_ASSERT( i >= -1 );
|
BOOST_ASSERT( i >= -1 );
|
||||||
// if ( i >= 0 )
|
if ( i >= 0 )
|
||||||
// {
|
{
|
||||||
// SimpleLogger().Write(logDEBUG) << "[" << i << "]" << facade->GetCoordinateOfNode(id_vector[i]);
|
SimpleLogger().Write(logDEBUG) << "target [" << i << "]" << facade->GetCoordinateOfNode(id_vector[i]);
|
||||||
// }
|
}
|
||||||
unpacked_path.push_back(
|
unpacked_path.push_back(
|
||||||
PathData(
|
PathData(
|
||||||
id_vector[i],
|
id_vector[i],
|
||||||
@ -316,6 +320,11 @@ public:
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
BOOST_FOREACH(const PathData & path_data, unpacked_path)
|
||||||
|
{
|
||||||
|
std::string name = facade->GetEscapedNameForNameID(path_data.name_id);
|
||||||
|
SimpleLogger().Write(logDEBUG) << "{up} " << facade->GetCoordinateOfNode(path_data.node) << ", name: " << name;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void UnpackEdge(
|
inline void UnpackEdge(
|
||||||
|
@ -362,17 +362,22 @@ public:
|
|||||||
++current_leg;
|
++current_leg;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( distance1 > distance2 ) {
|
if (distance1 > distance2)
|
||||||
|
{
|
||||||
std::swap( packed_legs1, packed_legs2 );
|
std::swap( packed_legs1, packed_legs2 );
|
||||||
}
|
}
|
||||||
raw_route_data.unpacked_path_segments.resize( packed_legs1.size() );
|
raw_route_data.unpacked_path_segments.resize( packed_legs1.size() );
|
||||||
// const int start_offset = ( packed_legs1[0].front() == phantom_nodes_vector.front().source_phantom.forward_node_id ? 1 : -1 )*phantom_nodes_vector.front().source_phantom.fwd_segment_position;
|
// const int start_offset = ( packed_legs1[0].front() == phantom_nodes_vector.front().source_phantom.forward_node_id ? 1 : -1 )*phantom_nodes_vector.front().source_phantom.fwd_segment_position;
|
||||||
|
|
||||||
for(unsigned i = 0; i < packed_legs1.size(); ++i){
|
raw_route_data.source_traversed_in_reverse = (packed_legs1.front().front() != phantom_nodes_vector.front().source_phantom.forward_node_id);
|
||||||
BOOST_ASSERT( !phantom_nodes_vector.empty() );
|
raw_route_data.target_traversed_in_reverse = (packed_legs1.back().back() != phantom_nodes_vector.back().target_phantom.forward_node_id);
|
||||||
|
|
||||||
|
for (unsigned i = 0; i < packed_legs1.size(); ++i)
|
||||||
|
{
|
||||||
|
BOOST_ASSERT(!phantom_nodes_vector.empty());
|
||||||
// const bool at_beginning = (packed_legs1[i] == packed_legs1.front());
|
// const bool at_beginning = (packed_legs1[i] == packed_legs1.front());
|
||||||
// const bool at_end = (packed_legs1[i] == packed_legs1.back());
|
// const bool at_end = (packed_legs1[i] == packed_legs1.back());
|
||||||
BOOST_ASSERT(packed_legs1.size() == raw_route_data.unpacked_path_segments.size() );
|
BOOST_ASSERT(packed_legs1.size() == raw_route_data.unpacked_path_segments.size());
|
||||||
|
|
||||||
PhantomNodes unpack_phantom_node_pair = phantom_nodes_vector[i];
|
PhantomNodes unpack_phantom_node_pair = phantom_nodes_vector[i];
|
||||||
// if (!at_beginning)
|
// if (!at_beginning)
|
||||||
|
Loading…
Reference in New Issue
Block a user