15.gis车辆轨迹回放之openlayers

准备数据

// 含属性点位
var points = [];
//移动车辆速度
var moveSpeed = 500;//移动速度
//所有移动的坐标
var allMovePoints = [];
//所有移动的坐标索引
var allMovePointsIndex = [];
var movings = [];

操作

开始暂停恢复停止

export const start = (datas) => {
  if (datas && datas.length) {
    clean();
    addLayer()
    datas.forEach((items, index) => {
      allMovePointsIndex.push(0)
      let pointArray = [];
      if (items && items.length) {
        let pointindex = []
        items.forEach((item) => {
          if (item.LNG && item.LAT) {
            pointindex.push(item);
            pointArray.push([Number(item.LNG), Number(item.LAT)]);
          }
        });
        points.push(pointindex)
        if (pointArray && pointArray.length) {
          creatCarLine(pointArray, pointindex);
          createCarIcon(pointArray[0][0], pointArray[0][1], pointArray[1][0], pointArray[1][1], index);
          let allMovePoint = getAllMovePoint(pointArray, 50);
          allMovePoints.push(allMovePoint)
          //进行移动
          let moving = setInterval(() => {
            showPoint(index)
          }, moveSpeed);
          movings.push(moving)
        }
      }
    })
  }
};


const removeLayer = (id) => {
  for (let layerTmp of window.$olMap.getLayers().getArray()) {
    if (layerTmp.get("id") === id) {
      window.$olMap.removeLayer(layerTmp);
    }
  }
};
const addLayer = () => {
  // 轨迹
  let vectorLayer = new VectorLayer({
    id: "carline",
    source: new VectorSource({ features: [] }),
    style: new Style({
      stroke: new Stroke({
        width: 6,
        color: "blue",
      })
    })
  });

  // 活动轨迹
  let hdvectorLayer = new VectorLayer({
    id: "hdcarline",
    source: new VectorSource({ features: [] }),
    style: new Style({
      stroke: new Stroke({
        width: 6,
        color: "black",
      })
    })
  });
  // 正常点
  let zcvectorLayer = new VectorLayer({
    id: "zcpointid",
    source: new VectorSource({ features: [] }),
    style: function (feature) {

      return new Style({
        image: new Icon({
          src: zcdwimg,
          scale: [0.4, 0.4],
        }),
        zIndex: 10,
      })
    }
  });
  // 起始点
  let sevectorLayer = new VectorLayer({
    id: "qspointid",
    source: new VectorSource({ features: [] }),
    style: function (feature) {
      let imgs = { start: startimg, end: endimg }
      return new Style({
        image: new Icon({
          src: imgs[feature.get("staus")],
          scale: [1, 1],
        }),
        zIndex: 11,
      })
    }
  });
  // 超标点
  let cbvectorLayer = new VectorLayer({
    id: "cbpointid",
    source: new VectorSource({ features: [] }),
    style: new Style({
      image: new Icon({
        src: ycimg,
        scale: [0.5, 0.5],
      })
    })
  });
  // 活动车辆
  var carLayer = new VectorLayer({
    id: "carpoint",
    source: new VectorSource({ features: [] }),
    style: function (feature) {
      return new Style({
        image: new Icon({
          rotation: feature.get("angle"),
          scale: [0.7, 0.7],
          src: carPic
        })
      })
    }
  });
  window.$olMap.addLayer(zcvectorLayer)
  window.$olMap.addLayer(vectorLayer)
  window.$olMap.addLayer(hdvectorLayer)
  window.$olMap.addLayer(cbvectorLayer)
  window.$olMap.addLayer(sevectorLayer)

  window.$olMap.addLayer(carLayer)
};
// 车辆暂停
export const stopMove = () => {
  movings.forEach((moving, index) => {
    clearInterval(moving);
    movings[index] = undefined
  })

};
// 车辆继续
export const goOn = () => {
  movings.forEach((moving, index) => {
    if (moving !== undefined) {
      clearInterval(moving); // 清除移动
    }
    movings[index] = setInterval(() => {
      showPoint(index)
    }, moveSpeed);

  })



};
// 车辆返回
export const back = () => {
  movings.forEach((moving, index) => {
    if (moving != null) {
      clearInterval(moving); // 清除移动
    }
    allMovePointsIndex[index] = 0;

    let hdlinelayer = getLayerByid("hdcarline");
    if (hdlinelayer) {
      let pf = hdlinelayer.getSource().getFeatures()
      if (pf.length > 0) {
        hdlinelayer.getSource().clear()
      }
    }
    movings[index] = setInterval(() => {
      showPoint(index)
    }, moveSpeed);

  })
};
// 清除
export const clean2 = () => {
  movings.forEach((moving, index) => {
    if (moving != null) {
      clearInterval(moving); // 清除移动
    }
  })

  let carlayer = getLayerByid("carpoint");
  if (carlayer) {
    carlayer.getSource().clear()
  }
  let hdcarline = getLayerByid("hdcarline");
  if (hdcarline) {
    hdcarline.getSource().clear()
  }
};

初始化

通过已有轨迹数据按速度生成新的加密点的轨迹数据,及该点的方向通过start调用开启循环调用


export const createCarIcon = (x1, y1, x2, y2, index) => {
  var transRotate = getAngle(x1, y1, x2, y2);
  var carOverLay = new Feature({
    angle: transRotate,
    id: "carpoint",
    index: index,
    geometry: new Point([x1, y1])
  });
  let player = getLayerByid("carpoint")
  player.getSource().addFeature(carOverLay)
};


function getAngle(lng_a, lat_a, lng_b, lat_b) {
  var a = (90 - lat_b) * Math.PI / 180;

  var b = (90 - lat_a) * Math.PI / 180;

  var AOC_BOC = (lng_b - lng_a) * Math.PI / 180;

  var cosc = Math.cos(a) * Math.cos(b) + Math.sin(a) * Math.sin(b) * Math.cos(AOC_BOC);

  var sinc = Math.sqrt(1 - cosc * cosc);

  var sinA = Math.sin(a) * Math.sin(AOC_BOC) / sinc;

  var A = Math.asin(sinA) * 180 / Math.PI;

  var res = 0;

  if (lng_b > lng_a && lat_b > lat_a) res = A;
  else if (lng_b > lng_a && lat_b < lat_a) res = 180 - A;
  else if (lng_b < lng_a && lat_b < lat_a) res = 180 - A;
  else if (lng_b < lng_a && lat_b > lat_a) res = 360 + A;
  else if (lng_b > lng_a && lat_b == lat_a) res = 90;
  else if (lng_b < lng_a && lat_b == lat_a) res = 270;
  else if (lng_b == lng_a && lat_b > lat_a) res = 0;
  else if (lng_b == lng_a && lat_b < lat_a) res = 180;
  // res=res-80
  // 角度转弧度
  return Math.PI / 180 * res;

}

const formatLength = (pointArray) => {
  var length = 0;
  for (var i = 0, ii = pointArray.length - 1; i < ii; ++i) {
    var c1 = pointArray[i];

    var c2 = pointArray[i + 1];

    length += getDistance(c1, c2);
  }
  return length;
}

const getCenterPoint = (pointDoubleArray, cell) => {
  cell = cell == undefined ? 50 : cell;
  var twolength = formatLength(pointDoubleArray);
  if (twolength !== 0) {
    var rate = twolength / cell; //比例 默认5m/点
    var step = Math.ceil(rate); //步数(向上取整)
    var arr = new Array(); //定义存储中间点数组
    var c1 = pointDoubleArray[0]; //头部点
    var c2 = pointDoubleArray[1]; //尾部点
    var x1 = c1[0], y1 = c1[1];
    var x2 = c2[0], y2 = c2[1];
    for (var i = 1; i < step; i++) {
      var coor = {};
      coor.x = ((x2 - x1) * i) / rate + x1;
      coor.y = ((y2 - y1) * i) / rate + y1;
      arr.push(coor); //此时arr为中间点的坐标
    }
    arr.push({ x: c2[0], y: c2[1] });
    return arr;
  } else {
    return [];
  }
};

/*得到所有要移动的点位*/
export const getAllMovePoint = (pointArray, cell) => {
  cell = cell == undefined ? 50 : cell;
  var brr = new Array();
  brr.push({ x: pointArray[0][0], y: pointArray[0][1] }); //添加起点
  for (var i = 0; i < pointArray.length - 1; i++) {
    var coor1 = pointArray[i];
    var coor2 = pointArray[i + 1];
    var crr = getCenterPoint([coor1, coor2], cell);
    for (var a = 0; a < crr.length; a++) {
      brr.push(crr[a]);
    }
  }

  return brr;
};

export const showPoint = (index) => {
  if (allMovePointsIndex[index] + 1 < allMovePoints[index].length) {
    var firstPoint = allMovePoints[index][allMovePointsIndex[index]];
    var secondPoint = allMovePoints[index][allMovePointsIndex[index] + 1];
    var transRotate = getAngle(firstPoint.x, firstPoint.y, secondPoint.x, secondPoint.y);
    var carlayer = getLayerByid("carpoint");
    let cars = carlayer.getSource().getFeatures().filter(ite => ite.values_.index === index)
    if (cars.length > 0) {
      carlayer.getSource().removeFeature(cars[0])
    }
    let po = [allMovePoints[index][allMovePointsIndex[index]].x, allMovePoints[index][allMovePointsIndex[index]].y]
    var carOverLay = new Feature({
      angle: transRotate,
      id: "carpoint",
      index: index,
      geometry: new Point(po)
    });
    carlayer.getSource().addFeature(carOverLay)
    // 活动线轨迹
    let hdlinelayer = getLayerByid("hdcarline");
    if (hdlinelayer) {
      let pf = hdlinelayer.getSource().getFeatures()
      if (pf.length > 0) {
        let coors = pf[0].getGeometry().getCoordinates()
        coors.push(po)
        pf[0].getGeometry().setCoordinates(coors)
      } else {
        let hdroute = new LineString([po, po]);
        let hdrouteFeature = new Feature({
          geometry: hdroute,
        });
        hdlinelayer.getSource().addFeature(hdrouteFeature)
      }
    }
    allMovePointsIndex[index]++;
  } else {
    if (movings[index] !== undefined) {
      clearInterval(movings[index]) // 清除移动
    }
  }
};


export const creatCarLine = (pointArray, pointindex) => {
  // 线
  let vectorLayer = getLayerByid("carline")
  var route = new LineString(pointArray);
  var routeFeature = new Feature({
    geometry: route,
  });
  vectorLayer.getSource().addFeature(routeFeature)
  //点 
  let zcvectorLayer = getLayerByid("zcpointid")
  let sevectorLayer = getLayerByid("qspointid")
  let cbvectorLayer = getLayerByid("cbpointid")
  let le = pointArray.length
  pointArray.forEach((item, index) => {
    let staus = "zcd"
    if (index == 0) {
      staus = "start"
    } else if (index == (le - 1)) {
      staus = "end"
    }
    pointindex[index].zs = le
    pointindex[index].ds = index + 1
    let f = new Feature({
      staus: staus,
      attributes: pointindex[index],
      geometry: new Point(item),
    })
    if (pointindex[index].EXCEEDING !== "未超标") {
      cbvectorLayer.getSource().addFeature(f);
    } else {
      zcvectorLayer.getSource().addFeature(f);
    }

    if (index == 0 || (index == le - 1)) {
      sevectorLayer.getSource().addFeature(f);
    }
  });

  window.$olMap.getView().fit(routeFeature.getGeometry(),
    { duration: 1000 })

};

结果展示

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

紫雪giser

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值