vue3 geoscene 轨迹回放

<template>
  <div class="trackMap-container">
    <div id="mapDiv">
      <div class="box">
        <button @click="start">开始</button>
        <button @click="pause">暂停</button>
<!--        <button @click="goOn">继续</button>-->
        <button @click="back">返回</button>
      </div>
    </div>
  </div>
</template>
<script setup>
import {reactive, ref} from "vue";
import {onMounted} from "vue";
import Map from "@geoscene/core/Map.js";
import MapView from "@geoscene/core/views/MapView.js";
import GraphicsLayer from "@geoscene/core/layers/GraphicsLayer.js";
import Graphic from "@geoscene/core/Graphic.js";
import boat from '@/assets/nxt/fish/boat.jpg'

const props = defineProps({
  LocationList: {
    type: Array
  }
});
let viewMap
let map
let graphicsLayer
let moveLayer
let startingPoint = reactive({})
let trackPlayBackOption = reactive({
  interval: null, // 轨迹运动定时器
  count: 0, // 计数器
  path: props.LocationList, // 路径
  speed: 1, // 速度
})



function initMap() {
  map = new Map({
    basemap: "tianditu-vector",
  });
  viewMap = new MapView({
    map: map,
    center: props.LocationList[0], // 经度,纬度
    zoom: 8, // 缩放级别
    container: "mapDiv",
  });
  viewMap.ui.components = [];
  graphicsLayer = new GraphicsLayer();
  map.add(graphicsLayer);

  viewMap.when(
      () => {
        // 地图加载完成
        setTimeout(() => {
          viewMap.goTo({
            // 视角切换动画
            center: props.LocationList[0], //终点坐标
            heading: 360, // 面向正南
            z: 10000,
            tilt: 40, //视图角度cos
            zoom: 13, //放大等级
          })
        }, 1000)
      },
      function (error) {
        console.error(error)
        alert('加载失败,稍后重新加载')
        window.reload()
      }
  )
  let polyline = {
    type: 'polyline', // autocasts as new Polyline()
    paths: props.LocationList,
  }
  let lineSymbol = {
    type: 'simple-line', // autocasts as SimpleLineSymbol()
    color: [226, 119, 40],
    width: 2,
  }
  let polylineGraphic = new Graphic({
    geometry: polyline,
    symbol: lineSymbol,
  })
  viewMap.graphics.add(polylineGraphic)

  let modelCar = initModelCar()
  moveLayer = new GraphicsLayer({
    id: 'moveLayer',
  })
  map.add(moveLayer)
  moveLayer.add(
      new Graphic({
        geometry: startingPoint,
        symbol: modelCar,
      })
  )


}



function start() {
  clearInterval(trackPlayBackOption.interval)
  trackPlayBackOption.interval = null

  let data = trackPlayBackOption.path
  trackPlayBackOption.interval = setInterval(() => {
    trackPlayBackOption.count++
    if (trackPlayBackOption.count < data.length) {
      moveLayer.removeAll()
      moveLayer.add(
          new Graphic({
            geometry: {
              type: 'point',
              longitude: data[trackPlayBackOption.count][0],
              latitude: data[trackPlayBackOption.count][1],
            },
            symbol: {
              type: 'picture-marker',
              url: boat,
              width: 36, //模型宽度ssss
              height: 36, //模型高度
            },
          })
      )
    } else {
      clearInterval(trackPlayBackOption.interval)
      trackPlayBackOption.interval = null
    }
    viewMap.goTo({
      center: data[trackPlayBackOption.count]
    })
    viewMap.zoom = 8
  }, trackPlayBackOption.speed * 1000)

}

function pause() {
  clearInterval(trackPlayBackOption.interval)
  trackPlayBackOption.interval = null
}

function goOn() {
  clearInterval(trackPlayBackOption.interval)
  trackPlayBackOption.interval = null
}

function back() {
  clearInterval(trackPlayBackOption.interval)
  trackPlayBackOption.interval = null
  moveLayer.removeAll()
  trackPlayBackOption.count = 0
  let data = trackPlayBackOption.path
  moveLayer.add(
      new Graphic({
        geometry: {
          type: 'point',
          longitude: data[trackPlayBackOption.count][0],
          latitude: data[trackPlayBackOption.count][1],
        },
        symbol: {
          type: 'picture-marker',
          url: boat,
          width: 36, //模型宽度ssss
          height: 36, //模型高度
        },
      })
  )
}

// 初始化车辆
function initModelCar() {
  // 设置起点
  startingPoint = {
    type: 'point',
    longitude: props.LocationList[0][0],
    latitude: props.LocationList[0][1],
  }
  let modelNewCar = {
    type: 'picture-marker',
    url: boat,
    width: 36, //模型宽度ssss
    height: 36, //模型高度
  }
  return modelNewCar
}

// 创建车辆
function setModelCar(x1, y1, x2, y2) {
  let modelNewCar = {
    type: 'picture-marker',
    url: boat,
    width: 36, //模型宽度ssss
    height: 36, //模型高度
  }
  return modelNewCar
}

onMounted(() => {
  initMap()
});

</script>


<style scoped lang="scss">
.trackMap-container {
  width: 100%;

  #mapDiv {
    width: 100%;
    height: 70vh;
    position: relative;

    .box {
      position: absolute;
      top: 10px;
      right: 20px;
    }
  }

}

:deep(.geoscene-view-surface--touch-none::after) {
  outline: none !important;
}
</style>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于Vue 3和高德地图的轨迹,你可以按照以下步骤进行操作: 1. 首先,确保你已经安装了Vue 3和高德地图的相关依赖。你可以使用npm或yarn来安装这些依赖。例如,在你的Vue项目中,可以运行以下命令来安装高德地图的依赖: ``` npm install vue-amap ``` 2. 在你的Vue组件中,引入Vue AMap库并注册该组件: ```javascript import VueAMap from 'vue-amap'; export default { ... mounted() { Vue.use(VueAMap); VueAMap.initAMapApiLoader({ key: 'your_amap_key', plugin: ['AMap.Polyline'] }); }, ... } ``` 在上述代码中,你需要将`your_amap_key`替换成你自己的高德地图API密钥。 3. 在模板中添加地图容器和控件: ```html <template> <div> <amap :zoom="13" :center="[lng, lat]"> <amap-polyline :path="path" :visible="true" :style="{ strokeColor: 'red', strokeWeight: 6 }"></amap-polyline> </amap> </div> </template> ``` 在上述代码中,`amap`是地图容器组件,`amap-polyline`是轨迹的折线组件。你可以根据需要调整地图的缩级别和中心点位置,以及折线的样式。 4. 在组件的`data`属性中定义轨迹的经纬度数据: ```javascript data() { return { lng: 116.397428, lat: 39.90923, path: [ [116.405289, 39.904987], [116.406089, 39.904987], [116.406289, 39.905087], // 更多经纬度数据... ] }; } ``` 你需要根据实际情况提供正确的经纬度数据。 5. 最后,你可以根据需求实现轨迹的逻辑。例如,你可以使用定时器来逐步显示折线上的点,实现轨迹的动态效果。 这样,你就可以在Vue 3中使用高德地图实现轨迹了。记得根据你的实际需求进行相应的调整和扩展。希望这能帮到你!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值