高德?不,用自己的导航

本文涉及的产品
应用实时监控服务-应用监控,每月50GB免费额度
可观测可视化 Grafana 版,10个用户账号 1个月
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 编写该文章的目的是在开发时需要用到自定义的路网导航,查阅高德、百度地图等相关网站后,并没有发现可自定义路网的导航,后来在Git上搜到了Graphhopper这个国外的开源软件,然后学习使用后实现了自定义路网导航的功能,现在记录一下自己的实现过程,以保存开发资料,并且帮助到需要实现相关功能的朋友。

 目录

1.编写目的

2.项目准备

2.1 openstreet账号

2.2 绘制路网数据并导出OSM路网文件

2.3 Jar包准备

3.Springboot项目搭建

3.1 配置jar包

3.2 实现graphhopper配置类

3.3 实现访问接口

4.功能测试


1.编写目的

       编写该文章的目的是在开发时需要用到自定义的路网导航,查阅高德、百度地图等相关网站后,并没有发现可自定义路网的导航,后来在Git上搜到了Graphhopper这个国外的开源软件,然后学习使用后实现了自定义路网导航的功能,现在记录一下自己的实现过程,以保存开发资料,并且帮助到需要实现相关功能的朋友。

2.项目准备

2.1 openstreet账号

       项目需要使用OpenStreet网站专属的OSM文件格式,所以需要在https://www.openstreetmap.org/进行在线的绘制(并没有找到好用的文件转换工具,并且国内相关教程也很少),这里需要自己在这个网站注册一个账号并登录。

2.2 绘制路网数据并导出OSM路网文件

       登录后点击编辑按钮进入编辑界面,在当前界面中可以绘制线并完成要素类型选择,如选择小道(这将仅在步行导航时才会生效)、小型等级外道路(车、步行、自行车),不同道路类型使用不同交通工具。

image.gif 编辑

绘制完成后点击右上角保存按钮,完成自定义路径的保存。

image.gif 编辑

然后输入更新提示信息完成数据的保存。

image.gif 编辑

在主界面点击导出按钮进入导出页面,输入经纬度坐标完成目标区域的选择或选择”手动选择目标区域”来框选目标区域(注:这里最多导出50000节点),点击导出按钮完成导出操作,导出为osm文件。

2.3 Jar包准备

这里可以去gitHub自己下载Releases · graphhopper/graphhopper · GitHub,也可以使用我使用的Jar包。在置顶资源中graphhopper-web-9.0.jar

3.Springboot项目搭建

3.1 配置jar包

将jar包复制到项目路径中,这里复制到项目的lib文件夹下,并配置pom文本地路径,配置如下:

<dependency>
    <groupId>com.graphhopper</groupId>
    <artifactId>graphhopper-web</artifactId>
    <scope>system</scope>
    <version>9.0</version>
    <systemPath>${project.basedir}/lib/graphhopper-web-9.0.jar</systemPath>
</dependency>

image.gif

3.2 实现graphhopper配置类

@Configuration
public class GraphhopperConfig {
    @Bean
    public GraphHopper graphHopper(){
    //这里定义步行导航和汽车导航的文件并指定交通工具
        List<Profile> profile=new ArrayList<Profile>();
        profile.add(new Profile("foot").setVehicle("foot"));
        profile.add(new Profile("car").setVehicle("car"));
        GraphHopper graphHopper=new GraphHopper();
        //这里配置导出的osm文件
        graphHopper.setOSMFile("osm文件路径");
       //这里配置程序启动时预处理节点文件存放位置
        graphHopper.setGraphHopperLocation("预处理节点文件存放位置");
        //使用配置文件
        graphHopper.setProfiles(profile);
        graphHopper.importOrLoad();
        return graphHopper;
    }
}

image.gif

       首先置顶要使用的交通工具,有三种交通工具为步行(foot)、汽车(car)、自行车(bike),这里使用foot和car进行测试.然后是配置osm文件路径,这里是导出的osm文件的位置.预处理存放位置为一个空文件夹,将会在程序启动时处理osm文件并缓存节点文件到该文件夹下,使用配置文件导入或者加载。(注:这里程序启动一次后除非删除缓存节点文件中的文件,否则节点文件不会更新,即更新路网数据时需先删除缓存的节点文件)。

3.3 实现访问接口

@GetMapping("/navigate")
public String navigate(@RequestParam("start") String start, @RequestParam("end") String end,@RequestParam("vehicle") String vehicle) {
    GHRequest request = new GHRequest()
            .setAlgorithm(Parameters.Algorithms.DIJKSTRA_BI) // 设置路径搜索算法
            .setProfile(vehicle)
            .addPoint(fromString(start))
            .addPoint(fromString(end));
    GHResponse response = graphHopper.route(request); // 计算路径
    if (response.hasErrors()) {
        return "Error: " + response.getErrors().get(0).getMessage();
    } else {
        System.err.println("距离:"+response.getBest().getDistance());
        System.err.println("时间:"+response.getBest().getTime());
        return convertToGeoJson(response.getBest().getPoints());
    }
}
//这里将,分割经纬度转换为GHPoint类
private GHPoint fromString(String str) {
    String[] parts = str.split(",");
    return new GHPoint(Double.parseDouble(parts[0]), Double.parseDouble(parts[1]));
}
//这里将路径转换为GeoJson
private String convertToGeoJson(PointList path) {
    JSONObject featureCollection = new JSONObject();
    featureCollection.put("type", "FeatureCollection");
    JSONArray features = new JSONArray();
    JSONObject feature = new JSONObject();
    feature.put("type", "Feature");
    Map<String,Object> properties=new HashMap<>();
    properties.put("Shape_Length",0.003024242688834029);
    feature.put("properties", properties);
    JSONObject geometry = new JSONObject();
    geometry.put("type", "LineString");
    JSONArray coordinates = new JSONArray();
    for (GHPoint point : path) {
        JSONArray coordinate = new JSONArray();
        coordinate.add(point.lon);
        coordinate.add(point.lat);
        coordinates.add(coordinate);
    }
    geometry.put("coordinates", coordinates);
    feature.put("geometry", geometry);
    features.add(feature);
    featureCollection.put("features", features);
    return featureCollection.toString();
}

image.gif

       先构建GHRequest,在该对象中传入起始点经纬度、结束点经纬度、设置使用的vehice,即选择不同的配置文件,调用route方法获取路径响应,并通过getBest()方法获取最短路径.同时在该响应对象中还可获取如路径距离、路径时间、行走方向等信息。下面的两个方法为辅助方法分别是转换为GHPoint和转换为GeoJson方法。

4.功能测试

将结果进行可视化,这里使用在线网站:https://geojson.io/

image.gif 编辑


目录
相关文章
|
4月前
|
Python
小试牛刀-Python生成solana Wallet公私钥
在使用Python开发solana应用过程中,需要生成solana Wallet公私钥,以实现后续应用操作.这里将Python生成方法进行整理,方便日后的查阅,也能帮助到实现相关功能的朋友。
129 5
|
4月前
|
区块链 数据安全/隐私保护 Python
小试牛刀-区块链WalletConnect协议数据解密
最近在学习如何使用Wallet Connect,查阅官方文档后,发现并没有太多的中文参考资料,英文直译读起来也有一些偏差,所以这边直接采用网页Demo的方式,对WC协议有了一定了解.在此进行记录,同时希望帮助到有实现相关功能的朋友.
281 4
|
4月前
|
存储 Java API
小试牛刀-SpringBoot集成SOL链
java工程师:如何在java/springboot中使用solana区块链呢?不用担心,现在solanaj来了!
144 2
|
4月前
|
存储 Java 区块链
Springboot应用开发:工具类整理
在实际的Springboot应用开发中,有很多类可作为工具类,这些类将实际开发中可能用到的重复性代码进行提取,方便在后续的开发中使用,在这里我对在开发中经常用到的工具类进行整理,方便自己之后查找,同时希望可以帮助到有实现相关功能的朋友。
257 1
|
4月前
|
算法 关系型数据库 Java
Springboot集成PostGIS完成路径规划
因为公司里需要做关于林区防火方面的项目,需要完成着火后山区路径的导航,但.....某德的功能似乎只能到达山区的边上,后边的路就需要自己完成导航了。搞了一个周终于有所效果了,也遇见了很多的坑,在此记录一下,希望以后不要踩坑。需要上述的环境才能进行路径导航,环境的搭建可以参阅
150 5
|
4月前
|
Java 关系型数据库 数据库连接
Spring Boot项目集成MyBatis Plus操作PostgreSQL全解析
集成 Spring Boot、PostgreSQL 和 MyBatis Plus 的步骤与 MyBatis 类似,只不过在 MyBatis Plus 中提供了更多的便利功能,如自动生成 SQL、分页查询、Wrapper 查询等。
391 3
|
4月前
|
监控 Java 开发工具
Springboot秒集成-视频推拉流
在工作中需要用到视频的推拉流服务,刚开始准备使用netty服务自己实现RTSP推拉流服务,但在RTSP解包时卡住,自己实现难度确实有点大,后来在网上找到了Zlm4j库,它是基于ZLMediaKit服务实现的Jna版本,可以很容易的集成到Springboot中,在此也。希望本篇博客可以帮助到想快速实现视频推拉流服务的朋友。
511 10
|
4月前
|
监控 Linux 网络安全
Linux命令大全:从入门到精通
日常使用的linux命令整理
794 13
|
4月前
|
安全 Java 数据安全/隐私保护
Springboot应用开发-SpringBootSecurity
Spring Boot Security 是 Spring 提供的安全框架,集成了身份认证和授权功能,帮助开发者快速构建安全的应用程序。本篇博客将从功能介绍到配置和实践,带您全面了解 Spring Boot Security。
866 1
Springboot应用开发-SpringBootSecurity
|
4月前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习模型、算法与应用的全方位解析
深度学习,作为人工智能(AI)的一个重要分支,已经在多个领域产生了革命性的影响。从图像识别到自然语言处理,从语音识别到自动驾驶,深度学习无处不在。本篇博客将深入探讨深度学习的模型、算法及其在各个领域的应用。
846 3