在城市管理、户外骑行、外业巡查等场景中,“实时定位与轨迹追踪”功能非常常见。本文基于高德地图 JavaScript API v2.0,完整实现一个桂林市3D地图与实时轨迹追踪系统,并详细拆解核心开发步骤与代码逻辑。
🗺️ 一、功能概述
- ✅ 地图显示:展示桂林市3D地图(深色风格)。
- ✅ 实时定位:实时获取当前位置。
- ✅ 轨迹绘制:根据移动路径绘制折线轨迹。
- ✅ 自动跟随:地图实时跟随当前位置。
- ✅ 支持开始/停止追踪控制。
🛠️ 二、项目搭建与核心代码
1️⃣ 页面结构与地图容器
<div id="AllmapContainer"></div>
<button class="location-btn" id="locateBtn">开始追踪轨迹</button>
#AllmapContainer
作为地图的显示区域。- 按钮用于启动/停止轨迹追踪。
2️⃣ 地图初始化
map = new AMap.Map('AllmapContainer', {
viewMode: '2D',
center: [110.299, 25.274], // 桂林市中心
zoom: 15,
mapStyle: "amap://styles/dark"
});
- 使用2D模式加载高德地图。
- 设置地图初始中心与缩放级别。
- 应用深色主题,提升视觉效果。
3️⃣ 折线轨迹初始化
polyline = new AMap.Polyline({
path: [],
isOutline: true,
outlineColor: '#ffeeff',
borderWeight: 2,
strokeColor: "#3366FF",
strokeWeight: 4,
lineJoin: 'round'
});
map.add(polyline);
- 使用 AMap.Polyline 绘制用户的移动轨迹。
- 动态追加坐标点实时更新轨迹。
4️⃣ 当前定位 Marker 图标
marker = new AMap.Marker({
map: map,
position: [110.299, 25.274],
icon: 'https://webapi.amap.com/theme/v1.3/markers/n/mark_b.png',
anchor: 'center'
});
- 使用蓝色图标实时显示当前定位点。
5️⃣ 核心:轨迹追踪逻辑
geoWatch = navigator.geolocation.watchPosition(function (pos) {
const lnglat = [pos.coords.longitude, pos.coords.latitude];
path.push(lnglat); // 记录新位置
polyline.setPath(path); // 更新轨迹
marker.setPosition(lnglat); // 移动定位图标
map.setCenter(lnglat); // 地图跟随
}, function (error) {
alert('定位失败: ' + error.message);
}, {
enableHighAccuracy: true,
timeout: 10000,
maximumAge: 0
});
- 浏览器的watchPosition持续监听定位变化。
- 每获取一个新坐标点,立刻:
- 将其加入路径数组;
- 更新折线轨迹;
- 移动图标;
- 地图自动平移跟随。
⚠️ 为什么用navigator.geolocation?
因为高德地图的Geolocation插件仅适用于单次定位,连续定位与轨迹追踪使用浏览器原生定位 API 更适合。
6️⃣ 开始/停止 追踪控制
// 点击按钮后开始追踪
document.getElementById('locateBtn').onclick = function () {
if (geoWatch) {
navigator.geolocation.clearWatch(geoWatch);
geoWatch = null;
this.textContent = '开始追踪轨迹';
return;
}
this.textContent = '停止追踪';
geoWatch = navigator.geolocation.watchPosition(function (pos) {
const lnglat = [pos.coords.longitude, pos.coords.latitude];
path.push(lnglat);
polyline.setPath(path);
marker.setPosition(lnglat);
map.setCenter(lnglat);
}, function (error) {
alert('定位失败: ' + error.message);
}, {
enableHighAccuracy: true,
timeout: 10000,
maximumAge: 0
});
};
- 点击按钮启动/停止追踪。
- 通过clearWatch停止监听,释放资源,避免后台耗电。
⚙️ 三、效果展示
- 打开页面后地图自动展示桂林市。
- 点击“开始追踪轨迹”:
- 实时显示当前位置。
- 路径随着移动动态绘制折线。
- 地图自动跟随当前位置。
- 再次点击按钮,即可停止追踪。
🛡️ 四、关于定位权限与浏览器限制
⚠️ 注意,使用navigator.geolocation
有严格的安全要求:
- 页面必须运行在:
- HTTPS环境;
- 或本地开发的localhost下。
- 浏览器必须授予“位置”权限。
否则,将会遇到:
origin does not have permission to use Geolocation service
解决方法:
- 使用 HTTPS 正式部署。
- 本地用开发服务器(如
npx serve
)启动调试。
📦 五、完整项目代码
完整项目代码见本文前面,或根据业务需求自由扩展,如:
- 轨迹回放
- 坐标上传至服务器
- 多人轨迹同时展示等
📌 结语
基于高德地图与浏览器定位 API,实现实时定位与轨迹追踪其实并不复杂,但注意细节:
- 用PolyLine动态更新轨迹;
- 用watchPosition监听位置变化;
- 记得处理好定位权限与安全策略。
希望本文能为你的地图项目开发提供帮助!