摘要:本文手把手教你通過 Spring Boot 調用高德地圖 API 實現電子圍欄功能,涵蓋云端圍欄創建、設備位置監控與本地算法校驗,附帶完整代碼和避坑經驗!
一、電子圍欄核心原理
1.1 什么是電子圍欄?
- 虛擬地理邊界:在地圖上劃定區域(圓形/多邊形),觸發進出事件
- 應用場景:員工考勤、物流圍欄、兒童安全區域監控
- 技術核心:基于 GPS/北斗坐標的位置判斷(射線法或API調用)
1.2 高德地圖API能力
- 云端圍欄管理:創建、刪除、查詢圍欄
- 實時狀態檢測:設備進入/離開圍欄時觸發回調
- 坐標系支持:GCJ-02(火星坐標系)
二、Spring Boot 集成高德API實戰
2.1 環境準備
(1)添加 Maven 依賴
<!-- Web 基礎依賴 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 高德API HTTP 客戶端 -->
<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</version>
</dependency>
(2)配置高德 Key
application.yml
中配置:
amap:key: your_amap_key # 前往高德開放平臺申請geo-fence-url: https://restapi.amap.com/v4/geofence/meta
2.2 核心代碼實現
(1)高德API服務封裝
@Service
public class AmapGeoFenceService {@Value("${amap.key}")private String amapKey;/*** 創建電子圍欄(支持多邊形)* @param name 圍欄名稱* @param points 坐標點(格式:lng1_lat1,lng2_lat2,...)* @return 圍欄ID*/public String createGeoFence(String name, String points) {RestTemplate restTemplate = new RestTemplate();String url = String.format("%s?key=%s&name=%s&points=%s", geoFenceUrl, amapKey, URLEncoder.encode(name), points);ResponseEntity<String> response = restTemplate.postForEntity(url, null, String.class);// 解析返回結果獲取 fence_idJsonNode root = JsonUtils.parse(response.getBody());return root.get("data").get("fence_id").asText();}
}
(2)業務邏輯層
@Service
@RequiredArgsConstructor
public class GeoFenceService {private final AmapGeoFenceService amapService;private final GeoFenceRepository fenceRepository;/*** 創建圍欄并保存到數據庫*/@Transactionalpublic String createFence(GeoFenceDTO dto) {// 坐標點格式轉換String pointsStr = dto.getPoints().stream().map(p -> p.getLng() + "_" + p.getLat()).collect(Collectors.joining(","));// 調用高德APIString fenceId = amapService.createGeoFence(dto.getName(), pointsStr);// 保存到數據庫GeoFence fence = new GeoFence();fence.setFenceId(fenceId);fence.setName(dto.getName());fenceRepository.save(fence);return fenceId;}
}
2.3 實現效果演示
(1)創建圍欄 API 請求
POST /api/fences
Content-Type: application/json{"name": "公司安全區","points": [{"lng": 116.397504, "lat": 39.89619},{"lng": 116.407504, "lat": 39.89619},{"lng": 116.397504, "lat": 39.90619}]
}
(2)返回結果
{"fenceId": "1234567890"
}
三、避坑指南
3.1 常見問題排查
問題現象 | 原因分析 | 解決方案 |
---|---|---|
API返回INVALID_USER_KEY | 高德Key未配置或錯誤 | 檢查application.yml |
圍欄未觸發通知 | 設備未開啟定位權限 | 引導用戶授權定位 |
坐標偏移嚴重 | 坐標系不一致(如WGS-84) | 調用高德坐標轉換API |
3.2 性能優化建議
- 本地緩存:使用 Redis 緩存圍欄坐標數據,減少數據庫查詢
- 批量校驗:多個設備位置通過高德
batch/status
接口批量查詢 - 圍欄簡化:對多邊形頂點做道格拉斯-普克抽稀算法處理