计算道路最短路径的经典方法是 Dijkstra 算法, 人们在长期的使用过程中感到其算法结构过于复杂且效率较低, 所以对 Dijkstra 算法进行改进产生了大量的 Dijkstra 变种算法, 从而使最短路径计算的效率有了很大的提高. 但无论是怎样的变种算法都需要建立全范围的道路拓扑网络, 并将这个范围内的拓扑关系映射到计算机内存中, 然后在内存中进行最短路径道路计算.
在现实情况下国家各经济部门经常需要进行大范围的交通网查询, 物流部门需要跨市跨省进行交通运输, 旅游部门需要到远离市区的旅游景点, 包括私人用户也经常需要驱车到另外的城市, 此时的道路计算所需要的拓扑网络就不能只限于一个城市或一块区域, 它涉及到的道路网络是大面积的.
以全国道路交通网为例, 如果要查询从武汉大学校门口到北京天安门的最短路径, 首先要建立武汉到北京区域范围内的道路拓扑网络, 此网络包括武汉和北京之间的所有城市道路网以及城市间的公路网, 此道路网络的节点数是百万级, 拓扑网络还包括节点和连接边的关系, 以及上述的连接边属性和转弯规制, 当然在实际应用中若涉及到其他城市数据量会线性增加, 若建立全国范围的道路拓扑网络, 节点数是千万级. 无论采用哪种Dijkstra 变种算法, 其拓扑网络的数据量都是海量级的, 而普通 PC 机的内存非常有限, 并且若在内存量更小的 PDA 这样的嵌入式操作系统上进行道路计算, 把海量道路拓扑网映射到内存中, 并进行计算是不大现实的. 对于这样的大范围交通网的计算问题, 文中给出以下解决方案.
道路信息由点,线,弧组成
矢量数据(Vector Data)
以x,y坐标或坐标串表示的空间点、线、面等图形数据及与其相联系的有关属性数据的总称。
栅格数据(Raster Data)
按格网单元的行和列排列的、具有不同灰度值或颜色的阵列数据。栅格数据的每个元素可用行和列唯一地标识,而行和列的数目则取决于栅格的分辨率(或大小)和实体的特性。
选取地图:
获得地图经纬度网址:http://www.gpsspg.com/maps.htm
经纬度换算:https://www.17ditu.com/tool/convert.html
换算方法:
以39.928902为例,39度,0.928902乘以60,得55.73412,整数部分55是分,0.73412乘以60,得44.0472,整数部分44是秒,
建立网格数据:
东西距离
0.0043076277
0°0′15.507459720000002″
分成128块
0.0000336533
0°0′0.12115"
南北距离
0.0025687984
0°0′9.247674239999998″
分成64块
0.000040137475
0°0′0.144494″
所以分成 128 X 64 的网络块。
求当前位置 S 的最近路段
先搜索周围的8个网格中有没有路段结点,如果没有就再往外扩展查找。
如果有,假如是A,就依次搜索A点的临近结点,
然后求得3点的的三角形,
然后求得当前的位置关于三角形的中位线,
S~A 和 中位线比较,如果S~A大,就求当前S的垂线的交点,
如果小就直接是A点,就之直接从A点
求最短路径就用,Dijkstra(迪杰斯特拉)算法