亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Vue+Openlayers實現自定義軌跡動畫

發布時間:2020-10-30 21:18:40 來源:億速云 閱讀:1860 作者:Leah 欄目:開發技術

本篇文章為大家展示了Vue+Openlayers實現自定義軌跡動畫,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

<template>
 <div class="map-warp">
 <h4>
  <a
  href="https://openlayers.org/en/latest/examples/feature-move-animation.html&#63;q=polyline"
  target="_bank"
  >OpenlayersTrack</a>

  <!--js 軌跡回放 https://blog.csdn.net/Himire/article/details/80296738 -->
 </h4>
 <div class="progress-bar">
  <div class="bar-box">
  <div class="bar" :>
   <span>{{progress}}%</span>
  </div>
  </div>
 </div>
 <div id="map" class="map"></div>
 <el-row :gutter="20">
  <el-col :span="5">
  <label for="speed">
   運動速度:&nbsp;
   <input id="speed" type="range" step="10" value="5" />
  </label>
  </el-col>
  <el-col :span="5">
  <button @click="handlerPlay">{{textContent}}</button>
  </el-col>
 </el-row>
 </div>
</template>

<script>
import "ol/ol.css";
import Feature from "ol/Feature";
import Map from "ol/Map";
import View from "ol/View";
import Polyline from "ol/format/Polyline";
import { Projection } from "ol/proj";
import { Point, LineString } from "ol/geom";
import { Tile as TileLayer, Vector as VectorLayer } from "ol/layer";
import XYZ from "ol/source/XYZ";
import VectorSource from "ol/source/Vector";
import {
 Circle as CircleStyle,
 Fill,
 Icon,
 Stroke,
 Style,
 Text
} from "ol/style";
import { getVectorContext } from "ol/render";

export default {
 data() {
 return {
  map: null,
  progress: 0, // 進度
  animating: false, // 動畫是否開始
  speed: null, // 速度
  now: null, // 當前時間
  textContent: "開始",
  routeCoords: null, // 數組點集合
  routeLength: null, // 數組長度
  route: null, // 線
  routeFeature: null, // 畫線
  geoMarker: null, // 標記
  startMarker: null, // 開始標記
  endMarker: null, // 結束標記
  styles: {
  route: new Style({
   // 線的樣式
   stroke: new Stroke({
   width: 6,
   color: [237, 212, 0, 0.8]
   })
  }),
  icon: new Style({
   // 默認icon樣式
   image: new CircleStyle({
   radius: 7,
   fill: new Fill({ color: "red" }),
   stroke: new Stroke({
    color: "white",
    width: 2
   })
   })
  }),
  geoMarker: new Style({
   // 設置標記樣式
   image: new Icon({
   anchor: [0.5, 1], // 偏移位置
   // rotation: 0, // 旋轉
   // size: [52, 26], // 圖標大小
   src: require("@/assets/tx-icon-1.png")
   })
  }),
  start: new Style({
   // 設置開始標記樣式
   image: new Icon({
   anchor: [0.5, 1],
   src: require("@/assets/rise.png")
   })
  }),
  end: new Style({
   // 設置結束標記樣式
   image: new Icon({
   anchor: [0.5, 1],
   src: require("@/assets/end.png")
   })
  })
  },
  vectorLayer: null, // 矢量圖層
  center: [118.835014569433, 32.08414190192472] // 中心點
 };
 },
 methods: {
 // 初始化地圖
 initMap() {
  let that = this;
  that.routeCoords = [
   [118.83476768752418, 32.08385299388422],
   [118.83491813875425, 32.08394894013734],
   [118.83504349233812, 32.08408332210981],
   [118.83504349233812, 32.08408332210981],
   [118.83512889261571, 32.083918456790876],
   [118.83517286002402, 32.083733744293006],
   [118.83496824937895, 32.084077663081935],
   [118.83490797978696, 32.08412326115879],
   [118.83489815812887, 32.08414025948315],
   [118.83488806541473, 32.084153465524956],
   [118.83488315718186, 32.08415572622981],
   [118.8348782482698, 32.0841596143537],
   [118.83485807031045, 32.08416812475921],
   [118.83484798473395, 32.08416424284437],
   [118.83483789451235, 32.08417148163059],
   [118.83483789122208, 32.08417934749756],
   [118.83489794089253, 32.084006273376524],
   [118.83490803262733, 32.08399523720106],
   [118.83491321591835, 32.08398700421235],
   [118.83491812613363, 32.083979861216235],
   [118.83491812890527, 32.08397308027895],
   [118.83492822118053, 32.0839606878946],
   [118.83493831179283, 32.08395236406387],
   [118.8349443113023, 32.08394818448314],
   [118.83494840317711, 32.0839421415609],
   [118.8349582198328, 32.08393707761024],
   [118.83495822192893, 32.08393192409512],
   [118.83495822314188, 32.083928940480945],
   [118.83495822600715, 32.08392188830153],
   [118.83496831727095, 32.08391193701643],
   [118.83496832133952, 32.083901901220244],
   [118.83497432325855, 32.083891754391544],
   [118.83497841676457, 32.083881642888024],
   [118.83498850812316, 32.083871420344074],
   [118.8349985986039, 32.08386336769408],
   [118.83499860472438, 32.08384817837085],
   [118.83500869639813, 32.08383714209293],
   [118.83500870130179, 32.083824936382825],
   [118.83501279510463, 32.08381401114558],
   [118.83501852555108, 32.08380088571361],
   [118.83502861687877, 32.08379066312818]
  ];
  that.routeLength = that.routeCoords.length;
  that.route = new LineString(that.routeCoords);

  that.routeFeature = new Feature({
  type: "route",
  geometry: that.route
  });
  that.geoMarker = new Feature({
  type: "geoMarker",
  geometry: new Point(that.routeCoords[0])
  });
  that.startMarker = new Feature({
  type: "start",
  geometry: new Point(that.routeCoords[0])
  });
  that.endMarker = new Feature({
  type: "end",
  geometry: new Point(that.routeCoords[that.routeLength - 1])
  });
  // that.endMarker.setStyle(

  // new Style({
  //  // image: new CircleStyle({
  //  // radius: 7,
  //  // fill: new Fill({ color: "red" }),
  //  // stroke: new Stroke({
  //  //  color: "white",
  //  //  width: 2
  //  // })
  //  // }),
  //  // image: new Icon({
  //  // src: require("@/assets/tx-icon-1.png")
  //  // }),
  //  // text: new Text({
  //  // text: '11133333333333333333333333333333333311',
  //  // scale: 1.3,
  //  // fill: new Fill({
  //  //  color: '#000000'
  //  //  }),
  //  // Stroke:new Stroke({
  //  //  color: '#FFFF99',
  //  //  width: 3.5
  //  // })
  //  // })
  // })
  // );

  that.vectorLayer = new VectorLayer({
  source: new VectorSource({
   features: [
   that.routeFeature,
   that.geoMarker,
   that.startMarker,
   that.endMarker
   ]
   // 線、標記、開始標記、結束標記
  }),
  style: function(feature) {
   // 如果動畫處于活動狀態,則隱藏標記
   if (that.animating && feature.get("type") === "geoMarker") {
   return null;
   }
   return that.styles[feature.get("type")];
  }
  });
  this.map = new Map({
  target: "map",
  layers: [
   new TileLayer({
   source: new XYZ({
    url:
    "http://www.google.cn/maps/vt&#63;lyrs=m@189&gl=cn&x={x}&y={y}&z={z}"
   }),
   projection: "EPSG:3857"
   }),
   that.vectorLayer
  ],
  view: new View({
   projection: new Projection({ code: "EPSG:4326", units: "degrees" }),
   center: this.center,
   zoom: 19,
   minZoom: 2,
   maxZoom: 19
  })
  });
  this.mapClick();
 },

 // 地圖綁定事件
 mapClick() {
  let that = this;
  this.map.on("click", function(event) {
  let feature = that.map.getFeaturesAtPixel(event.pixel);
  let pixel = that.map.getEventPixel(event.originalEvent);
  let coodinate = event.coordinate;
  // let temp = feature[0].geometryChangeKey_.target
  // Point
  if (feature.length > 0) {
   console.warn(feature[0].values_.type, 111);
   // console.warn(feature[0].get('geometryChangeKey'),9999999999)
  }
  });
 },

 // 運動軌跡開關
 handlerPlay() {
  if (this.textContent === "暫停") {
  this.stop(false);
  } else {
  this.start();
  }
 },

 // 軌跡移動
 moveFeature(event) {
  let vectorContext = getVectorContext(event);
  let frameState = event.frameState;
  if (this.animating) {
  let elapsedTime = frameState.time - this.now;
  let index = Math.round((this.speed * elapsedTime) / 1000);
  // 進度條
  this.progress = Math.floor(
   ((100 / this.routeLength) * (this.speed * elapsedTime)) / 1000
  );
  if (index >= this.routeLength) {
   this.progress = "100";
   this.stop(true);
   return;
  }

  let currentPoint = new Point(this.routeCoords[index]);
  let feature = new Feature(currentPoint);
  vectorContext.drawFeature(feature, this.styles.geoMarker);
  }
  // tell OpenLayers to continue the postrender animation
  this.map.render(); // 開始移動動畫
 },

 // 開始動畫
 start() {
  if (this.animating) {
  this.stop(false);
  } else {
  this.animating = true;
  this.textContent = "暫停";
  this.now = new Date().getTime();
  let speedInput = document.getElementById("speed");
  this.speed = speedInput.value;
  this.geoMarker.setStyle(null); // hide geoMarker 隱藏標記
  // just in case you pan somewhere else
  this.map.getView().setCenter(this.center); // 設置下中心點
  this.vectorLayer.on("postrender", this.moveFeature);
  this.map.render();
  }
 },

 // 停止
 stop(ended) {
  this.progress = 0;
  this.animating = false;
  this.textContent = "開始";
  let coord = ended
  &#63; this.routeCoords[this.routeLength - 1]
  : this.routeCoords[0];
  let geometry = this.geoMarker.getGeometry().setCoordinates(coord);
  //remove listener
  this.vectorLayer.un("postrender", this.moveFeature); // 刪除偵聽器
 }
 },
 mounted() {
 this.initMap();
 }
};
</script>

<style lang="scss">
#map {
 height: 500px;
 margin-top: 20px;
}
/*隱藏ol的一些自帶元素*/
.ol-attribution,
.ol-zoom {
 display: none;
}
.progress-bar {
 width: 100%;
 height: 30px;
 margin: 30px 0;
 background: url("~@/assets/bg-5.png") center bottom no-repeat;
 background-size: 100% 30px;
 position: relative;
 box-sizing: border-box;
 .bar-box {
  position: absolute;
  top: 10px;
  left: 30px;
  right: 30px;
  height: 10px;
  border-radius: 5px;
  background: #034c77;
 }
 .bar {
  height: 10px;
  border-radius: 5px;
  background: url("~@/assets/bg-6.png") 0 bottom repeat #ecc520;
  position: relative;
  span {
  width: 50px;
  height: 50px;
  line-height: 18px;
  font-size: 12px;
  font-weight: bold;
  text-align: center;
  position: absolute;
  color: #fe0000;
  top: -30px;
  right: -25px;
  background: url("~@/assets/bg-7.png") center 0 no-repeat;
  background-size: 100% 30px;
  }
 }
 }
</style>

Vue+Openlayers實現自定義軌跡動畫

上述內容就是Vue+Openlayers實現自定義軌跡動畫,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

和林格尔县| 来安县| 泗洪县| 普安县| 女性| 彭水| 南木林县| 汉寿县| 肇庆市| 汉沽区| 临洮县| 宁都县| 北川| 无锡市| 大关县| 辽源市| 南岸区| 塔河县| 阳东县| 正宁县| 广饶县| 安西县| 潼关县| 方正县| 长兴县| 荥阳市| 罗山县| 淮滨县| 揭阳市| 东平县| 五华县| 桃江县| 息烽县| 安陆市| 五大连池市| 东明县| 富蕴县| 蒙阴县| 图木舒克市| 恩平市| 安塞县|