Animate a point along a route

最近有 Mapbox 社群里的开发者问 Max:

Hi, Max!我在做航线图,想要做出飞机沿着航线飞过的动画效果, Max 你知道怎么实现吗?

Max 回去苦心研究,查阅了各个教程, 终于研究出了如何实现航线地图上的飞行动画效果!

今天, 我将教大家如何用 Mapbox Gl Js 联合 Turf.js 来实现下面的动画飞行效果!

展示效果如下:

如果你对 Mapbox Gl Js 有点陌生, 请查看以下教程熟悉一下:

第1步:确定底图

这次我们直接使用 Mapbox 模板样式 mapbox://styles/mapbox/dark-v10 (当然,你也可以使用属于自己的地图样式), 然后使用你的 accesss token, 创建一个地图页面。

部分代码如下:

// TO MAKE THE MAP APPEAR YOU MUST // ADD YOUR ACCESS TOKEN FROM // https://account.mapbox.com mapboxgl.accessToken = 'YOUR ACCESS TOKEN';

var map = new mapboxgl.Map({

container: 'map',

style: 'mapbox://styles/mapbox/dark-v10',

center: [-96, 37.8],

zoom: 3

});

更多关于地图样式的请查看:

第2步:添加航线数据

然后你需要添加你的航线数据, 这里我们简单使用单个航线的数据作为示范。这条航线,始于旧金山, 结束于华盛顿特区。

// San Francisco

var origin = [-122.414, 37.776];

// Washington DC

var destination = [-77.032, 38.913];

// A simple line from origin to destination.

var route = {

'type': 'FeatureCollection',

'features': [

{

'type': 'Feature',

'geometry': {

'type': 'LineString',

'coordinates': [origin, destination]

}

}

]

};

如果你的航线数据很多但又不想用数据库, 也可以尝试使用下面这个方案

第3步:为你的航线添加飞机飞行的动画效果

这是最关键的一步!

首先,我们要沿着航线添加一个移动的点, 这个点从起始点运动到终点。

var point = {

'type': 'FeatureCollection',

'features': [

{

'type': 'Feature',

'properties': {},

'geometry': {

'type': 'Point',

'coordinates': origin

}

}

]

};

这里我们要借助 Turf.js 来计算路线起点/终点之间的距离,单位为公里。

// Calculate the distance in kilometers between route start/end point.

var lineDistance = turf.lineDistance(route.features[0], 'kilometers');

var arc = [];

接着, 在两点的 "原点 "和 "终点 "之间画一条弧线。并且写明这个点沿着弧线运动的步数 500。步数 (Steps)越多表示越好, 可以显示更平滑的动画效果,但步数太多也会造成低帧率。

// Number of steps to use in the arc and animation, more steps means

// a smoother arc and animation, but too many steps will result in a

// low frame rate

var steps = 500;

// Draw an arc between the `origin` & `destination` of the two points

for (var i = 0; i < lineDistance; i += lineDistance / steps) {

var segment = turf.along(route.features[0], i, 'kilometers');

arc.push(segment.geometry.coordinates);

}

我们还要更新点的移动坐标, 用上面计算出的圆弧坐标。

// Update the route with calculated arc coordinates

route.features[0].geometry.coordinates = arc;

// Used to increment the value of the point measurement against the route.

var counter = 0;

别忘了最重要的 animate 函数!

function animate() {

// Update point geometry to a new position based on counter denoting

// the index to access the arc.

point.features[0].geometry.coordinates =

route.features[0].geometry.coordinates[counter];

// Calculate the bearing to ensure the icon is rotated to match the route arc

// The bearing is calculate between the current point and the next point, except

// at the end of the arc use the previous point and the current point

point.features[0].properties.bearing = turf.bearing(

turf.point(

route.features[0].geometry.coordinates[

counter >= steps ? counter - 1 : counter

]

),

turf.point(

route.features[0].geometry.coordinates[

counter >= steps ? counter : counter + 1

]

)

);

第5步:把航线,动画效果的图层展示在地图上

在 add Layer 这里,你要做的选择合适的线样式,图标样式, 把航线及飞行动画效果最终呈现在地图上。

一般情况, 你只需要设置线的基础样式,例如 line- width,line-color 即可。但受到的 Jonni Walker 的教程影响,这次我决定把线设置成发光的样式(以配合我的暗黑风格地图样式)

发光的效果

普通的样式

接着这意味着,我设置了3条重叠的但样式不一样的 Line 来创造发光的航线!

map.addLayer({

'id': 'route',

'source': 'route',

'type': 'line',

'paint': {

'line-width':6,

'line-blur': 3,

'line-opacity': 0.4,

'line-color': '#007cbf'

}

});

map.addLayer({

'id': 'route2',

'source': 'route',

'type': 'line',

'paint': {

'line-width':3,

'line-blur': 3,

'line-opacity': 0.4,

'line-color': '#009df2'

}

});

map.addLayer({

'id': 'route3',

'source': 'route',

'type': 'line',

'paint': {

'line-width':0.2,

'line-blur': 1,

'line-opacity': 1,

'line-color': '#fafdff'

}

});

然后我还要在地图上添加飞行动画!我直接用了 Mapbox 自带的 Icon—airport-15。

map.addLayer({

'id': 'point',

'source': 'point',

'type': 'symbol',

'layout': {

'icon-image': 'airport-15',

'icon-rotate': ['get', 'bearing'],

'icon-rotation-alignment': 'map',

'icon-allow-overlap': true,

'icon-ignore-placement': true

}

});

这样一个有飞行动画效果的航线图就完成了。

全部代码请前往Codepen 查看, 你也可以查看 Mapbox GL JS 上的教程:沿路线设置动画点

福利彩蛋

你正在制作属于你的可视化项目吗?继续关注 Mapbox 公众号,获取更多教程与设计灵感!

想与我们分享你的可视化作品,可以直接在下方评论或者微信后台留言给我们哦。

欢迎您进入 Mapbox.cn 留下你的问题、建议、产品想法等,我们会在 1- 3 个工作日内回复你哦!

地图上制作线路的动画_航线地图上的动画飞行效果怎么实现?只要五步轻松上手...相关推荐

  1. 地图上制作线路的动画_使用百度地图API制作线路轨迹播放

    1.使用百度地图API制作轨迹播放: 可应用于车辆跟踪.行驶线路回放.跑步行程的记录等地图应用场景, 1.1绘制静态轨迹图 获取多个轨迹点point(必须包含经度.纬度) 使用polyline对象依次 ...

  2. 使用百度地图API制作线路轨迹播放

    1.使用百度地图API制作轨迹播放: 可应用于车辆跟踪.行驶线路回放.跑步行程的记录等地图应用场景, 1.1绘制静态轨迹图 获取多个轨迹点point(必须包含经度.纬度) 使用polyline对象依次 ...

  3. 地图定义一个中间不动标注_高精度地图制作(三)

    高精度地图主要用于无人驾驶路径规划,还可以应用于无人驾驶定位,ROI区域过滤等.接下来我们主要来看如何制作高精度地图. 高精度地图制作流程 高精度地图的制作过程分为4个步骤: 地图采集 点云地图制作 ...

  4. ae制作小球轨迹运动_关于3D建筑漫游动画制作流程及技术详解

    虽然3D建筑漫游动画是以展示建筑效果为主的短片形式呈现,但是其制作流程与一部完整的3D动画影片的制作过程是差不多的,只不过由人物角色演变成了建筑物的规划展示.一部完整的3D建筑漫游动画要经过前期策划. ...

  5. ae制h5文字动画_绝对干货!H5动画制作方法全揭秘

    原标题:绝对干货!H5动画制作方法全揭秘 近年来,H5页面火爆整个移动互联网,这些页面的炫酷展现,都离不开动效设计和制作,而动效设计和制作早已成为一名合格设计师必需掌握的技能. 目前,设计师制作H5页 ...

  6. 多媒体制作技术心得体会_二维flash课件动画制作的价格是多少

    伴随现代多媒体技术的不断发展,多媒体在课堂中的应用也越来越广泛, flash动画在多媒体课件中的分量不断提升.艺虎动画认为,在这样的flash动画课件应用背景下,要对二维flash动画课件制作的价格. ...

  7. echarts地图上的标签为图片_百度地图标记点中添加Echarts图表

    html { height: 100% } body { height: 100%; margin: 0px; padding: 0px } #container { height: 100% } v ...

  8. unity开宝箱动画_[技术博客]Unity3d 动画控制

    在制作游戏时,导入的箱子模型本身自带动画.然而,它的动画是一个从打开到关闭的完整过程,并且没有给出控制打开关闭的方法. 最直接的想法是对该动画进行拆分,再封装成不同的动画状态,但是不巧的是,这个动画被 ...

  9. 地图定义一个中间不动标注_高德地图吊打百度个性地图更新版,成为最佳分析图利器...

    转自:绿变变 本文已获得授权 说到区位分析图,如何获取地图一直以来是大家都在讨论的问题,不单单要获取地图,还需要那种可以单独调出建筑图层,交通路网图层,绿地图层,以及各项地图中的元素,毕竟我们做前期分 ...

  10. android image 位移动画_深入理解Android之动画

    Android 里动画从用途上讲,可以分为三类View Animation(View动画)又称 Tween Animation(补间动画).Drawable Animation(帧动画) 和 Prop ...

最新文章

  1. canvas绘制的文字如何换行
  2. MyEclipse+Tomcat部署发布webapp
  3. org.springframework.data.mapping.PropertyReferenceException: No property xxxx found for type Xxxx
  4. Qt控制台输出QString
  5. Spring4Shell的漏洞原理分析
  6. UTF-8, ASCII, Unicode的介绍与区分
  7. Bootstrap 标签页Tab插件的事件
  8. vue项目小demo
  9. LintCode 交叉字符串
  10. 大创和互联网加_大创?科研立项?互联网+大赛?创业大赛?……你还在纠结吗?...
  11. C语言与三菱plc通讯案例,三菱PLC的通讯与编程案例
  12. Matlab中插值函数汇总和使用说明
  13. 如何入门Python与机器学习
  14. Oleg Shilo:基于CS-Script的Notepad++的插件_.Net技术
  15. 开源天气时钟项目删减和更新
  16. 一些noip模拟题一句话题解
  17. java spring boot 微信公众号 分享功能
  18. 华科计算机硕士什么时候能去实习,研究生期间是出去实习还是老老实实做科研?...
  19. 去掉wps的word中首字母大写
  20. 【历史上的今天】1 月 15 日:维基百科上线;信息安全大师出生;英特尔推出 Viiv

热门文章

  1. 归并排序算法(二路)——C/C++
  2. ie浏览器当前的安全设置使计算机面临风险,IE安全设置
  3. python云台控制原理_python伺服云台摄像头图像作为背景
  4. ENSP实验五——三层交换机+二层交换机
  5. AV1 解码器 dav1d
  6. 让图片自适应屏幕大小
  7. 【动画消消乐】HTML+CSS 自定义加载动画:清新折叠方块效果 063(附源码及原理详解)
  8. 安卓智能手机完全装机手册,让安卓拥有无限可能!
  9. 移卡旗下全新餐饮SaaS产品米粒餐收银发布 科技驱动零售餐饮业态场景创新
  10. 基于matlab双闭环直流调速系统仿真,基于MATLAB的双闭环直流调速系统的仿真