当前位置: 首页 > news >正文

Spring Boot 集成高德地图电子围栏

摘要:本文手把手教你通过 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_id
        JsonNode 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;

    /**
     * 创建围栏并保存到数据库
     */
    @Transactional
    public String createFence(GeoFenceDTO dto) {
        // 坐标点格式转换
        String pointsStr = dto.getPoints().stream()
                .map(p -> p.getLng() + "_" + p.getLat())
                .collect(Collectors.joining(","));
        
        // 调用高德API
        String 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 接口批量查询
  • 围栏简化:对多边形顶点做道格拉斯-普克抽稀算法处理
http://www.dtcms.com/a/75162.html

相关文章:

  • Redis hyperloglog学习
  • Gymnasium学习笔记
  • C语言【常用】【字符函数 和 字符串函数】详解加模拟实现
  • 分布式文件系统Minio
  • 鸿蒙编译框架@ohos/hvigor FileUtil用法
  • 时序优化学习笔记
  • Matlab 基于专家pid控制的时滞系统
  • Vue 计算属性与 Data 属性同名问题深度解析
  • vue computed 计算属性简述
  • 【Leetcode】138.随机链表的复制
  • Windows的tftp udp 69端口被占用,通过netstat查询
  • Feedback-Guided Autonomous Driving
  • Spring Cloud Gateway 生产级实践:高可用 API 网关架构与流量治理解析
  • QT 磁盘文件 教程04-创建目录、删除目录、遍历目录
  • OpenEuler kinit报错找不到文件的解决办法
  • js给后端发送请求的方式有哪些
  • 软考中级-数据库-5.1 计算机网络概述与网络硬件基础
  • Mmybatis xml 连接数据库的方法
  • PyTorch 深度学习实战(13):Proximal Policy Optimization (PPO) 算法
  • Oracle Data Guard(数据保护)详解
  • Python print() 打印多个变量时,可变对象和不可变对象的区别
  • 图论入门【数据结构基础】:什么是图?如何表示图?
  • Linux IP 配置
  • 完全托管的DeepSeek-R1模型正式登陆Amazon Bedrock:安全部署与使用指南
  • 【系统架构设计师】操作系统 - 文件管理 ② ( 位示图 | 空闲区域 管理 | 位号 | 字号 )
  • Flask 模版引擎的语法
  • C语言-自定义类型:联合和枚举
  • OpnenHarmony 开源鸿蒙北向开发——1.开发环境搭建(DevEco Studio 5.03)
  • 高主频GPU+RTX4090:AI生图性能优化超150%
  • GIT标签(Tag)操作