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

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

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

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

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

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

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

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

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

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

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

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

我們選擇的接口是:

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

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

請(qǐng)求方式:GET

核心參數(shù)

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

四、Spring Boot 項(xiàng)目整合步驟

4.1 創(chuàng)建 Spring Boot 項(xiàng)目

使用 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 簡(jiǎn)化開(kāi)發(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)建路線請(qǐng)求與響應(yīng)模型

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

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 測(cè)試示例

  • 請(qǐng)求地址POST http://localhost:8080/api/route/driving
  • 請(qǐng)求體
{
  "origin": "116.481028,39.989643",
  "destination": "116.434446,39.90816"
}
  • 響應(yīng)示例
{
  "distance": "9346",
  "duration": "1234",
  "strategy": "推薦"
}

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

8.1 緩存策略

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

8.2 錯(cuò)誤處理

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

8.3 模塊解耦

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

8.4 單元測(cè)試

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

九、總結(jié)

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

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

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

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

相關(guān)文章

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

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

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

    Spring的CorsFilter會(huì)失效的原因及解決方法

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

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

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

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

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

    Netty粘包拆包問(wèn)題解決方案

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

    idea中如何使用git進(jìn)行版本回退詳解

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

    SpringBoot結(jié)合Neo4j自定義cypherSql的方法

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

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

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

    Java ThreadLocal的使用詳解

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

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

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

最新評(píng)論

双流县| 开封市| 永寿县| 芦溪县| 霍林郭勒市| 汾阳市| 湘乡市| 密云县| 镇平县| 广河县| 乌海市| 特克斯县| 福贡县| 罗田县| 大渡口区| 乌审旗| 宁河县| 陇西县| 商丘市| 扎囊县| 页游| 乌恰县| 常州市| 绵竹市| 清河县| 垫江县| 潮州市| 诏安县| 南江县| 江口县| 沅江市| 富阳市| 蒙阴县| 祁阳县| 阜康市| 海晏县| 炎陵县| 赤城县| 蓬溪县| 金沙县| 岳西县|