目录
前言
GraphHopper使用的是A*算法,能够在离线的情况下计算出步行、骑行和汽车等出行方式,可以按照最短路程和最快到达时间来计算得出出行的最佳路线。
一、前期准备
首先我们需要Java SpringBoot项目 + GraphHopper 实现地图多途径点离线路径规划_springboot graphhopper-CSDN博客用到该项目的基础代码。就是把他的项目从git上拉下来或者自己创建一个springboot项目,照着他的上面写,最后能够运行成功即可,这里我就直接从他的git上拉去项目了。
点击他的git传送门。
点击(克隆/下载)按钮。
我们使用idea所以把他的链接复制下来。
按照顺序点击。
将链接复制进去。
点击克隆将代码拷贝下来。
然后运行springboot项目
看到占用我的8080端口,我们在resources文件夹下写一个application.yml配置文件。
然后我们在配置文件中把端口改成9191
二、下载全国osm文件
但是我们需要的是全国的路径规划,所以这里面的osm文件需要换一个了,需要到这里去下载全国的osm文件。
选择亚洲
选择中国下载这个1.2g的文件
这里我已经下载好了,这里就是有全国的osm路线图。
三、编写我们的项目
我们在example文件夹下新建一个config文件夹
在config文件夹下新建一个GraphConfig类
编写代码,读取配置文件中的参数。
@Data
@Configuration
@ConfigurationProperties(prefix = "graph-hopper")
public class GraphConfig {
private String filePath;
}
我这里直接在yml配置文件中修改了。
将GraphConfig类注入到MapT类中并且将OSM文件路径修改,将之前的osm图替换成全国的osm图。
这里先不着急调用程序因为程序需要读取osm文件生成新的文件,如果这里运行了,那么osm文件会很大很费时间也没有什么用并且读取osm文件生成的新文件也不是我们所指定的位置,所以这里先不要调用程序。
既然这个存储路径也是写死的那么我们就将他加入到我们的配置文件中。
我们在配置文件中新加一个存储文件的路径这个路径下的文件是由程序读取osm文件之后生成的文件。
然后来到GraphConfig类中将新加上的存储文件路径写进去。
@Data
@Configuration
@ConfigurationProperties(prefix = "graph-hopper")
public class GraphConfig {
private String filePath;
private String storePath;
}
我们到MapT类中把存储文件的路径修改一下。
如果我们现在调用该接口那么就会加载好久因为这里是全国的路线图,并且生成很多个文件。
这些都是osm生成的文件,可以看到有一个properties文件,这个文件是配置文件里面可以配置相关信息。
我们可以提前先打开看一下。
程序运行的时候会加载读取该配置文件,这个可以先提前了解。
这回我们就可以得到全国的路径规划了。
我们可以拿到坐标点去地图上看一下,我们可以先生成所有的坐标点用excel来获取然后通过该软件来查看路径规划是否正确。
这个软件可以先下载一下,能够帮助我们看到路径规划是否正确。有别的软件能够代替也可以,我暂时使用的是这个软件来查看路径规划的是否正确。
地图下载软件LSV_地图下载器下载_LocaSpaceViewer(LSV)
我们在meavn中添加poi,然后刷新我们的meavn。
然后新建一个excel的表单
//到处excel
//创建工作表单
//创建Excel对象
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet("对象报表");
int count = 0;
然后在获取到路径时把路径加到我们的excel表格中。
//创建HSSFRow对象 (行)
HSSFRow row = sheet.createRow(count++);
//创建HSSFCell对象 (单元格)
HSSFCell cell = row.createCell(0);
//设置单元格的值
cell.setCellValue(pointList.getLon(j));
//创建HSSFCell对象 (单元格)
HSSFCell cell1 = row.createCell(1);
//设置单元格的值
cell1.setCellValue(pointList.getLat(j));
然后我们需要输出excel表格,我们现在配置文件中写上excel表格的路径地址。
server:
port: 9191
graph-hopper:
file-path: D:/offline-path-planning/map_osm/china-latest.osm.pbf
store-path: D:/offline-path-planning/china-latest/
excel-path: D:/offline-path-planning/excel/abc.xls
然后在GraphConfig中添加上excel地址。
@Data
@Configuration
@ConfigurationProperties(prefix = "graph-hopper")
public class GraphConfig {
private String filePath;
private String storePath;
private String excelPath;
}
然后我们在MapT中,在路径点位循环完毕我们可以输出excel。
if (Objects.nonNull(graphConfig.getExcelPath())) {
//输出Excel文件
FileOutputStream output = null;
try {
output = new FileOutputStream(graphConfig.getExcelPath());
workbook.write(output);
output.flush();
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
我们打开locaspace这个软件
我们先选取两个点位的经纬度。
将获取的经纬度添加到postman或者apifox中
这是我们运行的话会发现报错误。
如果选择的是城市之间的点位应该不会报错,因为城市之间点位都在道路的搜索范围内,这个程序里有一个默认的道路搜索范围,如果超过这个搜索范围他就会显示不存在,就相当于我们可以在北京和上海之间选择点位就不会报错了。
那我们上面的为什么报错呢,是因为我们上面的选择的应该是两个离主干道路比较远的地方虽然我们的osm文件是全国的道路图,但是还是有的地方是搜不到的,比如新疆的沙漠,如果我把点位定到新疆的沙漠地方,那么就不会搜索到了,因为距离osm文件里的道路很远,所以我们需要扩大道路的搜索范围。
我们在配置文件中新加一个最大的搜索范围,我们给他设置成400。
server:
port: 9191
graph-hopper:
file-path: D:/offline-path-planning/map_osm/china-latest.osm.pbf
store-path: D:/offline-path-planning/china-latest/car_fastest
excel-path: D:/offline-path-planning/excel/abc.xls
max-region-search: 400
在GraphConfig配置类中也写上对应的。
@Data
@Configuration
@ConfigurationProperties(prefix = "graph-hopper")
public class GraphConfig {
private String filePath;
private String storePath;
private String excelPath;
private Integer maxRegionSearch;
}
在MapT类中设置最大的搜索范围。
LocationIndex locationIndex = hopper.getLocationIndex();
if (locationIndex instanceof LocationIndexTree) {
((LocationIndexTree) locationIndex).setMaxRegionSearch(graphConfig.getMaxRegionSearch());
}
这样我们重新运行,就不报错误了。
我们可以试试定位到沙漠中。
这个地方应该够极端了吧。
也不报错,没有问题。
四、检查路线
我们找到生成的excel文件的位置。
用excel表单来打开文件,生成了许多的经纬度坐标。
这些点位连接起来就是我们的路径规划的线了。
使用我们的工具将他们可视化出来。
首先点击用excel转换成kml。
点击打开XLS按钮
选择我们生成的文件所在地
经纬度开始行选择第一行
经纬度显示格式选择小数
选择精度在第一列纬度在第二列
然后点击生成线
给生成的线路文件起一个名字
直接预览结果
我们点击左侧的图层,找到我们刚才保存的文件。
右键路线1点击(属性/编辑)
点击样式,把路线的颜色设置成为红色,然后将线条宽度设置成10。
我们就可以看到这两个地方的路径规划了。
我们放大来看确实是有路的
但是沙漠哪里就没有办法了,这个应该会找个里的近的路线走过去。
总结
编写路径规划相关的代码,巩固了我之前的项目遇到的难点,这个项目还需要完善一下,比如不应该在接口调用的时候才加载GraphHopper类,还需要用到缓存,能够查找更快,还有障碍、如何路线避障,用线程池之类的,我就先写这些。