openlayer的飞行动画

Openlayer animate动效优化 一、问题产生 问题产生很简单。公司要做一个需求,定位飞行功能,即,点击定位,获取经纬度,一个飞行的动画,飞到目标点和层级。拿到这个需求的时候,心里想,这简单啊。直接查OpenLayer API.找到了这样的一个函数: view.animate(var_args) 于是手气刀落,敲下了这样一段代码: //获取目标定位点等函数省略 this.map.getView().animate({cente...... 阅读详情

飞行动画官方例子:https://openlayers.org/en/latest/examples/flight-animation.html
在这里插入图片描述

<template>
  <div class="con-box">
    <div id="map" class="map" />
  </div>
</template>

<script>
import "ol/ol.css";
import olMap from "ol/Map";
import olView from "ol/View";
import ollayerTile from "ol/layer/Tile";
// import olsourceOSM from "ol/source/OSM";
import { get as getProjection, Projection, fromLonLat } from "ol/proj";
import VectorLayer from "ol/layer/Vector";
import VectorSource from "ol/source/Vector";
import { Point, LineString, MultiLineString, Polygon } from "ol/geom";
import XYZ from "ol/source/XYZ";
import { Map, View, Feature, ol } from "ol";
import {
  Circle,
  Fill,
  Stroke,
  Style,
  Text,
  Icon,
  Circle as CircleStyle,
} from "ol/style.js";
import Overlay from "ol/Overlay.js";
import { Image } from "ol/layer.js";
import { OSM, Vector, ImageStatic } from "ol/source";
import { defaults as defaultControls } from "ol/control";
import GeoJSON from "ol/format/GeoJSON.js";
import { Tile as TileLayer } from "ol/layer.js";
import Draw, { createBox, createRegularPolygon } from "ol/interaction/Draw";
import { unByKey } from "ol/Observable";
import { getVectorContext } from "ol/render";
import { easeIn, easeOut } from "ol/easing";
import Stamen from "ol/source/Stamen.js";
import {getWidth} from 'ol/extent.js';
const pointsPerMs = 0.02;
export default {
  data() {
    return {
      value: "",
      dataURL1: "https://scpic.chinaz.net/files/pic/pic9/202012/bpic22030.jpg",
      map: null,
      view: null,
      positionLayer: null,
      featuresArr: [],

      opt: {
        img: "",
        imgsize: "",
      },
      geo: null,
      vlayer: null,
      draw: null,
      source: null,
      multiSource: null,
      feature: null,
      duration: 3000,
      tileLayer: null,
      testArr: [],
      simplyArr: [
        [0, 0],
        [-600, 600],
        [600, 0],
        [0, -600],
      ],
      multiArr: [
        [
          [0, 0],
          [600, 600],
          [-600, 0],
          [0, -600],
        ],
        [
          [300, 0],
          [800, 200],
          [0, 0],
          [0, -100],
        ],
      ],
      trackPoint: null,
      simpLine: null,
      multiLine: null,
      traceCroods: null,
      sliderPos: 0,
      styleOl: new Style({
        stroke: new Stroke({
          color: "#EAE911",
          width: 2,
        }),
      }),
      flightsSource: null,
      flightsLayer: null,
    };
  },
  mounted() {
    this.initmap();
  },

  methods: {
    initmap() {
      this.tileLayer = new TileLayer({
        source: new Stamen({
          layer: "toner",
        }),
      });
      this.map = new Map({
        layers: [this.tileLayer],
        target: "map",
        view: new View({
          center: [-11000000, 4600000],
          zoom: 2,
        }),
      });
      this.initFlightMap()
    },
    initFlightMap() {
      let self = this;
      this.flightsSource = new VectorSource({
        attributions:
          "Flight data by " +
          '<a href="https://openflights.org/data.html">OpenFlights</a>,',
        loader: function () {
          const url = "data/geojson/flight.json";
          fetch(url)
            .then((response) => {
              return response.json();
            })
            .then((json) => {
              const flightsData = json.flights;
              for (let i = 0; i < flightsData.length; i++) {
                const flight = flightsData[i];
                const from = flight[0];
                const to = flight[1];

                // create an arc circle between the two locations
                const arcGenerator = new arc.GreatCircle(
                  { x: from[1], y: from[0] },
                  { x: to[1], y: to[0] }
                );

                const arcLine = arcGenerator.Arc(100, { offset: 10 });
                // paths which cross the -180°/+180° meridian are split
                // into two sections which will be animated sequentially
                const features = [];
                arcLine.geometries.forEach(function (geometry) {
                  
                  const line = new LineString(geometry.coords);
                  line.transform("EPSG:4326", "EPSG:3857");
                  features.push(
                    new Feature({
                      geometry: line,
                      finished: false,
                    })
                  );
                });
                self.addLater(features, i * 50);
              }
              self.tileLayer.on("postrender", self.animateFlights);
            });
        },
      });
this.flightsLayer = new VectorLayer({
  source: this.flightsSource,
  style: function (feature) {
    // if the animation is still active for a feature, do not
    // render the feature with the layer style
    if (feature.get('finished')) {
      return self.styleOl;
    }
    return null;
  },
});
this.map.addLayer(this.flightsLayer)

    },
    addLater(features, timeout) {
      
      let self=this;
      window.setTimeout(function () {
        let start = Date.now();
        features.forEach(function (feature) {
          feature.set("start", start);
          self.flightsSource.addFeature(feature);
          const duration =
            (feature.getGeometry().getCoordinates().length - 1) / pointsPerMs;
       
          start += duration;
             
        });
      }, timeout);
    },

    animateFlights(event) {
      console.log('渲染事件',event)
      const vectorContext = getVectorContext(event);
      const frameState = event.frameState;
      vectorContext.setStyle(this.styleOl);

      const features = this.flightsSource.getFeatures();
      for (let i = 0; i < features.length; i++) {
        const feature = features[i];
        if (!feature.get("finished")) {
          // only draw the lines for which the animation has not finished yet
          const coords = feature.getGeometry().getCoordinates();
          const elapsedTime = frameState.time - feature.get("start");
          if (elapsedTime >= 0) {
            const elapsedPoints = elapsedTime * pointsPerMs;

            if (elapsedPoints >= coords.length) {
              feature.set("finished", true);
            }

            const maxIndex = Math.min(elapsedPoints, coords.length);
            const currentLine = new LineString(coords.slice(0, maxIndex));

            // animation is needed in the current and nearest adjacent wrapped world
            const worldWidth = getWidth(
              this.map.getView().getProjection().getExtent()
            );
            const offset = Math.floor(
              this.map.getView().getCenter()[0] / worldWidth
            );

            // directly draw the lines with the vector context
            currentLine.translate(offset * worldWidth, 0);
            vectorContext.drawGeometry(currentLine);
            currentLine.translate(worldWidth, 0);
            vectorContext.drawGeometry(currentLine);
          }
        }
      }
      // tell OpenLayers to continue the animation
      this.map.render();
    },


  },
};
</script>

<style scoped>
#map {
  width: 97%;
  margin: 0 auto;
  /* background: rgb(238, 238, 238); */
}

.con-box {
  width: 100%;
  height: 100%;
  border: 1px solid #999999;
}

.map {
  height: 700px;
  border: 1px solid;
}

.icon_but {
  margin: 0 10px;
  padding: 10px;
  border: 1px solid red;
}

.toolbar {
  margin: 10px;
}

.toolbar span {
  display: inline-block;
}

.ol-popup {
  border: 1px solid red;
  font-size: 20px;
  font-weight: bolder;
}

.con-box {
  width: 100%;
  height: calc(100% - 84px);
  border: 1px solid #999999;
}
</style>
Openlayers实战:平移、弹性平移、飞行动画 Openlayers地图上经常会遇到这样的一种 场景,获取到某数据后,会重新定位中心点到某个位置,这里可以用setCenter([lon,lat]), 更可以用动画的形式展现。在本实战中,展示出平移、弹性平移、飞行的动画。 阅读详情

相关推荐

OpenLayers入门,OpenLayers实现多个轨迹运动动画效果,也可以实现二维地图迁徙图效果

上一章中,我们已经实现了单个轨迹运动动画效果。如果可以创建多个轨迹运动动画,那我们就可以使用OpenLayers实现类似echarts相同的迁徙图飞行效果。

GIS技术方向,GIS地图技术分享(GIS入门、Openlayers教程、Leaflet教程),做最好的GIS地图开发教程。关注博主公众号:eguid 3361

openlayers 入门(13)动画

主要学习一下 view层上的animate方法

qq_53079432的博客 561

OpenLayers6入门,OpenLayers视图飞行动画,OpenLayers飞行到指定经纬度位置

本章实现OpenLayers视图飞行动画,根据经纬度和动画持续时长,飞行到指定地图位置。《Openlayers入门,Openlayers调整中心点坐标、Openlayers调整缩放级别、Openlayers调整地图可视角度和地图复位》

GIS技术方向,GIS地图技术分享(GIS入门、Openlayers教程、Leaflet教程),做最好的GIS地图开发教程。关注博主公众号:eguid 1444

Openlayer飞行视图flyTo,viewTo

一、view.animate() this.map.getView().animate({ center: [104.08033177398742, 31.128669413488353], zoom: 17, duration: 1000, }); 二、view.fit(geometry,options) flyToCurrentViewByGeometry(geometry) { this.map.getView().fi

2315

Vue+OpenLayers7入门到实战:OpenLayers7地图飞行动画效果,OpenLayers飞行到指定位置,OpenLayers飞行到经纬度位置

本章介绍如何使用OpenLayers7在地图上实现OpenLayers视图飞行动画,根据经纬度和动画持续时长,飞行到地图指定的经纬度位置。

GIS技术方向,GIS地图技术分享(GIS入门、Openlayers教程、Leaflet教程),做最好的GIS地图开发教程。关注博主公众号:eguid 780

109:vue+openlayers 定位动画(平移-弹性平移-飞行 示例代码)

本示例的目的是介绍如何在vue+openlayers项目中来实现定位动画,实现平移,飞行,弹性动画等。

大剑师兰特的GIS世界 1560

OpenLayers3 动画

        参考文章 openlayers3中三种动画实现

weixin_34166847的博客 252

102.在Vue3中使用OpenLayers实现定位动画(平移-弹性平移-飞行)

在 WebGIS 开发中,OpenLayers 是一个功能强大的开源地图库,能够帮助开发者快速构建地图应用。在 Vue 3 组合式 API (Composition API) 的加持下,我们可以更优雅地封装 OpenLayers,并实现炫酷的地图交互功能。我们使用 Vue 3 + Vite 创建一个新的 Vue 项目,并安装 Element Plus 组件库来支持按钮交互。,并使用 Composition API 优化代码。作为底图,你可以替换成其他地图源,如。三种效果,并通过 Vue 3 的。

小彭的博客 1520

openlayer二维地图动态飞行定位视角

var view = map.getView(); // 设置地图中心的坐标 view.animate({ //中心位置 center : ol.proj.transform([ lon, lat ], 'EPSG:4326','EPSG:3857') }, { //缩放 zoom : 12 }, { //飞行样式 linear匀速飞行 easing : 'linear' })

lingyi_01的博客 983

Vue和OpenLayers地图上实现Echarts模拟飞机循环飞行

Vue.js作为一种流行的JavaScript框架,提供了便捷的开发方式,而OpenLayers是一个功能强大的开源地图库,可以实现各种地图应用需求。本文介绍了如何使用Vue和OpenLayers结合Echarts,在地图上实现飞机的模拟循环飞行效果。首先配置地图组件,然后添加飞机图层和Echarts图表,最后实现飞行动画。通过将飞机当前的位置设置为起点,将目标位置设置为终点,使用插值的方式不断更新飞机的位置,从而实现平滑移动的动画效果。通过设置飞机的样式为一个飞机图标,可以使用自定义的飞机图标替换。

TechNovaX的博客 583

36-OpenLayers6入门,地图平移动画效果,OpenLayers飞行到指定经纬度位置,边旋转边移动到指定位置,使用弹跳动画和弹簧动画效果移动地图到指定位置,两种弹跳动画效果

36-OpenLayers6入门,地图平移动画效果,OpenLayers飞行到指定经纬度位置,边旋转边移动到指定位置,使用弹跳动画和弹簧动画效果移动地图到指定位置,两种弹跳动画效果

fxshy的博客 224

openlayer 飞行定位到可视域

本文介绍了一种基于OpenLayers实现地图要素可视域定位的方法。通过获取要素的几何范围(extent),计算对应的地图缩放级别,并使用fit()方法将视图调整至包含该要素的范围。代码支持设置边距(padding)参数来确保要素在视图中留出适当空间,并可配置动画时长和最大缩放级别限制。该方法提供了一种平滑过渡的地图导航方式,适用于需要突出显示特定地理要素的应用场景。

qq_32290021的博客 131

OpenLayers6实战,OpenLayers实现飞机飞行轨迹动画。飞机图标自动沿着生成的贝塞尔曲线匀速运动

本章使用OpenLayers实现飞机飞行轨迹动画效果。使用一张静态png图片作为飞机图标,根据三个轨迹点生成贝塞尔曲线,飞机图标会从起点开始自动沿着生成的贝塞尔曲线进行匀速运动,飞机可以根据实时运动轨迹转向,并最终停止在终点。

GIS技术方向,GIS地图技术分享(GIS入门、Openlayers教程、Leaflet教程),做最好的GIS地图开发教程。关注博主公众号:eguid 1932

OpenLayers 动画

注:当前使用的是 ol版本,天地图使用的key请到天地图官网申请,并替换为自己的key动画在WebGIS开发中是很常见的操作,一般具有平移动画、旋转动画、弹性动画等。在OpenLayers开发中,地图动画主要由View类的animate方法实现。animate可以实现多段动画效果,其中参数包括zoomcenterresolution等。

GIS之路 610

使用Vue和OpenLayers在地图上模拟飞机循环飞行

在这篇文章中,我们将使用Vue和OpenLayers库来创建一个实时模拟飞机在地图上循环飞行的效果。本文中,我们使用Vue和OpenLayers库创建了一个实时模拟飞机循环飞行的效果。我们创建了一个简单的OpenLayers地图,以OSM图层作为底图,并将地图中心设置为经纬度[0, 0],缩放级别为2。现在,我们可以运行Vue项目以查看飞机在地图上循环飞行的效果。数组包含飞机的经纬度坐标点,用于模拟飞机的循环飞行路径。在这一步中,我们将使用定时器来模拟飞机的循环飞行。在上面的代码中,我们使用Vue的。

TechNovaX的博客 524

158:vue+openlayers 地图上Echarts模拟飞机循环飞行

本示例的目的是介绍演示如何在vue+openlayers中添使用Echarts的模拟飞机飞行,借助于一个插件ol-echarts可以加载Echarts相关的配置,关键点是要将坐标点给设置上去,详情请参考源代码。点击查看本专栏内容目录列表。

大剑师兰特的GIS世界 1639

OpenLayers常用控件 -- 章节八:地图动画控件教程

本文介绍了OpenLayers地图动画系统的实现方法,重点讲解了五种典型动画效果:旋转定位、弹性定位、反弹定位、飞行定位和围绕旋转。通过view.animate()方法结合缓动函数,可以实现流畅的地图视图过渡效果。文章详细分析了每种动画的实现原理,包括坐标转换、缓动函数设计、动画队列管理等核心技术,并提供了实际应用扩展方案。地图动画能显著提升用户体验,帮助用户建立空间感知,使地图操作更加生动直观。掌握这些动画技术可创造专业级的Web地图交互效果。

weixin_67093879的博客 884

HyperMesh实战:用Field工具搞定复杂载荷映射(附TCL脚本示例)

本文深入探讨了HyperMesh中Field工具在复杂载荷映射中的高级应用,包括从CSV到有限元网格的温度场映射全流程、稀疏数据处理技巧及TCL自动化脚本示例。通过Field工具,工程师可以高效实现CFD温度场到结构网格的精准映射,显著提升有限元分析的精度与效率。

white的博客 265

Openlayers中的动画

Openlayers中的动画

Jinuss的博客 1470

uniapp [全端兼容] - 详细实现引入使用 Google 谷歌地图显示及搜索城市地点,提供地图标点、地址搜索、定位导航、中文显示及汉化、地图打位置标点显示、搜索框搜索功能、省市区详细经纬度数据等

uniapp,h5移动端网页,微信小程序,Android,苹果ios,app,nvue,谷歌地图,官方,谷歌官方文档,googlemap,申请key,uniApp谷歌地图,详细使用教程,无法访问,集成谷歌地图,app引入谷歌地图,选点定位,地图导航,位置搜索,城市搜索,文字地点模糊查询,地点省市区详细数据,经纬度信息,markers地图标记点,一直报错怎么办,接入google地图不显示报错,谷歌地图插件,vue3,vue2,组件,Key申请流程,谷歌key怎么申请,api文档,网站打不开,用什么插件,在u

🏆 前端领域优质创作者 1万+

28、解耦控制与晶圆表面缺陷模式识别

本文介绍了两种不同领域的技术方法:基于端口受控哈密顿(PCH)的三水箱液位系统解耦控制方法,以及基于无监督学习的晶圆表面缺陷模式识别方法。前者通过能量整形实现系统解耦与稳定控制,具有良好的抗干扰性和鲁棒性;后者采用无监督预训练与分类微调两阶段策略,利用WaUSM采样方法提升特征提取能力,在WM-811K数据集上实现了先进的分类性能。文章对比了两种方法的核心技术与优势,并探讨了其在工业控制与半导体制造中的应用前景及未来发展方向,为相关领域的研究与实践提供了有价值的参考。

git9versioner的博客 75
上一篇: geojson格式展示
下一篇: uniapp的uview-plus组件库的导入
梧桐芊羽
博客等级 码龄9年 31粉丝 58原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值