校园导航成果展示
实现方案
- 前端
前端使用高德地图显示地图信息并绘制路线路线 - 后台
后台使用邻接矩阵加弗洛伊德算法实现地图的存储和最短路径的计算,为什么不直接调用高德地图api导航呢?(因为对于像学校这种地方,地图录入的点根本就不够,导航不够精细,所以我们需要自己添加地理坐标,自己计算路径和路线)
具体实现
- 第一步自己添加点信息,将自己想要添的点录入,如图:其中信息分别代表的是点的名称,点的经度和纬度(这里的经度和纬度不能随便填写,此处我使用的坐标都是真实的,可以进高德地图的开发者模式,使用坐标拾取器获取坐标,此处就不详细阐述,高德地图坐标拾取器地址:高德地图坐标拾取器地址),将点的坐标构建好以后就可以创建点与点之间的关系了(就是把点连起来)
- 第二步构建点的关系,如图我将点的关系添加在了数据库中,每一条记录表示点1和点2之间的距离,如图所示:
- 第三步构建邻接矩阵:
创建邻接矩阵就是把点放在一维数组里面,把点与点的关系放在二维数组里面:
如图所示,点与点之间的关系放在了二维数组中,其中0表示不连通,1表示连通,按常理来说连通的地方应该表示的是两点之间的距离的,为了方便,此处我只展示了连通关系
- 第四步弗洛伊德算法增强,计算任意两点之间的距离和路径(难点):
通过算法实现了计算出了任意两点的最路径并打印最短对应的路线
- 第五步前端调用,数据回显(最终效果如文章开头)。
难点剖析
在开发过程过程中,最难的地方就是计算最短路径和最短路径路线的输出,其中弗洛伊德算法不是特别好理解,并且弗洛伊德算法中只给了计算出最短路径,最短路径对应的路线并没有给出。最终查阅大量资料(包括优快云上大佬的文章)有了解决方案(在此表示感谢,已经找不到之前的文章了,所以无法标注引用)
下面给出系统的核心代码:
package controller;
import java.util.ArrayList;
import java.util.Arrays;
public class FloydAlgorithm {
/**
* @param args//没有含义
* @param point//这个是点数组,里面存储了点的信息(名字),不同下标对应不同的点,并且点唯一
* @param arr//这个二维数组是用来表示点与点之间的连通关系
* @param end//终点
* @param start//起点
* @return // 直接调用该类的main方法,返回起点到终点的最短路径
*/
public static ArrayList main(String[] args, String[] point, int[][] arr, String end, String start) {
// 图的顶点
String[] vertex = point;
// 邻接矩阵
int[][] matrix = new int[vertex.length][vertex.length];
final int N =