Skip to content
Snippets Groups Projects
Commit 48f60596 authored by Sergi Hernandez's avatar Sergi Hernandez
Browse files

Added a function fo convert OSM junctions to Opendrive.

When creating links, make sure the minimum length of each segment is at least MIN_ROAD_LENGTH/2.0
parent 121d5e2a
No related branches found
No related tags found
1 merge request!2Solved a bug when creating a new geometry object: the sale factor is...
......@@ -6,6 +6,7 @@
#include "osm/osm_road_segment.h"
#include "g2_spline.h"
#include "opendrive_junction.h"
#include <Eigen/Dense>
......@@ -42,6 +43,7 @@ class COSMJunction
void create_links(void);
bool add_link(TOSMLink &new_link);
void generate_geometry(void);
COpendriveJunction *convert_to_opendrive(void);
public:
COSMJunction(COSMNode *node);
const COSMNode &get_parent_node(void) const;
......
......@@ -661,16 +661,18 @@ void COSMJunction::create_links(void)
in_dist=std::min(length1,length2)/2.0;
if(in_dist>DEFAULT_MIN_RADIUS)
in_dist=DEFAULT_MIN_RADIUS;
else if(in_dist<MIN_ROAD_LENGTH/2.0)
in_dist=MIN_ROAD_LENGTH/2.0;
out_dist=in_dist;
}
else
{
in_dist=(out_radius+in_radius*cos(angle))/fabs(sin(angle));
if(in_dist<0.0)
in_dist=0.0;
if(in_dist<MIN_ROAD_LENGTH/2.0)
in_dist=MIN_ROAD_LENGTH/2.0;
out_dist=(in_radius+out_radius*cos(angle))/fabs(sin(angle));
if(out_dist<0.0)
out_dist=0.0;
if(out_dist<MIN_ROAD_LENGTH/2.0)
out_dist=MIN_ROAD_LENGTH;
}
if(this->add_link(new_link))
{
......@@ -774,6 +776,52 @@ void COSMJunction::generate_geometry(void)
}
}
COpendriveJunction * COSMJunction::convert_to_opendrive(void)
{
static unsigned int junction_id=0;
unsigned int connection_index,num=0;
std::stringstream new_name;
COpendriveJunction *new_junction;
int opendrive_lane_id_in,opendrive_lane_id_out;
new_name << "junction" << junction_id;
new_junction=new COpendriveJunction(new_name.str());
for(unsigned int i=0;i<this->connections.size();i++)
{
const COSMWay &in_way=this->in_roads[i]->get_parent_way();
for(unsigned int j=0;j<this->connections[i].size();j++)
{
num=0;
const COSMWay &out_way=this->out_roads[j]->get_parent_way();
connection_index=new_junction->add_connection(in_way.get_id(),out_way.get_id(),false);
for(unsigned int k=0;k<in_way.get_num_lanes();k++)
{
if(k<in_way.get_num_forward_lanes())
opendrive_lane_id_in=k-in_way.get_num_forward_lanes();
else
opendrive_lane_id_in=k-in_way.get_num_forward_lanes()+1;
for(unsigned int l=0;l<out_way.get_num_lanes();l++)
{
if(l<out_way.get_num_forward_lanes())
opendrive_lane_id_out=l-out_way.get_num_forward_lanes();
else
opendrive_lane_id_out=l-out_way.get_num_forward_lanes()+1;
if(this->connections[i][j](k,l)==1)// link exists
{
new_junction->add_link_to_connection(connection_index,opendrive_lane_id_in,opendrive_lane_id_out);
num++;
}
}
}
if(num==0)
new_junction->delete_connection(connection_index);
}
}
junction_id++;
return new_junction;
}
const COSMNode &COSMJunction::get_parent_node(void) const
{
return *this->parent_node;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment