void OSMDocument::SplitWays() { std::vector<Way*>::const_iterator it(m_Ways.begin()); std::vector<Way*>::const_iterator last(m_Ways.end()); //splitted ways get a new ID long long id=0; while(it!=last) { Way* currentWay = *it++; std::vector<Node*>::const_iterator it_node( currentWay->m_NodeRefs.begin()); std::vector<Node*>::const_iterator last_node( currentWay->m_NodeRefs.end()); Node* backNode = currentWay->m_NodeRefs.back(); while(it_node!=last_node) { Node* node = *it_node++; Node* secondNode=0; Node* lastNode=0; Way* splitted_way = new Way( ++id, currentWay->osmId, currentWay->visible ); splitted_way->name=currentWay->name; splitted_way->categories=currentWay->categories; splitted_way->oneway=currentWay->oneway; splitted_way->geom="LINESTRING("+ boost::lexical_cast<std::string>(node->lon) + " " + boost::lexical_cast<std::string>(node->lat) +","; splitted_way->AddNodeRef(node); bool found=false; if(it_node!=last_node) { while(it_node!=last_node && !found) { splitted_way->AddNodeRef(*it_node); if((*it_node)->numsOfUse>1) { found=true; secondNode = *it_node; splitted_way->AddNodeRef(secondNode); double length = getLength(node,secondNode); if(length<0) length*=-1; splitted_way->length+=length; splitted_way->geom+= boost::lexical_cast<std::string>(secondNode->lon) + " " + boost::lexical_cast<std::string>(secondNode->lat) + ")"; } else if(backNode==(*it_node)) { lastNode=*it_node++; splitted_way->AddNodeRef(lastNode); double length = getLength(node,lastNode); if(length<0) length*=-1; splitted_way->length+=length; splitted_way->geom+= boost::lexical_cast<std::string>(lastNode->lon) + " " + boost::lexical_cast<std::string>(lastNode->lat) + ")"; } else { splitted_way->geom+= boost::lexical_cast<std::string>((*it_node)->lon) + " " + boost::lexical_cast<std::string>((*it_node)->lat) + ","; *it_node++; } } } if(splitted_way->m_NodeRefs.front()!=splitted_way->m_NodeRefs.back()) m_SplittedWays.push_back(splitted_way); else { delete splitted_way; splitted_way=0; } } } } // end SplitWays
void OSMDocument::SplitWays() { while (!m_Ways.empty()) { Way* currentWay = m_Ways.back(); std::vector<Node*>::const_iterator it_node( currentWay->m_NodeRefs.begin()); std::vector<Node*>::const_iterator last_node( currentWay->m_NodeRefs.end()); Node* backNode = currentWay->m_NodeRefs.back(); while(it_node!=last_node) { Node* node = *it_node++; Node* secondNode=0; Node* lastNode=0; Way* splitted_way = new Way(node->id, ++wayid); splitted_way->m_attributes = currentWay->m_attributes; splitted_way->AddNodeRef(node); bool found=false; if(it_node!=last_node) { while(it_node!=last_node && !found) { splitted_way->AddNodeRef(*it_node); if((*it_node)->numsOfUse>1) { found=true; secondNode = *it_node; splitted_way->AddNodeRef(secondNode); } else if(backNode==(*it_node)) { lastNode=*it_node++; splitted_way->AddNodeRef(lastNode); } else { *it_node++; } } } if(splitted_way->m_NodeRefs.front()!=splitted_way->m_NodeRefs.back()) m_SplittedWays.push_back(splitted_way); else { delete splitted_way; splitted_way=0; } } m_Ways.pop_back(); delete currentWay; } } // end SplitWays
void OSMDocument::SplitWays() { std::vector<Way*>::const_iterator it(m_Ways.begin()); std::vector<Way*>::const_iterator last(m_Ways.end()); //splitted ways get a new ID long long id=0; while(it!=last) { Way* currentWay = *it++; // ITERATE THROUGH THE NODES std::vector<Node*>::const_iterator it_node( currentWay->m_NodeRefs.begin()); std::vector<Node*>::const_iterator last_node( currentWay->m_NodeRefs.end()); Node* backNode = currentWay->m_NodeRefs.back(); while(it_node!=last_node) { Node* node = *it_node++; Node* secondNode=0; Node* lastNode=0; Way* splitted_way = new Way( ++id, currentWay->visible, currentWay->osm_id ); splitted_way->name=currentWay->name; splitted_way->type=currentWay->type; splitted_way->clss=currentWay->clss; splitted_way->oneway=currentWay->oneway; std::vector<Tag*>::iterator it_tag( currentWay->m_Tags.begin() ); std::vector<Tag*>::iterator last_tag( currentWay->m_Tags.end() ); // std::cout << "Number of tags: " << currentWay->m_Tags.size() << std::endl; // std::cout << "First tag: " << currentWay->m_Tags.front()->key << ":" << currentWay->m_Tags.front()->value << std::endl; // ITERATE THROUGH THE TAGS while(it_tag!=last_tag) { Tag* tag = *it_tag++; splitted_way->AddTag(tag); } //GeometryFromText('LINESTRING('||x1||' '||y1||','||x2||' '||y2||')',4326); splitted_way->geom="LINESTRING("+ boost::lexical_cast<std::string>(node->lon) + " " + boost::lexical_cast<std::string>(node->lat) +","; splitted_way->AddNodeRef(node); bool found=false; if(it_node!=last_node) { while(it_node!=last_node && !found) { splitted_way->AddNodeRef(*it_node); if((*it_node)->numsOfUse>1) { found=true; secondNode = *it_node; splitted_way->AddNodeRef(secondNode); double length = getLength(node,secondNode); if(length<0) length*=-1; splitted_way->length+=length; splitted_way->geom+= boost::lexical_cast<std::string>(secondNode->lon) + " " + boost::lexical_cast<std::string>(secondNode->lat) + ")"; } else if(backNode==(*it_node)) { lastNode=*it_node++; splitted_way->AddNodeRef(lastNode); double length = getLength(node,lastNode); if(length<0) length*=-1; splitted_way->length+=length; splitted_way->geom+= boost::lexical_cast<std::string>(lastNode->lon) + " " + boost::lexical_cast<std::string>(lastNode->lat) + ")"; } else { splitted_way->geom+= boost::lexical_cast<std::string>((*it_node)->lon) + " " + boost::lexical_cast<std::string>((*it_node)->lat) + ","; *it_node++; } } } if(splitted_way->m_NodeRefs.front()!=splitted_way->m_NodeRefs.back()) m_SplittedWays.push_back(splitted_way); else { delete splitted_way; splitted_way=0; } } } } // end SplitWays