前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >GPX数据在mapboxGL中轨迹动画

GPX数据在mapboxGL中轨迹动画

作者头像
lzugis
发布2020-06-08 08:29:36
1.9K0
发布2020-06-08 08:29:36
举报

概述

喜欢跑步的人都会选择一款APP来自己跑步的,常用的有keep、悦跑圈、华为健康等等,每次跑完步,会根据跑步的轨迹绘制轨迹动画。今天咱们讲讲技术,不扯淡,讲一下在mapboxGL中如何实现类似的效果。

效果

效果
效果

数据

本文中的数据是我跑步的实测数据,数据导出于Garmin运动手表,格式为GPX。

实现

1.解析处理数据

gpx数据解析用到了gpxparse.js,具体请移步GPXParser.js

代码语言:javascript
复制
loadPgxData() {
  $.get('../data/route.gpx', function (res) {
    res = res.firstChild;
    var dom = $('<div/>');
    dom.html(res);
    var gpx = new gpxParser();
    gpx.parse(dom.html());
    that.points = gpx.tracks[0].points;
    var geojson = {
      'type': 'FeatureCollection',
      'features': []
    };
    var points = [[that.points[0].lon, that.points[0].lat]];
    for(var i = 1;i<that.points.length;i++) {
      var p = [that.points[i].lon, that.points[i].lat];
      var _points = points.concat([p]);
      geojson.features.push({
        type: 'Feature',
        geometry: {
          type: 'LineString',
          coordinates: _points
        },
        properties: {
          index: i
        }
      });
      points.push(p);
    }
    // var geojson = gpx.toGeoJSON();
    map.addSource('track-line', {
      type: 'geojson',
      data: geojson
    });
    map.addLayer({
      id: 'track-line',
      type: 'line',
      source: 'track-line',
      paint: {
        'line-color': '#ff0000',
        'line-width': 6
      }
    });

    that.play();

    that.playFlag = setInterval(function () {
      that.index++;
      if(that.index === that.points.length) {
        window.clearInterval(that.playFlag);
      } else {
        that.play();
      }
    }, 30);
  })
}

2.轨迹动画

代码语言:javascript
复制
play() {
  if(that.marker) that.marker.remove();
  switch (that.index) {
    case 0: {
      var img = $('<img>').attr('src', '../css/start.png');
      var dom = $('<div/>').append(img);
      const option = {
        element: dom[0],
        anchor: 'bottom',
        offset: [0, 10]
      };
      new mapboxgl.Marker(option)
              .setLngLat([that.points[0].lon, that.points[0].lat])
              .addTo(map);
      break;
    }
    case that.points.length -1: {
      var img = $('<img>').attr('src', '../css/end.png');
      var dom = $('<div/>').append(img);
      const option = {
        element: dom[0],
        anchor: 'bottom',
        offset: [0, 10]
      };
      new mapboxgl.Marker(option)
              .setLngLat([that.points[that.points.length - 1].lon,
                that.points[that.points.length - 1].lat])
              .addTo(map);
      break;
    }
    default: {
      var img = $('<img>').attr('src', '../css/loc.png');
      var dom = $('<div/>').append(img);
      const option = {
        element: dom[0],
        anchor: 'bottom',
        offset: [0, 10]
      };
      that.marker = new mapboxgl.Marker(option)
              .setLngLat([that.points[that.index].lon,
                that.points[that.index].lat])
              .addTo(map);
      break;
    }
  }
  map.setFilter('track-line', ['==', 'index', that.index]);
  if(that.index === that.points.length - 2) {
    var pt0 = [that.points[that.index].lon,
      that.points[that.index].lat];
    var pt1 = [that.points[that.index + 1].lon,
      that.points[that.index + 1].lat];
    map.flyTo({
      center: pt0,
      zoom: 17.7
    });
    map.setPitch(60);
    var angle = that.getAngle(pt0, pt1);
    map.setBearing(angle);
  }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-06-07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • 效果
  • 数据
  • 实现
    • 1.解析处理数据
      • 2.轨迹动画
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档