使用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)主要包含以下幾個步驟:
- 申請高德地圖 Web 服務的開發(fā)者 Key(AK)
- 理解高德路線規(guī)劃 API 的接口規(guī)范
- 構建 Spring Boot 項目,封裝 HTTP 請求調(diào)用接口
- 定義統(tǒng)一的請求與響應模型
- 結合業(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ù)的方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2019-08-08
SpringBoot結合Neo4j自定義cypherSql的方法
這篇文章主要介紹了SpringBoot結合Neo4j自定義cypherSql,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-11-11
springboot?vue接口測試定義編輯功能的實現(xiàn)
這篇文章主要為大家介紹了springboot?vue接口測試定義編輯功能的實現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05

