diff --git a/include/osm/osm_way.h b/include/osm/osm_way.h index afd642b1d867bdd2c47510f0463861759c959d84..44fd39074df034f8b014b9879afd603daf6dea87 100644 --- a/include/osm/osm_way.h +++ b/include/osm/osm_way.h @@ -52,7 +52,7 @@ class COSMWay void merge(COSMWay *way); COSMWay(const osmium::Way &way,COSMMap *parent); bool is_not_connected(void); - bool load_turn_lane_tag(const osmium::Way &way,const std::string &tag,std::vector<lane_restructions_t> &restrictions); + bool load_turn_lane_tag(const osmium::Way &way,const std::string &tag,std::vector<lane_restructions_t> &restrictions,unsigned int max_lanes); void load_lane_restrictions(const osmium::Way &way); public: COSMWay(const COSMWay &object); @@ -75,6 +75,7 @@ class COSMWay unsigned int get_num_backward_lanes(void) const; bool is_one_way(void) const; double get_lane_width(void) const; + const COSMRoadSegment &get_road_segment(void) const; const COSMMap &get_parent(void) const; friend std::ostream& operator<<(std::ostream& out, COSMWay &way); ~COSMWay(); diff --git a/src/osm/osm_way.cpp b/src/osm/osm_way.cpp index 560f50dafd70a1f606976d1b71655214ff238558..3544bf56d1cc45c93d99b0a3aef5851402ab8b7a 100644 --- a/src/osm/osm_way.cpp +++ b/src/osm/osm_way.cpp @@ -21,11 +21,19 @@ COSMWay::COSMWay(const osmium::Way &way,COSMMap *parent) this->num_forward_lanes=1; else this->num_forward_lanes=std::stoi(std::string(value)); - value=way.get_value_by_key("oneway"); - if(value!=NULL) + if(this->num_forward_lanes>1) { - if(std::string(value).compare("no")==0) - this->num_backward_lanes=1; + value=way.get_value_by_key("oneway"); + if(value!=NULL) + { + if(std::string(value).compare("no")==0) + { + this->num_forward_lanes--; + this->num_backward_lanes=1; + } + else + this->num_backward_lanes=0; + } else this->num_backward_lanes=0; } @@ -79,7 +87,7 @@ COSMWay::COSMWay(const COSMWay &object) this->restrictions=object.restrictions; } -bool COSMWay::load_turn_lane_tag(const osmium::Way &way,const std::string &tag,std::vector<lane_restructions_t> &restrictions) +bool COSMWay::load_turn_lane_tag(const osmium::Way &way,const std::string &tag,std::vector<lane_restructions_t> &restrictions,unsigned int max_lanes) { const char *value; std::size_t prev_pos=0,pos; @@ -97,8 +105,11 @@ bool COSMWay::load_turn_lane_tag(const osmium::Way &way,const std::string &tag,s prev_pos=pos+1; } way_restrictions.push_back(restriction_text.substr(prev_pos)); - restrictions.resize(way_restrictions.size(),(lane_restructions_t)0); - for(unsigned int i=0;i<way_restrictions.size();i++) + if(max_lanes<way_restrictions.size()) + restrictions.resize(max_lanes,(lane_restructions_t)0); + else + restrictions.resize(way_restrictions.size(),(lane_restructions_t)0); + for(unsigned int i=0;i<way_restrictions.size() && i<max_lanes;i++) { lane_restrictions.clear(); prev_pos=0; @@ -135,38 +146,14 @@ void COSMWay::load_lane_restrictions(const osmium::Way &way) this->forward_lanes.resize(this->num_forward_lanes,(lane_restructions_t)0); this->backward_lanes.resize(this->num_backward_lanes,(lane_restructions_t)0); - if(this->load_turn_lane_tag(way,"turn:lanes",restrictions)) - { - if(restrictions.size()<this->num_forward_lanes) - throw CException(_HERE_,"Invalid number of lane restrictions for way"); - else - { - this->num_forward_lanes=restrictions.size(); - this->forward_lanes=restrictions; - } - } + if(this->load_turn_lane_tag(way,"turn:lanes",restrictions,this->num_forward_lanes)) + this->forward_lanes=restrictions; else { - if(this->load_turn_lane_tag(way,"turn:lanes:forward",restrictions)) - { - if(restrictions.size()<this->num_forward_lanes) - throw CException(_HERE_,"Invalid number of lane restrictions for way"); - else - { - this->num_forward_lanes=restrictions.size(); - this->forward_lanes=restrictions; - } - } - if(this->load_turn_lane_tag(way,"turn:lanes:backward",restrictions)) - { - if(restrictions.size()<this->num_backward_lanes) - throw CException(_HERE_,"Invalid number of lane restrictions for way"); - else - { - this->num_backward_lanes=restrictions.size(); - this->backward_lanes=restrictions; - } - } + if(this->load_turn_lane_tag(way,"turn:lanes:forward",restrictions,this->num_forward_lanes)) + this->forward_lanes=restrictions; + if(this->load_turn_lane_tag(way,"turn:lanes:backward",restrictions,this->num_backward_lanes)) + this->backward_lanes=restrictions; } } @@ -302,43 +289,54 @@ void COSMWay::update_restriction(COSMWay *old_way,COSMWay *new_way) { std::vector<COSMRestriction *>::const_iterator it; COSMRestriction *new_restriction=NULL; + bool no_u_turn=true; for(it=this->restrictions.begin();it!=this->restrictions.end();) { - if((*it)->get_action()==RESTRICTION_NO && (*it)->get_type()==RESTRICTION_U_TURN) + if(!this->has_node((*it)->get_via_node().get_id())) + it=this->restrictions.erase(it); + else + it++; + } + for(it=this->restrictions.begin();it!=this->restrictions.end();it++) + { + if(this->id==old_way->get_id()) { - if((*it)->get_from_way().get_id()==old_way->get_id() && this->id==new_way->get_id()) + if(!((*it)->get_action()==RESTRICTION_NO && (*it)->get_type()==RESTRICTION_U_TURN)) { - new_restriction=new COSMRestriction(**it); - new_restriction->id=-1; - new_restriction->update_way(old_way,new_way); + if((*it)->get_to_way().get_id()==old_way->get_id()) + (*it)->update_to_way(old_way,new_way); } - it++; + else + no_u_turn=false; } - else + else if(this->id==new_way->get_id()) { - if(this->id==old_way->get_id()) + if((*it)->get_action()==RESTRICTION_NO && (*it)->get_type()==RESTRICTION_U_TURN) { - if((*it)->get_to_way().get_id()==old_way->get_id()) - it=this->restrictions.erase(it); - else - it++; + (*it)->update_from_way(old_way,new_way); + (*it)->update_to_way(old_way,new_way); + no_u_turn=false; } - else if(this->id==new_way->get_id()) + else { if((*it)->get_from_way().get_id()==old_way->get_id()) - it=this->restrictions.erase(it); - else - it++; + (*it)->update_from_way(old_way,new_way); } } } + /* + if(!no_u_turn) + { + new_restriction= new COSMRestriction(this,,this,RESTRICTION_NO,RESTRICTION_U_TURN,this->parent); + } if(new_restriction!=NULL) { this->parent->add_restriction(new_restriction); new_way->add_restriction(new_restriction); new_restriction->via->add_restriction(new_restriction); } + */ } void COSMWay::clear_restrictions(void) @@ -394,7 +392,10 @@ void COSMWay::merge(COSMWay *way) for(unsigned int i=0;i<way->restrictions.size();i++) this->add_restriction(way->restrictions[i]); for(unsigned int i=0;i<this->restrictions.size();i++) - this->restrictions[i]->update_way(way,this); + { + this->restrictions[i]->update_to_way(way,this); + this->restrictions[i]->update_from_way(way,this); + } } bool COSMWay::is_not_connected(void) @@ -649,6 +650,11 @@ double COSMWay::get_lane_width(void) const return this->lane_width; } +const COSMRoadSegment &COSMWay::get_road_segment(void) const +{ + return *this->road_segment; +} + const COSMMap &COSMWay::get_parent(void) const { return *this->parent;