1

我有我的城市的 osm 文件,我正在使用 Libosmium 来读取它,并且我将每种方式的节点存储为我的图形的顶点,并在每种方式的每个 2 个相邻节点之间制作边,并计算它们之间的欧几里德距离。

问题是:

这些方式没有相互连接!即使谷歌地图中有一条路线,我也无法从源头到达目的地,但是路径之间没有节点相交(没有公共节点),所以我无法到达目的地!我应该将哪些节点添加到我的图表中,以及如何正确桥接它们?所以我可以从我的节点到达我的目的地?
我用来创建边缘的代码如下

// Loop the Whole Map of Ways
  for ( it = MyWayMap.begin(); it != MyWayMap.end(); it++ ){
      WayCounter++;
      NodesOfWayIndex = 0; //reset Index
      //define a vector of nodes with size of Way
      vector<Vertex> WayNodes(it->second.nodeRefList.size());
      //======================================================
      // Loop The Nodes of Each way
      for(auto j = it->second.nodeRefList.begin(); j != it->second.nodeRefList.end(); ++j){

          VertexID = it->second.nodeRefList.at(NodesOfWayIndex);
          //declare Variable for Eucledean Distance
          double dist = 0;
          WayNodes[NodesOfWayIndex] = VertexID ;
          //---------------------------------------------------------------------
          // if the VertexId doesn't exist yet give back do the following
          if(BelalMap.find(VertexID) == BelalMap.end()){
              // assign idType values to the idmap
              //idmap[IdMapIndex] = VertexID;
              IdMapIndex++;
              // Fill BelalMap
              BelalMap.insert({VertexID,IdMapIndex});
              if(NodesOfWayIndex == 0) Node1 = IdMapIndex;
              else {
                  Node2 = IdMapIndex ;
                  dist = distance(WayNodes[NodesOfWayIndex - 1], WayNodes[NodesOfWayIndex]);
                  add_edge(Node1, Node2,dist,MyGraph);
                  add_edge(Node2, Node1,dist,MyGraph);
                  Node1 = Node2 ;

                } // end else
            }//end of outer if
          //--------------------------------------------------------------------
          //if the VertexId already exists give back it's Vertex number
          else {
              if(NodesOfWayIndex == 0) Node1 = BelalMap.find(VertexID)->second;
              else {
                  // Calculating Eucledan Distance Between Nodes
                  dist = distance(WayNodes[NodesOfWayIndex - 1], WayNodes[NodesOfWayIndex]);
                  Node2 = BelalMap.find(VertexID)->second;
                  add_edge(Node1, Node2,dist,MyGraph);
                  add_edge(Node2, Node1,dist,MyGraph);
                  Node1 = Node2 ;
                }// end of inner else
            }//end of outer else

          //======================================================

          // increase The indexs after iterating each node.
          NodesOfWayIndex++;
        }// end of Nodes of Way Loop
    }// end of Ways of Map Loop
4

1 回答 1

3

如何从 OSM XML 构建路由图已在此处得到解答:https ://help.openstreetmap.org/questions/19213/how-can-i-convert-an-osm-xml-file-into-a-graph -表示/19214。引用这个答案:

假设您只想要道路,那么可能的算法是这样的:

  1. 解析所有方式;扔掉那些不是道路的,而对于其他的,记住它们所包含的节点 ID,方法是为每个引用的节点增加一个“链接计数器”。
  2. 再次解析所有方式;一条路通常会成为一条边,但如果除了第一个和最后一个之外的任何节点的链接计数器大于 1,则在该点将路分成两条边。除非您需要计算边的长度,否则可以丢弃链接计数器为 1 且既不是第一个也不是最后一个的节点。
  3. (如果您的图形节点需要几何图形)现在解析 XML 的节点部分,记录您保留的所有节点的坐标。

如果您只处理一个小数据集,您当然可以简单地将所有内容读入内存并在内存中进行上述分析。

根据您的描述,您忘记在不同方式之间创建边缘。如果路径共享一个节点,它们就会相互连接。您需要在每个节点上拆分一个由多个路径共享的路径,以便在路由图中创建正确的边。

另请参阅OSM wiki 中的路由

于 2019-11-26T07:37:02.140 回答