当前位置: 首页 > 知识库问答 >
问题:

javascript - cesium 如何用Primitive来实现根据websocket实时发送的经纬度,利用primitive来实现绘制轨迹线和轨迹点?

卢翔宇
2023-08-30
function webValue() {  // 初始Websocket  const onOpen = () => {    const data = JSON.stringify({ command: 1, serializeAlgorithm: 1, token: window.localStorage.getItem('token') });    ws.send(data); // 发送JSON字符串    // 设置心跳间隔为5秒    pingInterval.value = window.setInterval(() => {      const pingMessage = JSON.stringify({        command: 2,        serializeAlgorithm: 1      });      ws.send(pingMessage);    }, 5000);  };  if (window.localStorage.getItem('CardUID') === null) {    return ElMessage({      message: '车辆终端ID未绑定,请点击右上角的“设置”图标进行绑定。',      type: 'warning',      showClose: true    });  }  // 接收websocket数据  const onMessage = async (event) => {    const data = JSON.parse(event.data);    if (data.data == undefined) {      console.log('未响应');    } else {      processPositionParams(data.data);    }  };  // 封装处理位置参数的函数  const positionParams = []; // 用于存储所有的位置参数数据  const bufferLimit = 50; // 缓冲区大小限制,可以根据需求调整  function processPositionParams(data) {    const targetingTypes = {      0x10: 'RTK',      0x11: 'UWB',      0x12: '融合'    };    const newPositionParam = {      TargetingType: targetingTypes[data.type],      UID: data.uid,      Angle: data.angle,      Height: data.height,      longitude: data.longitude,      latitude: data.latitude    };    positionParams.push(newPositionParam);    // 超过缓冲区大小限制时移除最旧的位置参数数据    if (positionParams.length > bufferLimit) {      positionParams.shift();    }    const labelText = `终端ID:${data.uid},定位类型:${targetingTypes[data.type]}\n经度:${data.longitude},纬度:${data.latitude}\n角度:${data.angle},高度:${data.height}`;    CarModel(positionParams, newPositionParam.Angle, data.uid); // 车辆模型    pointPolyline(positionParams, labelText, data.uid) // 轨迹点和轨迹线  }  const onClose = () => {    window.clearInterval(pingInterval.value); // 清除心跳间隔定时器    console.log('Websocket连接关闭');    webValue();  };  const onError = (error) => {    console.log('Websocket连接错误');    ws.close();    window.clearInterval(pingInterval.value); // 清除心跳间隔定时器    webValue();  };  ws.addEventListener('open', onOpen);  ws.addEventListener('message', onMessage);  ws.addEventListener('close', onClose);  ws.addEventListener('error', onError);}------------------------------------------------------------------------------------------let polylineEntity = null;let entityList = [];let positionsArray = [];function pointPolyline(positions, labelText, uid) {  const cartesian3Array = [];  positionsArray = positions.flatMap(pos => [pos.longitude, pos.latitude]);  // 移除之前的实体点  for (const entity of entityList) {    viewer.entities.remove(entity);  }  entityList = [];  for (const position of positions) {    let entityIndex = entityList.length;    const cartesian3 = Cesium.Cartesian3.fromDegrees(      position.longitude,      position.latitude,      0.02    );    const pointLabel = new Cesium.Entity({      position: cartesian3,      point: {        pixelSize: 10,        color: Cesium.Color.BLUE,        show: checkedPoint.value,        outlineColor: Cesium.Color.WHITE,        outlineWidth: 1,      },      label: {        text: labelText,        font: '14pt monospace',        show: new Cesium.CallbackProperty(() => {          return entityIndex === entityList.length - 1;        }, false),        style: Cesium.LabelStyle.FILL_AND_OUTLINE,        outlineWidth: 2,        verticalOrigin: Cesium.VerticalOrigin.BOTTOM,        pixelOffset: new Cesium.Cartesian2(0, -9),        fillColor: Cesium.Color.WHITE,//标签的文本填充颜色。        outlineColor: Cesium.Color.WHITE,//标签的文本轮廓颜色。      },    });    entityList.push(pointLabel);    viewer.entities.add(pointLabel);    cartesian3Array.push(cartesian3);  }  // 更新轨迹线位置  if (polylineEntity) {    polylineEntity.polyline.positions = new Cesium.CallbackProperty(() => {      return Cesium.Cartesian3.fromDegreesArray(positionsArray);    }, false);    polylineEntity.polyline.show = checkedLines.value;  } else {    // 创建新的轨迹线    polylineEntity = viewer.entities.add({      polyline: {        positions: new Cesium.CallbackProperty(() => {          return Cesium.Cartesian3.fromDegreesArray(positionsArray);        }, false),        width: 15,        material: Cesium.Color.RED,      },    });  }}

大佬们,请问如何根据websocket实时返回的数据,如何通过new Cesium.Primitive()进行绘制点和线,并且如何让websocket里面的pointPolyline()和CarModel()函数使其不是每次都会在websocket里面调用,而只是实时更新数据?

共有1个答案

微生自怡
2023-08-30
const viewer = new Cesium.Viewer('cesiumContainer');let primitive = null;let geometryInstances = [];function webValue() {  const ws = new WebSocket('ws://your-websocket-url');  const onOpen = () => {    //     // ...  };  const onMessage = (event) => {    const data = JSON.parse(event.data);    // 更新geometryInstances数组    // ...    viewer.scene.primitives.remove(primitive);    primitive = new Cesium.Primitive({      geometryInstances: geometryInstances,      appearance: new Cesium.PerInstanceColorAppearance(),    });    viewer.scene.primitives.add(primitive);  };  const onClose = () => {       // ...  };  const onError = (error) => {        // ...  };  ws.addEventListener('open', onOpen);  ws.addEventListener('message', onMessage);  ws.addEventListener('close', onClose);  ws.addEventListener('error', onError);}function updateGeometryInstances() {  geometryInstances = [    new Cesium.GeometryInstance({      geometry: new Cesium.PointGeometry({        positions: Cesium.Cartesian3.fromDegreesArray([          // 经度,纬度          116.0, 40.0,          117.0, 41.0,          // ... 更多点        ]),      }),      attributes: {        color: Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.RED),      },    }),    new Cesium.GeometryInstance({      geometry: new Cesium.PolylineGeometry({        positions: Cesium.Cartesian3.fromDegreesArray([          // 经度,纬度          116.0, 40.0,          117.0, 41.0,          // ... 更多点        ]),        width: 5.0,      }),      attributes: {        color: Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.BLUE),      },    }),  ];}updateGeometryInstances();webValue();
 类似资料:
  • 本文向大家介绍canvas轨迹回放功能实现,包括了canvas轨迹回放功能实现的使用技巧和注意事项,需要的朋友参考一下 本文通过json机构,HTML代码以及JS代码详细给大家分析了canvas轨迹回放功能实现的过程,以下是全部内容。 json结构 html 将json作为js文件引入,并将其赋值给全局变量testPath(引入方式按照实际项目要求来) js 以上就是本次文章的全部内容,如果大家在

  • 通过后端返回的多个经纬度,进行绘制多个点以及绘制由多个点组成的轨迹线

  • 本文向大家介绍在vue中高德地图引入和轨迹的绘制的实现,包括了在vue中高德地图引入和轨迹的绘制的实现的使用技巧和注意事项,需要的朋友参考一下 高德地图引入和轨迹的绘制 1.第一步 vue中使用cdn引入高德地图,并在main.js中进行全局配置。(百度上有高德地图引入与配置方法,这里就不详细介绍); 1) npm install vue-amap --save 2) 2.第二步 以上就是轨迹绘制

  • 本文向大家介绍Openlayers3实现车辆轨迹回放功能,包括了Openlayers3实现车辆轨迹回放功能的使用技巧和注意事项,需要的朋友参考一下 记录基于geoserver地图服务,Openlayers3在web前端实现车辆轨迹回放功能,并记录和解决过程中出现的linestring只描绘部分经纬度坐标问题。 参考Openlayers3 官网例子 html map初始化 ajax获取坐标数据 显示

  • 本文向大家介绍jQuery实现炫酷的鼠标轨迹特效,包括了jQuery实现炫酷的鼠标轨迹特效的使用技巧和注意事项,需要的朋友参考一下 代码: 以上就是本文的内容了,希望小伙伴们喜欢此特效,快过年了,给自己的个人主页增添些色彩吧。

  • 轨迹信息为用户的浏览信息(比如首页、商品页、购物车、支付页、支付成功页等),只有调用轨迹方法,客服端的客服人员才能看到用户的浏览内容,提高服务质量。 > 参数说明: 一.标准集成方式 基本集成方式适用于在需要上传的轨迹的界面分别调用以下接口实现轨迹上传功能。 1.首页轨迹 /** 上报轨迹 @param pageName 当前页面名称 @param model 轨迹参数模型 */ NtalkerT