mapboxgl实现带箭头轨迹线,想实现类似高德地图导航轨迹效果

最近在使用mapboxgl实现轨迹展示时,想实现类似高德地图导航轨迹效果,然而并未在网上找到类似示例。经一番研究与尝试,最终解决,效果如下。

202012310104

添加箭头核心代码如下,只需在配置layout中添加symbol-placement和symbol-spacing属性即可:

// 添加箭头图层
function addArrowlayer() {
map.addLayer({
‘id’: ‘arrowLayer’,
‘type’: ‘symbol’,
‘source’: {
‘type’: ‘geojson’,
‘data’: routeGeoJson //轨迹geojson格式数据
},
‘layout’: {
‘symbol-placement’: ‘line’,
‘symbol-spacing’: 50, // 图标间隔,默认为250
‘icon-image’: ‘arrowIcon’, //箭头图标
‘icon-size’: 0.5
}
});
}
然而,为实现上述效果,确走了不少弯路。曾尝试集成Leaflet.PolylineDecorator插件核心算法,通过对线的处理,计算每个箭头所在位置以及角度,也能实现上述效果。不过该方案在地图倾斜旋转后,有时会有箭头偏移的bug。

在解决此bug过程中,不经意间看到道路标注都是沿道路线方向,突然有了新的灵感。

重新查看mapboxgl API,发现将layout中的symbol-placement设置为line,即可实现沿着线的方向绘制箭头。

注意:

我所用图标为右侧方向箭头,结果与实际方向相符,如果图标为向上箭头,需修改icon-rotate为90。
只把symbol-placement设置为line,箭头间距过于稀疏;需要设置下symbol-spacing参数,symbol-spacing默认值为250,修改为50即可实现文章首页图片效果。
在线示例

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
实现高德地图轨迹播放,可以使用高德地图 JavaScript API 中提供的 Polyline 类和 Marker 类。具体实现步骤如下: 1. 获取轨迹数据 首先需要获取轨迹数据,可以从后台接口获取或者从本地文件读取。轨迹数据一般是经纬度坐标数组,例如: ``` var path = [ [116.405289,39.904987], [116.406289,39.904987], [116.407289,39.904987], //... ]; ``` 2. 创建地图对象 使用高德地图 JavaScript API 创建地图对象,例如: ``` var map = new AMap.Map('mapContainer', { zoom: 14, center: [116.397428, 39.90923] }); ``` 其中 `mapContainer` 是地图容器的 ID,`zoom` 是地图缩放级别,`center` 是地图中心点坐标。 3. 创建轨迹 Polyline 使用 Polyline 类创建轨迹线段,例如: ``` var polyline = new AMap.Polyline({ map: map, path: path, showDir: true, strokeColor: '#3366FF', strokeOpacity: 1, strokeWeight: 5, strokeStyle: 'solid' }); ``` 其中 `map` 是地图对象,`path` 是轨迹经纬度坐标数组,`showDir` 表示是否显示箭头,`strokeColor` 表示轨迹线段颜色,`strokeOpacity` 表示轨迹线段透明度,`strokeWeight` 表示轨迹线段宽度,`strokeStyle` 表示轨迹线段样式。 4. 创建播放 Marker 使用 Marker 类创建播放 Marker,例如: ``` var marker = new AMap.Marker({ map: map, position: path[0], icon: new AMap.Icon({ size: new AMap.Size(32, 32), image: 'https://webapi.amap.com/theme/v1.3/markers/n/mark_r.png' }) }); ``` 其中 `map` 是地图对象,`position` 是 Marker 的位置,`icon` 是 Marker 的图标。 5. 实现轨迹播放 使用 JavaScript 的 `setInterval` 函数实现轨迹播放,例如: ``` var index = 0; // 当前播放到的轨迹点索引 var interval = setInterval(function() { if (index >= path.length) { clearInterval(interval); return; } marker.setPosition(path[index]); index++; }, 1000); ``` 其中 `index` 表示当前播放到的轨迹点索引,`interval` 表示定时器句柄。每隔一段时间,将 Marker 的位置设置为当前轨迹点的位置,同时将 `index` 加 1。当 `index` 大于等于轨迹点数组的长度时,停止定时器。 完整代码示例: ``` <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>高德地图轨迹播放</title> <style> html, body, #mapContainer { width: 100%; height: 100%; margin: 0; } </style> <script src="https://webapi.amap.com/maps?v=1.4.15&key=您的高德地图密钥"></script> </head> <body> <div id="mapContainer"></div> <script> var path = [ [116.405289,39.904987], [116.406289,39.904987], [116.407289,39.904987], [116.408289,39.904987], [116.409289,39.904987], [116.410289,39.904987], [116.411289,39.904987], [116.412289,39.904987], [116.413289,39.904987], [116.414289,39.904987] ]; var map = new AMap.Map('mapContainer', { zoom: 14, center: [116.397428, 39.90923] }); var polyline = new AMap.Polyline({ map: map, path: path, showDir: true, strokeColor: '#3366FF', strokeOpacity: 1, strokeWeight: 5, strokeStyle: 'solid' }); var marker = new AMap.Marker({ map: map, position: path[0], icon: new AMap.Icon({ size: new AMap.Size(32, 32), image: 'https://webapi.amap.com/theme/v1.3/markers/n/mark_r.png' }) }); var index = 0; var interval = setInterval(function() { if (index >= path.length) { clearInterval(interval); return; } marker.setPosition(path[index]); index++; }, 1000); </script> </body> </html> ``` 注意替换代码中的高德地图密钥。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值