毕业设计思路篇(一)之交通图的构建

2019-01-13 10-50-54屏幕截图.png

1. 导入道路地图

道路地图来自网络数据,已预处理为xml格式。


<?xml version='1.0' encoding='UTF-8'?>

<Roads>

  <road m_ID="71283896--1" len="620.98">

    <from lon="113.9205606" lat="22.9317667" id="848388981"/>

    <to lon="113.9260573" lat="22.9341232" id="2522072722"/>

  </road>

  <road m_ID="553852656--2" len="322.34">

    <from lon="113.9529339" lat="22.9448978" id="5345735265"/>

    <to lon="113.9516926" lat="22.9475618" id="5345735267"/>

  </road>

</Roads>

解析:一个road节点代表一条道路,len代表道路抽象长度,from,to子节点分别表示道路两端端点。

2. 解析道路数据

a. 构建交通图

赋值道路端点.


/**

*  路口类,记录着该路口的点坐标,以及其相连的方向道路节点组

 *               |           |

 *               |     |     |

 *               |  1     2  |

 *               |     |     |

 *        --------           --------

 *           3                  5

 *        - - - -            - - - -

 *           4                  6

 *        --------           --------

 *               |     |     |

 *               |  7     8  |

 *               |     |     |

 *               |           |

 *    如上图(1,2), (3,4), (5,6), (7,8)在同一个方向,我将其称为四组方向道路节点Node.

 *    其中,Node.inRoadID=1, Node.outRoadID=2;

 *         Node.inRoadID=4, Node.outRoadID=3;

 *         ...

 *         根据车辆靠右行原则以此类推.

*/

class CrossRoad {

public:

    CrossRoad(float fLon,float fLat) : m_fLat(fLat),m_fLon(fLon){};

    /**

     * 重载运算符 (==) 判断两个路口是否为同一个

     */

    bool operator==(CrossRoad &crossRoad);

    /**

     * 添加道路节点ID

     * @param in 入度

     * @param out 出度

     * @param atan2 该点与方向道路的atan2值

     */

    void addNode(int in,int out,double atan2);

public:

    //唯一标示符

    int m_nID;

    //经纬度的定义

    float m_fLon, m_fLat;

    vector<Node> JunctionRoad;

    //该路口的交通灯

    TrafficLight m_CTrafficLight_Light;

};

CrossRoad A,B

添加道路到交通图


void addRoad(Graph &Map_Graph, CrossRoad A, CrossRoad B, double length) {

    // 初始化A,B路口的索引位置为-1

    int CrossRoadSiteB = -1, CrossRoadSiteA = -1;

    auto CrossRoadNum = Map_Graph.m_CrossRoad_v.size(), RoadNum = Map_Graph.m_Road_v.size();

    //循环判断是否有重合点

    for (int i = 0; i < CrossRoadNum; i++) {

        if (Map_Graph.m_CrossRoad_v[i] == A) {

            CrossRoadSiteA = i;

        }

        if (Map_Graph.m_CrossRoad_v[i] == B) {

            CrossRoadSiteB = i;

        }

    }

    //如果不存在与A点重合的路口,添加路口,保存路口索引

    if (CrossRoadSiteA == -1) {

        Map_Graph.m_CrossRoad_v.push_back(A);

        CrossRoadSiteA = CrossRoadNum++;

        Map_Graph.m_CrossRoad_v[CrossRoadSiteA].m_nID = CrossRoadSiteA;

    }

    if (CrossRoadSiteB == -1) {

        Map_Graph.m_CrossRoad_v.push_back(B);

        CrossRoadSiteB = CrossRoadNum++;

        Map_Graph.m_CrossRoad_v[CrossRoadSiteB].m_nID = CrossRoadSiteB;

    }

    int RoadSiteA = RoadNum, RoadSiteB = RoadNum + 1;

    // 确定A,B路的site,加入模型图

    Road roadA(RoadSiteA, CrossRoadSiteA, CrossRoadSiteB, length);

    Map_Graph.m_Road_v.push_back(roadA);

    Road roadB(RoadSiteB, CrossRoadSiteB, CrossRoadSiteA, length);

    Map_Graph.m_Road_v.push_back(roadB);

    // 对接A,B路口节点数据

    Map_Graph.m_CrossRoad_v[CrossRoadSiteA].addNode(RoadSiteA, RoadSiteB,

                                                    atan2((B.m_fLat - A.m_fLat), (B.m_fLon - A.m_fLon)));

    Map_Graph.m_CrossRoad_v[CrossRoadSiteB].addNode(RoadSiteB, RoadSiteA,atan2((A.m_fLat - B.m_fLat), (A.m_fLon - B.m_fLon)));

}

解析的结果如下

road.txt

RoadTable.txt

版权声明: 本文首发于 指尖魔法屋-毕业设计思路篇(一)之交通图的构建(https://blog.thinkmoon.cn/post/70_%E6%AF%95%E4%B8%9A%E8%AE%BE%E8%AE%A1%E6%80%9D%E8%B7%AF%E7%AF%87_%E4%B8%80_%E4%B9%8B%E4%BA%A4%E9%80%9A%E5%9B%BE%E7%9A%84%E6%9E%84%E5%BB%BA/) 转载或引用必须申明原指尖魔法屋来源及源地址!