欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

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

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

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

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

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

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

我們選擇的接口是:

接口名稱:駕車路線規(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 配置高德相關(guān)參數(shù)

application.yml 中添加:

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

4.3 構(gòu)建配置類

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

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

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

@Data
@AllArgsConstructor
@NoArgsConstructor
public class RouteRequest {
    private String origin;      // 起點坐標(biāo) - 格式:經(jīng)度,緯度
    private String destination; // 終點坐標(biāo) - 格式:經(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ī)劃響應(yīng)失敗", 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"
}
  • 響應(yīng)示例
{
  "distance": "9346",
  "duration": "1234",
  "strategy": "推薦"
}

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

8.1 緩存策略

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

8.2 錯誤處理

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

8.3 模塊解耦

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

8.4 單元測試

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

九、總結(jié)

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

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

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

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

相關(guān)文章

  • Java中一維二維數(shù)組的靜態(tài)和動態(tài)初始化

    Java中一維二維數(shù)組的靜態(tài)和動態(tài)初始化

    今天通過本文給大家分享Java中的數(shù)組,包括一維數(shù)組和二維數(shù)組的靜態(tài)初始化和動態(tài)初始化問題,感興趣的朋友一起看看吧
    2017-10-10
  • 詳解Java的四種引用方式及其區(qū)別

    詳解Java的四種引用方式及其區(qū)別

    這篇文章主要介紹了Java的四種引用方式 ,主要主要包括強引用,軟引用,弱引用,虛引用,稍微整理精簡一下做下分享,具有一定的參考價值,需要的朋友可以參考下
    2018-12-12
  • SpringBoot項目在啟動后自動關(guān)閉的實現(xiàn)

    SpringBoot項目在啟動后自動關(guān)閉的實現(xiàn)

    我們在寫spring?boot?web項目時,有時會遇到啟動后立即關(guān)閉的情況,?本文主要介紹了SpringBoot項目在啟動后自動關(guān)閉的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • SpringBoot+WebMagic實現(xiàn)網(wǎng)頁爬蟲的示例代碼

    SpringBoot+WebMagic實現(xiàn)網(wǎng)頁爬蟲的示例代碼

    本文是對spring?boot+WebMagic+MyBatis做了整合,使用WebMagic爬取數(shù)據(jù),然后通過MyBatis持久化爬取的數(shù)據(jù)到mysql數(shù)據(jù)庫,具有一定的參考價值,感興趣的可以了解一下
    2023-10-10
  • 實例講解String Date Calendar之間的轉(zhuǎn)換

    實例講解String Date Calendar之間的轉(zhuǎn)換

    下面小編就為大家?guī)硪黄獙嵗v解String Date Calendar之間的轉(zhuǎn)換。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • Java中Stream流中map和forEach的區(qū)別詳解

    Java中Stream流中map和forEach的區(qū)別詳解

    本文主要介紹了Java中Stream流中map和forEach的區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • SpringCloud zuul 網(wǎng)關(guān)如何解決跨域問題

    SpringCloud zuul 網(wǎng)關(guān)如何解決跨域問題

    這篇文章主要介紹了SpringCloud zuul網(wǎng)關(guān)解決跨域問題的具體實現(xiàn)方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 淺談java+內(nèi)存分配及變量存儲位置的區(qū)別

    淺談java+內(nèi)存分配及變量存儲位置的區(qū)別

    下面小編就為大家?guī)硪黄獪\談java+內(nèi)存分配及變量存儲位置的區(qū)別。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-08-08
  • SpringBoot內(nèi)置tomcat調(diào)優(yōu)測試優(yōu)化

    SpringBoot內(nèi)置tomcat調(diào)優(yōu)測試優(yōu)化

    這篇文章主要介紹了SpringBoot內(nèi)置tomcat調(diào)優(yōu)測試優(yōu)化,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Idea如何自定義VM配置

    Idea如何自定義VM配置

    這篇文章主要介紹了Idea如何自定義VM配置,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11

最新評論