使用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)主要包含以下幾個步驟:
- 申請高德地圖 Web 服務(wù)的開發(fā)者 Key(AK)
- 理解高德路線規(guī)劃 API 的接口規(guī)范
- 構(gòu)建 Spring Boot 項目,封裝 HTTP 請求調(diào)用接口
- 定義統(tǒng)一的請求與響應(yīng)模型
- 結(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ù)組,包括一維數(shù)組和二維數(shù)組的靜態(tài)初始化和動態(tài)初始化問題,感興趣的朋友一起看看吧2017-10-10
SpringBoot項目在啟動后自動關(guān)閉的實現(xiàn)
我們在寫spring?boot?web項目時,有時會遇到啟動后立即關(guān)閉的情況,?本文主要介紹了SpringBoot項目在啟動后自動關(guān)閉的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下2024-01-01
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)換
下面小編就為大家?guī)硪黄獙嵗v解String Date Calendar之間的轉(zhuǎn)換。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-07-07
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)解決跨域問題的具體實現(xiàn)方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
淺談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)化,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04

