diff --git a/src/osm/osm_node.cpp b/src/osm/osm_node.cpp index f3d1dbd6bf21ee8daa199341e50c632d3076043a..5c61a6e611a5b82c9b09aadbfafa863bab5919cb 100644 --- a/src/osm/osm_node.cpp +++ b/src/osm/osm_node.cpp @@ -143,26 +143,56 @@ void COSMNode::split_ways(void) void COSMNode::remove_in_junction_nodes(void) { - double width,max_width=0.0,dist; - COSMNode *check_node; + double width,width2,dist,x,y,heading,length,start_x,start_y,end_x,end_y,cross; + COSMNode *check_node,*node1,*node2; if(this->ways.size()>1) { for(unsigned int i=0;i<this->ways.size();i++) { - width=this->ways[i]->get_num_lanes()*this->ways[i]->get_lane_width()/2.0; - if(width>max_width) - max_width=width; - } - for(unsigned int i=0;i<this->ways.size();i++) - { + width=std::max(this->ways[i]->get_num_forward_lanes(),this->ways[i]->get_num_backward_lanes())*this->ways[i]->get_lane_width(); if(this->ways[i]->is_node_first(this->id)) - check_node=(COSMNode *)&this->ways[i]->get_segment_end_node(FIRST_SEGMENT); + { + node1=(COSMNode *)&this->ways[i]->get_segment_end_node(FIRST_SEGMENT); + node2=(COSMNode *)&this->ways[i]->get_segment_start_node(FIRST_SEGMENT); + } else - check_node=(COSMNode *)&this->ways[i]->get_segment_start_node(LAST_SEGMENT); - dist=this->compute_distance(*check_node); - if(dist<max_width) - this->ways[i]->delete_node(check_node); + { + node1=(COSMNode *)&this->ways[i]->get_segment_end_node(LAST_SEGMENT); + node2=(COSMNode *)&this->ways[i]->get_segment_start_node(LAST_SEGMENT); + } + node1->get_location(start_x,start_y); + node2->get_location(end_x,end_y); + length=node1->compute_distance(*node2); + for(unsigned int j=0;j<this->ways.size();j++) + { + if(j!=i) + { + if(this->ways[j]->is_node_first(this->id)) + check_node=(COSMNode *)&this->ways[j]->get_segment_end_node(FIRST_SEGMENT); + else + check_node=(COSMNode *)&this->ways[j]->get_segment_start_node(LAST_SEGMENT); + width2=std::max(this->ways[j]->get_num_forward_lanes(),this->ways[j]->get_num_backward_lanes())*this->ways[j]->get_lane_width(); + heading=this->compute_heading(*check_node); + check_node->get_location(x,y); + x=x-width2*sin(heading); + y=y+width2*cos(heading); + cross=(x-start_x)*(end_y-start_y)-(y-start_y)*(end_x-start_x); + dist=fabs(cross)/length; + if(dist<width) + { + this->ways[j]->delete_node(check_node); + continue; + } + check_node->get_location(x,y); + x=x+width2*sin(heading); + y=y-width2*cos(heading); + cross=(x-start_x)*(end_y-start_y)-(y-start_y)*(end_x-start_x); + dist=fabs(cross)/length; + if(dist<width) + this->ways[j]->delete_node(check_node); + } + } } } }