使用SpringBoot整合高德地图实现路线规划功能

 更新时间:2025年07月08日 09:59:36   作者:天天摸鱼的java工程师  
在日常的开发项目中,地图服务是很多系统的核心能力之一,尤其是在物流、同城配送、出行导航等领域,在近期的一个项目中,需要实现用户下单后,系统需要根据起点和终点地址,自动计算推荐路径,所以本文给大家分享了如何使用SpringBoot整合高德地图实现路线规划功能

一、业务场景分析

在日常的开发项目中,地图服务是很多系统的核心能力之一,尤其是在物流、同城配送、出行导航等领域。作为一名有多年后端开发经验的工程师,我在近期的一个项目中,需要实现以下功能:

用户下单后,系统需要根据起点和终点地址,自动计算推荐路径(驾车)与预计耗时、距离,从而用于后续调度与价格评估。

该功能涉及地图服务的路线规划接口调用。市面上的地图服务有高德、百度、腾讯等,考虑到高德地图的接口文档丰富、服务稳定、性能高、价格可控,最终选择了高德地图作为路线规划服务提供商。

二、技术实现思路

整个技术实现主要包含以下几个步骤:

  1. 申请高德地图 Web 服务的开发者 Key(AK)
  2. 理解高德路线规划 API 的接口规范
  3. 构建 Spring Boot 项目,封装 HTTP 请求调用接口
  4. 定义统一的请求与响应模型
  5. 结合业务逻辑处理路线结果,例如选择最优方案、计算耗时、距离等

三、高德地图路线规划 API 简介

高德路线规划 API 提供了多种出行方式的路线规划服务,包括驾车、公交、步行、骑行、货车导航等。

我们选择的接口是:

接口名称:驾车路线规划

接口地址https://restapi.amap.com/v3/direction/driving

请求方式:GET

核心参数

  • origin:起点经纬度(如:116.481028,39.989643)
  • destination:终点经纬度(如:116.434446,39.90816)
  • key:开发者 Key

四、Spring Boot 项目整合步骤

4.1 创建 Spring Boot 项目

使用 Spring Boot 3.x,添加以下依赖:

<dependencies>
    <!-- Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- JSON处理 -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
    </dependency>

    <!-- Lombok 简化开发 -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

4.2 配置高德相关参数

application.yml 中添加:

gaode:
  key: your_amap_api_key    # 替换为你自己的高德Key
  driving-url: https://restapi.amap.com/v3/direction/driving

4.3 构建配置类

@Configuration
@ConfigurationProperties(prefix = "gaode")
@Data
public class GaoDeConfig {
    private String key;
    private String drivingUrl;
}

五、封装路线规划服务

5.1 创建路线请求与响应模型

@Data
@AllArgsConstructor
@NoArgsConstructor
public class RouteRequest {
    private String origin;      // 起点坐标 - 格式:经度,纬度
    private String destination; // 终点坐标 - 格式:经度,纬度
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class RouteResult {
    private String distance;  // 距离(单位:米)
    private String duration;  // 时间(单位:秒)
    private String strategy;  // 策略说明
}

5.2 创建 Service 调用高德接口

@Service
@RequiredArgsConstructor
public class GaoDeRouteService {

    private final GaoDeConfig config;
    private final RestTemplate restTemplate = new RestTemplate();

    public RouteResult getDrivingRoute(RouteRequest request) {
        String url = UriComponentsBuilder.fromHttpUrl(config.getDrivingUrl())
                .queryParam("origin", request.getOrigin())
                .queryParam("destination", request.getDestination())
                .queryParam("key", config.getKey())
                .queryParam("strategy", 0) // 推荐策略
                .toUriString();

        ResponseEntity<String> response = restTemplate.getForEntity(url, String.class);

        if (response.getStatusCode() == HttpStatus.OK) {
            try {
                ObjectMapper mapper = new ObjectMapper();
                JsonNode root = mapper.readTree(response.getBody());
                JsonNode route = root.path("route");
                JsonNode paths = route.path("paths");
                if (paths.isArray() && paths.size() > 0) {
                    JsonNode path = paths.get(0);
                    return new RouteResult(
                            path.path("distance").asText(),
                            path.path("duration").asText(),
                            path.path("strategy").asText()
                    );
                }
            } catch (Exception e) {
                throw new RuntimeException("解析高德路线规划响应失败", e);
            }
        }

        throw new RuntimeException("调用高德地图接口失败");
    }
}

六、提供 REST 接口供前端调用

@RestController
@RequestMapping("/api/route")
@RequiredArgsConstructor
public class RouteController {

    private final GaoDeRouteService routeService;

    @PostMapping("/driving")
    public ResponseEntity<RouteResult> getDrivingRoute(@RequestBody RouteRequest request) {
        RouteResult result = routeService.getDrivingRoute(request);
        return ResponseEntity.ok(result);
    }
}

七、Postman 测试示例

  • 请求地址POST http://localhost:8080/api/route/driving
  • 请求体
{
  "origin": "116.481028,39.989643",
  "destination": "116.434446,39.90816"
}
  • 响应示例
{
  "distance": "9346",
  "duration": "1234",
  "strategy": "推荐"
}

八、经验与优化建议

8.1 缓存策略

  • 高德接口有并发限制(QPS),建议对频繁请求的数据做缓存(例如 Redis 缓存常用路线)。

8.2 错误处理

  • 对于高德返回的错误码,要做好异常解析与日志上报,避免接口调用失败而无感知。

8.3 模块解耦

  • 建议将地图服务抽象为接口,例如 MapService,方便未来替换为腾讯地图或百度地图。

8.4 单元测试

  • 使用 MockRestServiceServer 编写单元测试,确保服务逻辑的稳定性。

九、总结

路线规划功能虽然看似简单,但涉及到外部服务调用、性能优化、错误处理等多个维度。通过本文的介绍,我们完整实现了:

  • 高德地图路线规划接口的调用
  • Spring Boot 项目的集成
  • 路由结果的业务处理与封装

这类功能在后端系统中虽然是“配角”,却是影响用户体验的关键一环。作为一名有多年经验的 Java 开发者,在处理这类接口时,除了代码实现,更要注重稳定性、可扩展性与可维护性

以上就是使用SpringBoot整合高德地图实现路线规划功能的详细内容,更多关于SpringBoot高德地图路线规划的资料请关注脚本之家其它相关文章!

相关文章

  • Java中一维二维数组的静态和动态初始化

    Java中一维二维数组的静态和动态初始化

    今天通过本文给大家分享Java中的数组,包括一维数组和二维数组的静态初始化和动态初始化问题,感兴趣的朋友一起看看吧
    2017-10-10
  • 详解Java的四种引用方式及其区别

    详解Java的四种引用方式及其区别

    这篇文章主要介绍了Java的四种引用方式 ,主要主要包括强引用,软引用,弱引用,虚引用,稍微整理精简一下做下分享,具有一定的参考价值,需要的朋友可以参考下
    2018-12-12
  • SpringBoot项目在启动后自动关闭的实现

    SpringBoot项目在启动后自动关闭的实现

    我们在写spring boot web项目时,有时会遇到启动后立即关闭的情况, 本文主要介绍了SpringBoot项目在启动后自动关闭的实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • SpringBoot+WebMagic实现网页爬虫的示例代码

    SpringBoot+WebMagic实现网页爬虫的示例代码

    本文是对spring boot+WebMagic+MyBatis做了整合,使用WebMagic爬取数据,然后通过MyBatis持久化爬取的数据到mysql数据库,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • 实例讲解String Date Calendar之间的转换

    实例讲解String Date Calendar之间的转换

    下面小编就为大家带来一篇实例讲解String Date Calendar之间的转换。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • Java中Stream流中map和forEach的区别详解

    Java中Stream流中map和forEach的区别详解

    本文主要介绍了Java中Stream流中map和forEach的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • SpringCloud zuul 网关如何解决跨域问题

    SpringCloud zuul 网关如何解决跨域问题

    这篇文章主要介绍了SpringCloud zuul网关解决跨域问题的具体实现方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • 浅谈java+内存分配及变量存储位置的区别

    浅谈java+内存分配及变量存储位置的区别

    下面小编就为大家带来一篇浅谈java+内存分配及变量存储位置的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08
  • SpringBoot内置tomcat调优测试优化

    SpringBoot内置tomcat调优测试优化

    这篇文章主要介绍了SpringBoot内置tomcat调优测试优化,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • Idea如何自定义VM配置

    Idea如何自定义VM配置

    这篇文章主要介绍了Idea如何自定义VM配置,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11

最新评论