三十五、openlayers官网示例Dynamic Data——在地图上加载动态数据形成动画效果

OpenLayers动画效果 通过上述代码,我们成功地实现了在OpenLayers地图上的动画效果。此外,为了使动画效果更加流畅,你可能需要优化代码,例如使用更快的动画插值函数、减少路径点的数量等。在下面的示例中,我们将创建一个简单的地图,并在地图上添加一个移动的标记,以模拟动画效果。在引入OpenLayers之后,我们可以开始编写实现动画效果的代码。现在,我们已经创建了一个移动的标记,但它还没有动画效果。为了实现动画效果,我们可以使用OpenLayers的动画模块。是标记图标的文件名,你需要将其替换为你自己的图标文件路径。 阅读详情

官网demo地址:

 Dynamic Data

 初始化地图

 const tileLayer = new TileLayer({
      source: new OSM(),
    });

    const map = new Map({
      layers: [tileLayer],
      target: "map",
      view: new View({
        center: [0, 0],
        zoom: 2,
      }),
    });

    创建了三个样式

const imageStyle = new Style({
      image: new CircleStyle({
        radius: 5,
        fill: new Fill({ color: "yellow" }),
        stroke: new Stroke({ color: "red", width: 1 }),
      }),
    });

    const headInnerImageStyle = new Style({
      image: new CircleStyle({
        radius: 2,
        fill: new Fill({ color: "blue" }),
      }),
    });

    const headOuterImageStyle = new Style({
      image: new CircleStyle({
        radius: 5,
        fill: new Fill({ color: "black" }),
      }),
    });

绘制动画效果主要还是利用了postrender事件,其原理解析可以参考这篇

十八、openlayers官网示例Custom Animation解析——地图上添加自定义动画、圆圈涟漪效果_unbykey(listenerkey);-优快云博客

// 点的数量,用于定义图形的分辨率
    const n = 200;
    // 角速度常量,用于计算当前时间的角度
    const omegaTheta = 30000;
    // 大圆的半径
    const R = 7e6;
    // 小圆的半径
    const r = 2e6;
    // 距离小圆中心的点的距离
    const p = 2e6;
    tileLayer.on("postrender", function (event) {
      //获取渲染上下文和帧状态
      //用于在地图上绘制矢量图形
      const vectorContext = getVectorContext(event);
      //包含当前帧的状态,包括时间信息
      const frameState = event.frameState;
      //计算当前角度 theta 根据当前时间和 omegaTheta 计算当前角度 theta,用于动画效果
      const theta = (2 * Math.PI * frameState.time) / omegaTheta;
      //生成外旋轮线的坐标数组
      const coordinates = [];
      let i;
      for (i = 0; i < n; ++i) {
        const t = theta + (2 * Math.PI * i) / n;
        const x = (R + r) * Math.cos(t) + p * Math.cos(((R + r) * t) / r);
        const y = (R + r) * Math.sin(t) + p * Math.sin(((R + r) * t) / r);
        coordinates.push([x, y]);
      }
      vectorContext.setStyle(imageStyle);
      //设置样式 imageStyle 并绘制多点几何(MultiPoint)
      vectorContext.drawGeometry(new MultiPoint(coordinates));
      const headPoint = new Point(coordinates[coordinates.length - 1]);
      //将头部的圆标注出来设置成不同样式
      vectorContext.setStyle(headOuterImageStyle);
      vectorContext.drawGeometry(headPoint);
      vectorContext.setStyle(headInnerImageStyle);
      vectorContext.drawGeometry(headPoint);
      //强制重新渲染地图
      map.render();
    });

完整代码:

<template>
  <div class="box">
    <h1>Dynamic Data动态数据</h1>
    <div id="map"></div>
  </div>
</template>

<script>
import Map from "ol/Map.js";
import OSM from "ol/source/OSM.js";
import TileLayer from "ol/layer/Tile.js";
import View from "ol/View.js";
import { Circle as CircleStyle, Fill, Stroke, Style } from "ol/style.js";
import { MultiPoint, Point } from "ol/geom.js";
import { getVectorContext } from "ol/render.js";
export default {
  name: "",
  components: {},
  data() {
    return {
      map: null,
    };
  },
  computed: {},
  created() {},
  mounted() {
    const tileLayer = new TileLayer({
      source: new OSM(),
    });

    const map = new Map({
      layers: [tileLayer],
      target: "map",
      view: new View({
        center: [0, 0],
        zoom: 2,
      }),
    });

    const imageStyle = new Style({
      image: new CircleStyle({
        radius: 5,
        fill: new Fill({ color: "yellow" }),
        stroke: new Stroke({ color: "red", width: 1 }),
      }),
    });

    const headInnerImageStyle = new Style({
      image: new CircleStyle({
        radius: 2,
        fill: new Fill({ color: "blue" }),
      }),
    });

    const headOuterImageStyle = new Style({
      image: new CircleStyle({
        radius: 5,
        fill: new Fill({ color: "black" }),
      }),
    });
    // 点的数量,用于定义图形的分辨率
    const n = 200;
    // 角速度常量,用于计算当前时间的角度
    const omegaTheta = 30000;
    // 大圆的半径
    const R = 7e6;
    // 小圆的半径
    const r = 2e6;
    // 距离小圆中心的点的距离
    const p = 2e6;
    tileLayer.on("postrender", function (event) {
      //获取渲染上下文和帧状态
      //用于在地图上绘制矢量图形
      const vectorContext = getVectorContext(event);
      //包含当前帧的状态,包括时间信息
      const frameState = event.frameState;
      //计算当前角度 theta 根据当前时间和 omegaTheta 计算当前角度 theta,用于动画效果
      const theta = (2 * Math.PI * frameState.time) / omegaTheta;
      //生成外旋轮线的坐标数组
      const coordinates = [];
      let i;
      for (i = 0; i < n; ++i) {
        const t = theta + (2 * Math.PI * i) / n;
        const x = (R + r) * Math.cos(t) + p * Math.cos(((R + r) * t) / r);
        const y = (R + r) * Math.sin(t) + p * Math.sin(((R + r) * t) / r);
        coordinates.push([x, y]);
      }
      vectorContext.setStyle(imageStyle);
      //设置样式 imageStyle 并绘制多点几何(MultiPoint)
      vectorContext.drawGeometry(new MultiPoint(coordinates));
      const headPoint = new Point(coordinates[coordinates.length - 1]);
      //将头部的圆标注出来设置成不同样式
      vectorContext.setStyle(headOuterImageStyle);
      vectorContext.drawGeometry(headPoint);
      vectorContext.setStyle(headInnerImageStyle);
      vectorContext.drawGeometry(headPoint);
      //强制重新渲染地图
      map.render();
    });
    map.render();
  },
  methods: {},
};
</script>

<style lang="scss" scoped>
#map {
  width: 100%;
  height: 500px;
}
.box {
  height: 100%;
}
</style>

百度地图离线开发demo(vue+百度地图3.0+百度瓦片) 百度地图3.0离线方案 阅读详情

相关推荐

openlayers很多特效demo

openlayers很多特效demo openlayers很多特效demo openlayers很多特效demo

OpenLayers Demo

在地图上放置一张地图 html lang="en"> head> link rel="stylesheet" href="https://openlayers.org/en/v4.6.2/css/ol.css" type="text/css"> style> .map { height: 400px; width: 100

qq_38425662的博客 926

openlayers3 简单示例

openlayers 3 示例代码 demo.html:基本的地图展示示例 - map-animation.html:地图动画效果示例 - map-zoom.html:地图基本缩放操作示例 - map-controls.html:地图控件显示的操作示例 - map-geojson.html: 加载geojson示例 - map-spy.html: 地图通透镜效果 - map-swipe.html:地图卷帘效果

一、openlayers官网示例Accessible Map解析

openlayers官网的demo根本不适合小白,于是写了一系列解析文章。很多人打开openlayers官网第一个demo,兴致冲冲的copy下来代码,运行起来却发现,嗯?地图咋出不来?代码也看不太懂,这是啥情况?别慌,俺来带你解析一下~

aaa_div的博客 2528

AWR射频仿真基本操作(一)

这里只讲述一个基本的操作: 软件是AWR 14版本

钢丝 2万+

利用 Openocd 和 FT2232H 实现 ARMv8(Coretex-A53)高效调试方案

本文详细介绍了如何利用开源工具OpenOCD与高性能USB转接芯片FT2232H,构建一套针对ARMv8架构(如Cortex-A53)的高效、低成本调试方案。内容涵盖从环境搭建、驱动配置、核心调试架构解析到实战问题排查的全过程,帮助开发者实现对多核处理器的透明、可控调试,是嵌入式Linux及底层开发的实用指南。

weixin_29163581的博客 280

OpenLayers轨迹动画

以上示例中,我们先创建了一个包含一条线段的矢量图层,然后定义了一个速度变量和一些动画函数。OpenLayers中的轨迹动画可以通过使用OpenLayers的Vector和Feature API,结合一些JavaScript动画库,如Tween.js或jQuery,来实现。OpenLayers是一款开源的地图库,可以在Web浏览器中显示交互式地图。需要注意的是,在使用OpenLayers的Vector API时,需要使用transform方法将经纬度坐标转换为Web墨卡托投影坐标。1.准备地图和轨迹数据。

lixue7921的博客 1386

IsaacGym四足机器人sim to real全过程详细解析(walk these ways方法)

本文使用强化学习的方法运行到Aliengo机器人上完成从训练到部署的全过程。该方法使用的是GO1机器人提供了完整的sim to real代码和遥控器控制代码,所以我们只需要重新训练和部署健康就可以使用在Aliengo上。该方法使用lcm进行通讯首先程序通过UDP和机器人控制板进行通讯获取机器人状态并下达指令。然后又通过lcm进行机器人状态信息的发布和模型命令的获取。

weixin_44061195的博客 2万+

OpenLayers demo

Demo – Vue <template> <div> <div id="map" class="map" tabindex="0"></div> <button id="zoom-out" @click="add">Zoom out</button> <button id="zoom-in" @click="deleteMap">Zoom in</button> <bu

zxz_learn的博客 515

大模型技术驱动智慧矿山数字化转型

多模态大模型作为AI领域的前沿技术,通过融合视觉、传感器等多源数据,构建了强大的环境理解与决策能力。其核心价值在于打破数据孤岛,实现实时分析与智能响应,特别适用于工业场景中的复杂系统优化。在智慧矿山建设中,该技术通过数字孪生、设备自诊断和智能调度等模块,显著提升了安全生产效率和资源利用率。典型应用包括基于强化学习的采掘路径规划、多层级灾害预警体系构建,以及可自我更新的矿山知识图谱系统,这些创新正在推动传统矿业向数字化、智能化方向转型。

weixin_29061531的博客 222

深度强化学习算法PPO训练Pendulum

returnadv = 0print('状态空间维度:', state_n)print('动作空间维度:', action_n)steps = []if done:breakif done:breakelse:steps = []if done:break。

weixin_43336108的博客 808

openlayers轨迹回放Demo

<!DOCTYPE html> <html> <head> <title>openlayers轨迹回放</title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v6.3.1/css/ol.css" type="text/css" .

treasurecp的博客 1069

【补充篇】三万字了解AUTOSAR软件架构(一)

主要讲解了AUTOSAR软件架构的分层及各个栈的作用

weixin_47571898的博客 1119

OpenLayers官方教程二:实现简单的地图显示

目录 一、下载OpenLayers 二、构建简单的地图应用 三、OpenLayers的DOM元素组织结构 经过上一篇文章对OpenLayers的简单了解以后,现在让我们来实现一个简单的地图显示Demo。 一、下载OpenLayers 打开OpenLayers官网:https://openlayers.org/ 然后点击Get the Code: ‘ ...

不睡觉的怪叔叔的博客 1万+

基于STM32、HAL库的GZP6816D气压传感器 驱动程序设计

测量范围:0-16kPa(可根据型号不同有变化)工作电压:1.8V-3.6V。高精度:±1% FS。

corlin6688的博客 217

华为OD机试真题 新系统【Skill执行链完整性检测】

华为OD机试 新系统真题【Skill执行链完整性检测】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【Skill执行链完整性检测】

qq_45776114的博客 763

openlayers 入门教程(十三):动画

OpenLayers 是一款流行的JavaScript库,提供了丰富的功能来实现各种地图动画效果,包括但不限于轨迹动画、图标动画(如GIF动画)、地图平移与缩放动画、以及自定义的几何形状动画等。

大剑师兰特的GIS世界 3943

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

openlayers6离线开发demo-关于ol的投影与坐标

openlayers6离线地图开发

oliver666666的博客 590

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

OpenLayers画点、画圆、画线方法

文章目录准备工作项目搭建画地图画圆更改Style画点画线 准备工作 项目搭建 创建Vue项目 vue create OpenLayers 安装openlayers包,在package,.json中添加 "dependencies": { "core-js": "^3.8.3", "vue": "^3.2.13", "vue-router": "^4.0.3", "ol": "^6.4.3" 👈添加这个 }, 命令行安装 npm i 画地图 导入要用的包 impo

qq_44220795的博客 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

openlayers自定义动画

一. openlayers介绍 OpenLayers 是一个专为Web GIS 客户端开发提供的JavaScript 类库包,用于实现标准格式发布的地图数据访问。OpenLayers 支持多种地图来源,其中包括Google Maps、Yahoo、 Map、微软Virtual Earth 等,同时用户还可以用简单的图片地图作为背景图,与其他的图层在OpenLayers 中进行叠加。在操作方面,OpenLayers 除了可以在浏览器中帮助开发者实现地图浏览的基本效果,比如放大(Zoom In)、缩小(Zoom

qq_43607777的博客 2375

openlayers 根据中心点和半径得到实际距离的圆

解决openlayer绘制圆形偏移问题

weixin_57721277的博客 779

openlayers如何使用(三)动态数据加载

在循环构建点元素的时候,我们每构建一个点,在下次重新构建的时候需要清除掉之前的所有点,才能重新渲染,这就需要在进入构建方法前清除掉之前的图层与叠加层。

可乐加冰的博客 1107

OpenLayers案例Demo:地图开发的优秀助手

OpenLayers案例Demo:地图开发的优秀助手 【下载地址】OpenLayers案例Demo详细注释 本项目提供了一套详尽的OpenLayers案例代码及详细注释,旨在帮助开发者更好地理解和运用OpenLayers进行地图开发。代码示例简洁明了,包含丰富的注释说明,便于理解和学习。由于网上许多案例不够全面,本项目整...

gitblog_06782的博客 626

openlayers 入门(13)动画

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

qq_53079432的博客 561

4. Openlayers 点、线、面基本样式渲染(结合Vue 详细教程)

在本篇博客中,我们将学习如何在 OpenLayers 中使用样式系统,并在 Vue 项目中绘制点、线、面的基本样式。首先,我们将学习 OpenLayers 的样式系统,然后使用 Vue 创建一个地图组件,并在地图组件中添加点、线、面要素并为其设置样式。

全栈三维GIS开发工程师,擅长Cesium、OpenLayers、Three.js、WebGL、Vue、Django、GDAL和QGIS技术。在这个博客里,我将分享我的开发经验、技术心得和项目案例,希望能为GIS爱好者和开发者提供有价值的参考。 5849

十八、openlayers官网示例Custom Animation解析——地图上添加自定义动画、圆圈涟漪效果

记录动画开始的时间,红色圈的动画执行是3秒 ,在annimate函数里实时获取动画执行的过程中的每一帧的当前时间,用当前时间减去初始的时间,算出已经过去的时间elapsed,当elapsed时间大于等于3000时终止函数。先来看一下一次动画的完整流程,每隔一秒地图上增加一个蓝色圈,蓝色圈上增加一个半径慢慢变大,透明度慢慢变小的红色圈,红色圈执行3秒,然后消失,下一个蓝色圈开始出现。首先定义一个动画执行的时间,克隆一个几何形状,并保证每一次添加蓝色圈后都绑定一次annimate事件。重点是红色圈的产生函数。

aaa_div的博客 1206
上一篇: 三十四、openlayers官网示例Dynamic clusters解析——动态的聚合图层
下一篇: 三十七、openlayers官网示例Earthquakes Heatmap解析——在地图上加载热力图
卷新心菜
博客等级 码龄4年 720粉丝 65原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值