最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用SpringBoot整合高德地圖實現(xiàn)路線規(guī)劃功能

 更新時間:2025年07月08日 09:59:36   作者:天天摸魚的java工程師  
在日常的開發(fā)項目中,地圖服務是很多系統(tǒng)的核心能力之一,尤其是在物流、同城配送、出行導航等領域,在近期的一個項目中,需要實現(xiàn)用戶下單后,系統(tǒng)需要根據(jù)起點和終點地址,自動計算推薦路徑,所以本文給大家分享了如何使用SpringBoot整合高德地圖實現(xiàn)路線規(guī)劃功能

一、業(yè)務場景分析

在日常的開發(fā)項目中,地圖服務是很多系統(tǒng)的核心能力之一,尤其是在物流、同城配送、出行導航等領域。作為一名有多年后端開發(fā)經(jīng)驗的工程師,我在近期的一個項目中,需要實現(xiàn)以下功能:

用戶下單后,系統(tǒng)需要根據(jù)起點和終點地址,自動計算推薦路徑(駕車)與預計耗時、距離,從而用于后續(xù)調(diào)度與價格評估。

該功能涉及地圖服務的路線規(guī)劃接口調(diào)用。市面上的地圖服務有高德、百度、騰訊等,考慮到高德地圖的接口文檔豐富、服務穩(wěn)定、性能高、價格可控,最終選擇了高德地圖作為路線規(guī)劃服務提供商。

二、技術實現(xiàn)思路

整個技術實現(xiàn)主要包含以下幾個步驟:

  1. 申請高德地圖 Web 服務的開發(fā)者 Key(AK)
  2. 理解高德路線規(guī)劃 API 的接口規(guī)范
  3. 構建 Spring Boot 項目,封裝 HTTP 請求調(diào)用接口
  4. 定義統(tǒng)一的請求與響應模型
  5. 結合業(yè)務邏輯處理路線結果,例如選擇最優(yōu)方案、計算耗時、距離等

三、高德地圖路線規(guī)劃 API 簡介

高德路線規(guī)劃 API 提供了多種出行方式的路線規(guī)劃服務,包括駕車、公交、步行、騎行、貨車導航等。

我們選擇的接口是:

接口名稱:駕車路線規(guī)劃

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

請求方式:GET

核心參數(shù)

  • origin:起點經(jīng)緯度(如:116.481028,39.989643)
  • destination:終點經(jīng)緯度(如:116.434446,39.90816)
  • key:開發(fā)者 Key

四、Spring Boot 項目整合步驟

4.1 創(chuàng)建 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 簡化開發(fā) -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

4.2 配置高德相關參數(shù)

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;
}

五、封裝路線規(guī)劃服務

5.1 創(chuàng)建路線請求與響應模型

@Data
@AllArgsConstructor
@NoArgsConstructor
public class RouteRequest {
    private String origin;      // 起點坐標 - 格式:經(jīng)度,緯度
    private String destination; // 終點坐標 - 格式:經(jīng)度,緯度
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class RouteResult {
    private String distance;  // 距離(單位:米)
    private String duration;  // 時間(單位:秒)
    private String strategy;  // 策略說明
}

5.2 創(chuàng)建 Service 調(diào)用高德接口

@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("解析高德路線規(guī)劃響應失敗", e);
            }
        }

        throw new RuntimeException("調(diào)用高德地圖接口失敗");
    }
}

六、提供 REST 接口供前端調(diào)用

@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": "推薦"
}

八、經(jīng)驗與優(yōu)化建議

8.1 緩存策略

  • 高德接口有并發(fā)限制(QPS),建議對頻繁請求的數(shù)據(jù)做緩存(例如 Redis 緩存常用路線)。

8.2 錯誤處理

  • 對于高德返回的錯誤碼,要做好異常解析與日志上報,避免接口調(diào)用失敗而無感知。

8.3 模塊解耦

  • 建議將地圖服務抽象為接口,例如 MapService,方便未來替換為騰訊地圖或百度地圖。

8.4 單元測試

  • 使用 MockRestServiceServer 編寫單元測試,確保服務邏輯的穩(wěn)定性。

九、總結

路線規(guī)劃功能雖然看似簡單,但涉及到外部服務調(diào)用、性能優(yōu)化、錯誤處理等多個維度。通過本文的介紹,我們完整實現(xiàn)了:

  • 高德地圖路線規(guī)劃接口的調(diào)用
  • Spring Boot 項目的集成
  • 路由結果的業(yè)務處理與封裝

這類功能在后端系統(tǒng)中雖然是“配角”,卻是影響用戶體驗的關鍵一環(huán)。作為一名有多年經(jīng)驗的 Java 開發(fā)者,在處理這類接口時,除了代碼實現(xiàn),更要注重穩(wěn)定性、可擴展性與可維護性。

以上就是使用SpringBoot整合高德地圖實現(xiàn)路線規(guī)劃功能的詳細內(nèi)容,更多關于SpringBoot高德地圖路線規(guī)劃的資料請關注腳本之家其它相關文章!

相關文章

  • java8新特性將List中按指定屬性排序過濾重復數(shù)據(jù)的方法

    java8新特性將List中按指定屬性排序過濾重復數(shù)據(jù)的方法

    這篇文章主要介紹了java8新特性將List中按指定屬性排序過濾重復數(shù)據(jù)的方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-08-08
  • Spring的CorsFilter會失效的原因及解決方法

    Spring的CorsFilter會失效的原因及解決方法

    眾所周知CorsFilter是Spring提供的跨域過濾器,我們可能會做以下的配置,基本上就是允許任何跨域請求,我利用Spring的CorsFilter做跨域操作但是出現(xiàn)報錯,接下來小編就給大家介紹一Spring的CorsFilter會失效的原因及解決方法,需要的朋友可以參考下
    2023-09-09
  • spring中對象注入的三種實現(xiàn)方式

    spring中對象注入的三種實現(xiàn)方式

    本文主要介紹了spring中對象注入的三種實現(xiàn)方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07
  • 小議Java中@param注解與@see注解的作用

    小議Java中@param注解與@see注解的作用

    這篇文章主要介紹了Java中@param注解與@see注解的作用,注解的功能類似于通常代碼中的注釋,需要的朋友可以參考下
    2015-12-12
  • Netty粘包拆包問題解決方案

    Netty粘包拆包問題解決方案

    這篇文章主要介紹了Netty粘包拆包問題解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • idea中如何使用git進行版本回退詳解

    idea中如何使用git進行版本回退詳解

    工作中遇到git遠程倉庫需要回退到歷史版本的問題,根據(jù)網(wǎng)上的搜索結果結合自己的實踐,下面這篇文章主要給大家介紹了關于idea中如何使用git進行版本回退的相關資料,需要的朋友可以參考下
    2023-04-04
  • SpringBoot結合Neo4j自定義cypherSql的方法

    SpringBoot結合Neo4j自定義cypherSql的方法

    這篇文章主要介紹了SpringBoot結合Neo4j自定義cypherSql,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-11-11
  • springboot?vue接口測試定義編輯功能的實現(xiàn)

    springboot?vue接口測試定義編輯功能的實現(xiàn)

    這篇文章主要為大家介紹了springboot?vue接口測試定義編輯功能的實現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • Java ThreadLocal的使用詳解

    Java ThreadLocal的使用詳解

    ThreadLocal是線程私有的局部變量存儲容器,可以理解成每個線程都有自己專屬的存儲容器,用來存儲線程私有變量。ThreadLocal 在日常開發(fā)框架中應用廣泛,但用不好也會出現(xiàn)各種問題,本文就此講解一下。
    2021-05-05
  • Spring循環(huán)依賴產(chǎn)生與解決

    Spring循環(huán)依賴產(chǎn)生與解決

    Spring的解決循環(huán)依賴是有前置條件的,要解決循環(huán)依賴我們首先要了解Spring Bean對象的創(chuàng)建過程和依賴注入的方式。依賴注入方式,我之前的博客有所分享,大家可以在看本篇文章之前進行一下小小的回顧
    2022-12-12

最新評論

乡城县| 英山县| 敦化市| 宁都县| 东乌珠穆沁旗| 开化县| 梅河口市| 嘉峪关市| 龙门县| 长汀县| 万山特区| 交城县| 茂名市| 玉门市| 满洲里市| 大邑县| 沙湾县| 济南市| 湘潭县| 吴忠市| 和林格尔县| 庄浪县| 克什克腾旗| 正阳县| 米泉市| 乐亭县| 江源县| 桐乡市| 延津县| 安陆市| 萍乡市| 沙坪坝区| 馆陶县| 德令哈市| 泗阳县| 满洲里市| 滨海县| 和林格尔县| 盘山县| 句容市| 阿拉尔市|