# map_example **Repository Path**: linux19920212/map_example ## Basic Information - **Project Name**: map_example - **Description**: 地图工具 1、坐标定位 2、坐标测距 3、画电子围栏 4、校验是否在电子围栏中 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2026-09-10 - **Last Updated**: 2026-09-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 地图应用 - 经纬度计算与电子围栏 ## 功能介绍 这是一个基于Spring Boot和Leaflet地图的Web应用,提供以下功能: ### 1. 根据经纬度找地点并在地图上查看 - 输入经纬度坐标 - **自动获取真实地址信息**(使用 OpenStreetMap Nominatim API) - 在地图上显示位置标记和地址 - 支持多个地点的同时显示 ### 2. 根据两个经纬度计算距离 - 使用Haversine公式精确计算地球表面两点间距离 - 显示米和公里两种单位 - **在地图上显示起点和终点的真实地址** - 在地图上可视化显示两点及连线 ### 3. 根据多个经纬度绘制轨迹(电子围栏) - 支持绘制多边形电子围栏 - 检测指定点是否在围栏内 - 如果不在围栏内,显示距离围栏有多远 - **所有围栏点和检测点都显示真实地址** - 支持轨迹绘制和显示,轨迹点显示真实地址 ## 技术栈 - **后端**: Spring Boot 4.0.5 - **前端**: 高德地图 JS API 2.0 - **地图数据**: 高德地图(中国区数据更准确) - **逆地理编码**: 高德地图 Web 服务 API - **HTTP客户端**: Spring WebFlux WebClient - **模板引擎**: Thymeleaf ## 快速开始 ### 1. 编译项目 ```bash mvn clean package ``` ### 2. 运行应用 ```bash mvn spring-boot:run ``` 或者运行jar包: ```bash java -jar target/map_example-0.0.1-SNAPSHOT.jar ``` ### 3. 访问应用 打开浏览器访问:http://localhost:8080 ## 使用说明 ### 距离计算 1. 点击"距离计算"标签 2. 输入起点和终点的经纬度 3. 点击"计算距离"查看结果 4. 点击"在地图上显示"可视化展示 示例坐标: - 北京: 39.9042, 116.4074 - 上海: 31.2304, 121.4737 ### 电子围栏检测 1. 点击"电子围栏"标签 2. 输入围栏坐标(每行一个,格式:纬度,经度) 3. 输入要检测的点坐标 4. 点击"检测是否在围栏内" 5. 点击"在地图上显示"查看可视化效果 示例围栏坐标(北京故宫周边): ``` 39.9242,116.4074 39.9242,116.4274 39.9042,116.4274 39.9042,116.4074 ``` ### 轨迹绘制 1. 点击"轨迹绘制"标签 2. 按顺序输入轨迹点坐标 3. 点击"绘制轨迹"在地图上显示 ## API接口 ### 1. 计算距离 ``` POST /api/distance Request Body: { "point1": {"latitude": 39.9042, "longitude": 116.4074}, "point2": {"latitude": 31.2304, "longitude": 121.4737} } Response: { "distanceInMeters": 1068456.78, "distanceInKm": 1068.46 } ``` ### 2. 检查电子围栏 ``` POST /api/fence/check Request Body: { "fencePoints": [ {"latitude": 39.9, "longitude": 116.4}, {"latitude": 39.9, "longitude": 116.5}, {"latitude": 39.8, "longitude": 116.5}, {"latitude": 39.8, "longitude": 116.4} ], "targetPoint": {"latitude": 39.85, "longitude": 116.45} } Response: { "inside": true, "distanceToNearestEdge": 0.0, "nearestPoint": {...} } ``` ## 核心算法 ### Haversine公式 用于计算地球表面两点间的最短距离(大圆距离),考虑了地球的球面特性。 ### 射线法(Point in Polygon) 用于判断一个点是否在多边形内部,从该点向任意方向发射射线,统计与多边形边界的交点数量。 ### 点到线段距离 计算点到线段的最短距离,用于确定点与电子围栏边界的距离。 ## 项目结构 ``` src/main/java/com/example/jdk21/ ├── Jdk21Application.java # 主启动类 ├── controller/ │ └── MapController.java # 控制器 ├── dto/ │ ├── GeoPoint.java # 地理坐标DTO │ ├── DistanceResponse.java # 距离响应DTO │ ├── FenceCheckRequest.java # 围栏检测请求DTO │ └── FenceCheckResponse.java # 围栏检测响应DTO └── util/ └── GeoUtils.java # 地理计算工具类 src/main/resources/ └── templates/ └── map.html # 前端页面 ``` ## 注意事项 1. 纬度范围: -90 到 90 2. 经度范围: -180 到 180 3. 电子围栏至少需要3个点 4. 轨迹至少需要2个点 5. 坐标格式:纬度,经度(例如:39.9042,116.4074) ## 扩展建议 1. 集成高德地图/百度地图API获取真实地址信息 2. 添加数据库存储历史轨迹和围栏 3. 支持GPS实时定位和轨迹跟踪 4. 添加地理编码和逆地理编码功能 5. 支持更多多边形操作(面积计算、周长计算等)