Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用OSM数据时方式之间的脱机路由断开问题_C++_Openstreetmap_Osmium - Fatal编程技术网

C++ 使用OSM数据时方式之间的脱机路由断开问题

C++ 使用OSM数据时方式之间的脱机路由断开问题,c++,openstreetmap,osmium,C++,Openstreetmap,Osmium,我有我的城市的osm文件,我使用Libosmium来读取它,我将每种方式的节点存储为图形的顶点,在每种方式的每两个相邻节点之间生成边,并计算它们之间的欧氏距离 问题在于: 这两种方式之间没有联系!我不能从火车站到达目的地 源代码,虽然谷歌地图上有一条路线,但是没有节点相交,没有公共节点,所以我无法到达目的地!我应该向图表中添加哪些节点,以及如何正确桥接它们?所以我可以从我的节点到达我的目的地? 我用来创建边的代码如下 // Loop the Whole Map of Ways for ( i

我有我的城市的osm文件,我使用Libosmium来读取它,我将每种方式的节点存储为图形的顶点,在每种方式的每两个相邻节点之间生成边,并计算它们之间的欧氏距离

问题在于: 这两种方式之间没有联系!我不能从火车站到达目的地 源代码,虽然谷歌地图上有一条路线,但是没有节点相交,没有公共节点,所以我无法到达目的地!我应该向图表中添加哪些节点,以及如何正确桥接它们?所以我可以从我的节点到达我的目的地? 我用来创建边的代码如下

// 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

如何从OSM XML构建路由图已在此处得到解答:。引述以下答案:

假设您只需要道路,则可能的算法如下:

全方位解析;扔掉那些不是道路的,对于其他的,通过增加一个链接记住它们组成的节点ID 引用的每个节点的计数器。 第二次解析所有方法;一条路径通常会变成一条边,但如果除了第一条和最后一条之外的任何节点都有一个链接计数器 大于1,然后在该点将道路分割为两条边。 链接计数器为1且既不是第一个也不是最后一个的节点 可以丢弃,除非需要计算边的长度。 如果需要图形节点的几何图形,请立即解析XML的节点部分,记录所需的所有节点的坐标 保留。 如果您只处理一个小数据集,那么您当然可以 将所有内容读入内存,并在内存中进行上述分析

根据您的描述,您忘记了在不同的方式之间创建边。如果路径共享一个节点,则它们彼此连接。为了在布线图中创建正确的边,需要在每个节点上拆分一条由多条路径共享的路径


另请参见OSM wiki。

如何从OSM XML构建路由图已在此处得到解答:。引述以下答案:

假设您只需要道路,则可能的算法如下:

全方位解析;扔掉那些不是道路的,对于其他的,通过增加一个链接记住它们组成的节点ID 引用的每个节点的计数器。 第二次解析所有方法;一条路径通常会变成一条边,但如果除了第一条和最后一条之外的任何节点都有一个链接计数器 大于1,然后在该点将道路分割为两条边。 链接计数器为1且既不是第一个也不是最后一个的节点 可以丢弃,除非需要计算边的长度。 如果需要图形节点的几何图形,请立即解析XML的节点部分,记录所需的所有节点的坐标 保留。 如果您只处理一个小数据集,那么您当然可以 将所有内容读入内存,并在内存中进行上述分析

根据您的描述,您忘记了在不同的方式之间创建边。如果路径共享一个节点,则它们彼此连接。为了在布线图中创建正确的边,需要在每个节点上拆分一条由多条路径共享的路径


另请参见OSM wiki。

我编辑了我的问题,添加了代码,以便您可以告诉我这是否正确?我在两个相邻的节点之间以相同的方式创建了一条边,因为我的图很小,但我没有链接路径,假设如果两条路径之间有一个公共节点相交,那么在路径库之间将有边链接,不幸的是,我不熟悉libosmium。使用一个非常小的示例输入文件,例如使用OSM编辑器(如JOSM)查看其图形,然后将其与代码的结果进行比较。找出差异并找出代码的相关部分。OSM文件中的问题是,方法之间没有交叉点!两种方式之间没有公共节点!Libosmium只是一个用于读取osm文件的库。如果数据错误,则无法在代码中修复它。然而,你应该检查数据是否真的错了,或者你只是在解释错误。您可以显示指向缺少连接的路径或节点的链接,或指向上区域的链接吗?问题已解决,这是我的问题,我选择了错误的节点作为开始和目标。我编辑了我的问题,添加了代码,以便您可以告诉我这是否正确?我在两个相邻的节点之间以相同的方式创建了一条边,因为我的图很小,但我没有链接路径,假设如果两条路径之间有一个公共节点相交,那么在路径库之间将有边链接,不幸的是,我不熟悉libosmium。使用一个非常小的示例输入文件,例如使用OSM编辑器(如JOSM)查看其图形,然后将其与代码的结果进行比较。找出差异和数字
找出代码的相关部分。解决OSM文件中的问题,方法之间没有交叉点!两种方式之间没有公共节点!Libosmium只是一个用于读取osm文件的库。如果数据错误,则无法在代码中修复它。然而,你应该检查数据是否真的错了,或者你只是在解释错误。您可以显示到缺少连接的路径或节点的链接,或者到上一区域的链接吗?问题已解决,这是我的问题,我选择了错误的节点作为开始和目标。