【MapBox】实现实时飞行轨迹功能

之前写了一篇MapBox添加带箭头的轨迹线,现在在这个基础之上实现获取到无人机的推送点位数据实时飞行的功能

  1. 首先创建实例,将无人机的图标加载在地图上
javascript 复制代码
const MAP_UAV_FLIGHT_ING = (values, layerKey = '无人机飞行') => {
  ClearUAVMap();

  const map = GET_MAPBOX_MAP();

  map.loadImage(imageIcon.value, function (error, img) {
    if (error) throw error;

    map.addImage('uavIcon', img);
  });

  const allPoints = [];

  allPoints.push(
    turf.point([values?.droneLongitude, values?.droneLatitude], {
      ...values,
      layerKey,
      bearing: values.yaw,
    }),
  );

  // 特征集合
  animatePointGeoJson = turf.featureCollection(allPoints);

  map.addLayer({
    id: 'animatePointLayer',
    type: 'symbol',
    source: {
      type: 'geojson',
      data: animatePointGeoJson,
    },
    layout: {
      'icon-image': 'uavIcon',
      'icon-size': 0.5,
      'icon-rotate': ['get', 'bearing'],
      'icon-rotation-alignment': 'map',
      'icon-allow-overlap': true,
      'icon-ignore-placement': true,
    },
  });
  // counter = counter + 1;
};

备注:

  1. ClearUAVMap()方法是为了清除图层,否则再展示其他无人机轨迹的时候控制台会提示地图上已存在这个图层
javascript 复制代码
// 清除轨迹
export const ClearUAVMap = () => {
  if (map?.hasImage('uavIcon')) map?.removeImage('uavIcon');

  if (map.getLayer('animatePointLayer')) map.removeLayer('animatePointLayer');
  if (map.getSource('animatePointLayer')) map.removeSource('animatePointLayer');

  if (map.getLayer('homePointLayer')) map.removeLayer('homePointLayer');
  if (map.getSource('homePointLayer')) map.removeSource('homePointLayer');
};
  1. 'icon-rotate': ['get', 'bearing'],这个数据是添加数据源中指定的属性,bearing表示无人机的方向,这样无人机就会按照所提供的方向进行飞行

  2. 这个时候获取到实时推送的数据只需要获取到该图层的图层源改数据就可以了,不用清除再重新加载

javascript 复制代码
const MAP_ANIMATE_ING = (values, layerKey = '无人机飞行') => {
  const map = GET_MAPBOX_MAP();

  animatePointGeoJson.features[0].geometry.coordinates = [values?.droneLongitude, values?.droneLatitude];
  animatePointGeoJson.features[0].properties = {
    ...values,
    layerKey,
    bearing: values.yaw, //方向
  };

  map.getSource('animatePointLayer').setData(animatePointGeoJson);

  map.moveLayer('animatePointLayer', 'arrowLayer', 'routeLayer');
};
相关推荐
勇往直前plus15 分钟前
CentOS 7 环境下 RabbitMQ 的部署与 Web 管理界面基本使用指南
前端·docker·centos·rabbitmq
北海-cherish6 小时前
vue中的 watchEffect、watchAsyncEffect、watchPostEffect的区别
前端·javascript·vue.js
2501_915909067 小时前
HTML5 与 HTTPS,页面能力、必要性、常见问题与实战排查
前端·ios·小程序·https·uni-app·iphone·html5
white-persist8 小时前
Python实例方法与Python类的构造方法全解析
开发语言·前端·python·原型模式
新中地GIS开发老师8 小时前
Cesium 军事标绘入门:用 Cesium-Plot-JS 快速实现标绘功能
前端·javascript·arcgis·cesium·gis开发·地理信息科学
Superxpang9 小时前
前端性能优化
前端·javascript·vue.js·性能优化
Rysxt_9 小时前
Element Plus 入门教程:从零开始构建 Vue 3 界面
前端·javascript·vue.js
隐含9 小时前
对于el-table中自定义表头中添加el-popover会弹出两个的解决方案,分别针对固定列和非固定列来隐藏最后一个浮框。
前端·javascript·vue.js
大鱼前端9 小时前
Turbopack vs Webpack vs Vite:前端构建工具三分天下,谁将胜出?
前端·webpack·turbopack
你的人类朋友9 小时前
先用js快速开发,后续引入ts是否是一个好的实践?
前端·javascript·后端