예제 #1
0
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
예제 #2
0
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
예제 #3
0
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