openlayer点沿线动画

2023-05-16

Marker Animation

 核心代码:

		// 开始动画
		let lastTime = Date.now();
		let distance = 0;
		function moveFeature(event) {
			const speed = 100;
			const time = event.frameState.time;
			const elapsedTime = time - lastTime;
			distance = (distance + (speed * elapsedTime) / 1e6) % 2;
			lastTime = time;
			const currentCoordinate = polyline.getCoordinateAt(
				distance > 1 ? 2 - distance : distance
			);
			position.setCoordinates(currentCoordinate);
			const vectorContext = ol.render.getVectorContext(event);
			vectorContext.setStyle(styles.geoMarker);
			vectorContext.drawGeometry(position);
			map.render();
		}
		vectorLayer.on('postrender', moveFeature);
		

完整代码:

<!DOCTYPE html>
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
		<title>点沿线动画</title>
		<!-- 
		<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v6.5.0/css/ol.css" type="text/css">
		<script src="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v6.5.0/build/ol.js"></script>
		 -->
		<link rel="stylesheet" href="./js/ol.css" />
		<script type="text/javascript" src="./js/ol.js"></script>
		<style type="text/css">
			html,
			body,
			#map {
				margin: 0px;
				padding: 0px;
				width: 100%;
				height: 100%;
			}
		</style>
	</head>
	<body>
		<div id="map"></div>
	</body>
	<script type="text/javascript">
		function transform(pois) {
			return ol.proj.transform(pois, 'EPSG:4326', 'EPSG:3857')
		}

		var tileLayer = new ol.layer.Tile({
			source: new ol.source.XYZ({
				url: 'http://wprd0{1-4}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&style=7&x={x}&y={y}&z={z}'
			})
		});
		var map = new ol.Map({
			controls: [],
			target: 'map',
			layers: [tileLayer],
			view: new ol.View({
				center: transform([103.584297498027, 36.119086450265]),
				zoom: 4,
			})
		});

		// 线
		var lineCoord = [
			[79.78351732091059, 38.26132508806543],
			[91.24445696667777, 40.75626733863021],
			[95.39289017514336, 33.53665615186689],
			[101.72101517514338, 38.866081722355915],
			[106.7132069666778, 33.18429652688876],
			[115.29132982091058, 36.190051824120644]
		];
		var polyline = new ol.geom.LineString(lineCoord);
		polyline.transform('EPSG:4326', 'EPSG:3857');

		const routeFeature = new ol.Feature({
			type: 'route',
			geometry: polyline,
		});
		const startMarker = new ol.Feature({
			type: 'icon',
			geometry: new ol.geom.Point(polyline.getFirstCoordinate()),
		});
		const endMarker = new ol.Feature({
			type: 'icon',
			geometry: new ol.geom.Point(polyline.getLastCoordinate()),
		});

		const position = startMarker.getGeometry().clone();
		const geoMarker = new ol.Feature({
			type: 'geoMarker',
			geometry: position,
		});

		const styles = {
			'route': new ol.style.Style({
				stroke: new ol.style.Stroke({
					width: 6,
					color: [237, 212, 0, 0.8],
				}),
			}),
			'icon': new ol.style.Style({
				image: new ol.style.Icon({
					anchor: [0.5, 1],
					src: './summary/node_blue.gif',
				}),
			}),
			'geoMarker': new ol.style.Style({
				image: new ol.style.Circle({
					radius: 7,
					fill: new ol.style.Fill({
						color: 'black'
					}),
					stroke: new ol.style.Stroke({
						color: 'white',
						width: 2,
					}),
				}),
			}),
		};

		const vectorLayer = new ol.layer.Vector({
			source: new ol.source.Vector({
				features: [routeFeature, geoMarker, startMarker, endMarker],
			}),
			style: (feature) => {
				return styles[feature.get('type')];
			},
		})
		map.addLayer(vectorLayer);
		
		// 开始动画
		let lastTime = Date.now();
		let distance = 0;
		function moveFeature(event) {
			const speed = 100;
			const time = event.frameState.time;
			const elapsedTime = time - lastTime;
			distance = (distance + (speed * elapsedTime) / 1e6) % 2;
			lastTime = time;
			const currentCoordinate = polyline.getCoordinateAt(
				distance > 1 ? 2 - distance : distance
			);
			position.setCoordinates(currentCoordinate);
			const vectorContext = ol.render.getVectorContext(event);
			vectorContext.setStyle(styles.geoMarker);
			vectorContext.drawGeometry(position);
			map.render();
		}
		vectorLayer.on('postrender', moveFeature);
		
	</script>
</html>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

openlayer点沿线动画 的相关文章

  • VS2015运行项目时提示:.exe不是内部或外部命令,也不是可运行程序或批处理文件

    VS2015运行项目时提示 xff1a exe不是内部或外部命令 xff0c 也不是可运行程序或批处理文件 解决方法 xff08 1 xff09 添加系统变量 xff08 即 xff0c 将该exe文件所在目录添加到系统Path中 xff0
  • 二维码分类

    二维码分类 最近在做二维码解码的项目 用的是zxing库 43 VS2015 43 OPENCV3 4 xff0c 网上说ZBAR库也ok xff1b 概念 xff1a 二维条码 二维码 xff08 2 dimensional bar co
  • Labview 编写TCP/IP 客户端断线重连机制程序,亲测可用

    程序面板如下图 xff1a 此程序支持任意一方断线重连机制 xff0c 仅供大家参考 xff01 实际工程中 xff0c 如果出现服务器出现宕机 xff0c 那么我们的客户端要有重连的机制 xff0c 不然软件不会自动连接服务器 xff0c
  • C++ STL 库函数大全

    include lt assert h gt 设定插入点 include lt ctype h gt 字符处理 include lt errno h gt 定义错误码 include lt float h gt 浮点数处理 include
  • 多旋翼飞行器电机旋转方向图示

  • FreeRTOS浅析:解决两个任务运行冲突,系统停止一个任务唤醒另一个任务的方法

    FreeRTOS中的任务和多线程的概念差不多 xff0c 但是任务的本质是把时间片无限的切小 xff0c 小到人分辨不出来 xff0c 其实还是一个时间只能运行一个任务 xff0c 这是和多线程的根本区别 FreeRTOS中的任务有几种运行
  • 各种路由器接口与连接方法

    转自于 http bbs pcsoft com cn thread 138952 1 4 html 路由器所在的网络位置比较复杂 xff0c 既可是内部子网边缘 xff0c 也可位于内 外部网络边缘 同时为了实现强大的适用性 xff0c 它
  • 迭代器(Iterator)

    迭代器 Iterator 是一个对象 xff0c 它的工作是遍历并选择序列中的对象 xff0c 它提供了一种访问一个容器 container 对象中的各个元素 xff0c 而又不必暴露该对象内部细节的方法 通过迭代器 xff0c 开发人员不
  • 单片机串口发送数据很慢?这种方法帮助你提高!

    本文介绍如何使用带FIFO的串口来减少接收中断次数 xff0c 通过一种自定义通讯协议格式 xff0c 给出帧打包方法 xff1b 之后介绍一种特殊的串口数据发送方法 xff0c 可在避免使用串口发送中断的情况下 xff0c 提高系统的响应
  • 2020-11-21

    xftp 提示无法显示远程文件夹 不是什么被动不被动的问题 是权限的问题 xff0c 如果这个文件夹有 34 x 34 权限 就可以打开 没有就不行
  • three.js加载3D模型(glb/gltf/fbx)

    three js加载3D模型 glb gltf fbx 一 理解three 1 一个可以在某个3D建模软件打开的东西 xff0c 通过某种方案在浏览器中打开 xff1b 2 不要试图手动去创建3D图形 xff0c 当然比较闲的话可以这样操作
  • 单片机复位电路原理

    单片机的复位引脚RST 全称RESET 出现2个机器周期以上的复位电平 时 xff0c 单片机就执行复位操作 如果RST持续为复位电平 xff0c 单片机就处于循环复位状态 当单片机处于正常电平时就正常转入执行程序 图1 xff1a 当单片
  • 在ubuntu下安装vmware-tools

    用vmware虚拟机安装了ubuntu之后 xff0c 为了实现更加强大的功能 xff0c 比如说直接从windows主机拖文件进入ubuntu xff0c 以及加强ubuntu的性能 xff0c 我们一般都要安装vmware tools
  • 虚拟机安装Ubantu 16.04,并修改配置文件更改网络配置

    https blog csdn net qq 41016818 article details 81211744 ops request misc 61 amp request id 61 amp biz id 61 102 amp utm
  • Ubuntu 16.04下安装visual studio code

    一 坑和解决办法 很多帖子上写的方法都是使用命令方式 xff1a 1 先安装make sudo add apt repository ppa ubuntu desktop ubuntu make sudo apt get update su
  • 虚拟机Ubuntu与外网连接

    详情可参考 xff1a https blog csdn net gaoganghua article details 80386107 ops request misc 61 257B 2522request 255Fid 2522 253
  • Xftp6如何连接虚拟机(Ubuntu)Windows与虚拟机之间传输文件

    一 安装Ubuntu ssh出现异常 Err 1 http security ubuntu com ubuntu xenial security main amd64 openssh sftp server amd64 1 7 2p2 4u
  • ubuntu下搭建ftp服务器

    1 安装vsftpd xff0c 安装命令 xff1a sudo apt get install vsftpd 查看是否安装成功 xff1a vsftpd version 2 新建一个文件夹用于FTP的工作目录 xff08 cpucard是
  • 命名空间 std 中没有名为 stoi 的成员

    我正在测试std stoi以下链接中的函数 xff1a 但我收到了错误 xff1a 已经添加了头文件 include lt string gt xff0c 但仍然错误提示 xff1a 在命名空间 std 中没有名为 stoi 的成员 xff
  • Linux+vscode 客户端通过代码操作远程服务器端数据库(MySQL)

    这篇文章解决两个问题 xff1a 1 在Linux系统下使用vscode用C C 43 开发客户端程序时 xff0c 如何调用mysql库函数 xff1b 2 客户端与远程服务器端的MySQL连接时 xff0c 需要做哪些前期准备工作 xf

随机推荐

  • put操作提示 No such file or directory

    https blog csdn net weixin 33875839 article details 86128344
  • IDEA导入lib目录下的jar包

    https blog csdn net u010286027 article details 85248719 ops request misc 61 amp request id 61 amp biz id 61 102 amp utm
  • MIPS、ARM、X86三大架构

    MIPS ARM X86三大架构 RISC平台的发展已经有长达几十年的历史了 其最早诞生于80年代的MIPS主机 xff0c 随着技术的不断发展 xff0c RISC平台的应用领域逐步扩展 xff0c 小到手机 xff0c 大到工控设备都可
  • 报错:Diamond types are not supported at language level ‘6‘

    在编译时报错 xff1a 这主要是1 6版本的javac exe编译器不支持菱形运算符 xff1b 解决办法 xff1a 1 修改设置settings和项目结构Project Structure中的JDK版本设置 配置IDEA编译器版本 2
  • Ubuntu18.04.3虚拟机安装步骤

    Ubuntu18 04 3虚拟机安装步骤 xff08 图文教程 xff0c 非常详细 xff01 xff01 xff01 xff09 丶无殇的博客 CSDN博客 ubuntu18虚拟机安装
  • 信号包络

    将一段时间长度的高频信号的峰值点连线 xff0c 就可以得到上方 xff08 正的 xff09 一条线和下方 xff08 负的 xff09 一条线 xff0c 这两条线就叫包络线 包络线就是反映高频信号幅度变化的曲线 对于等幅高频信号 xf
  • 归一化函数normalize详解

    opencv 2 归一化函数normalize详解 1 归一化定义与作用 归一化 就是要把需要处理的数据经过处理后 xff08 通过某种算法 xff09 限制在你需要的一定范围内 首先归一化是为了后面数据处理的方便 xff0c 其次是保证程
  • 多态性之编译期多态和运行期多态(C++版)

    多态性之编译期多态和运行期多态 C 43 43 版 C 43 43 中最为经典的就是多态性 xff0c 多态性充分体现了面向对象的思想 xff0c 并且是C 43 43 与C的最大区别之一 多态性分为编译期多态和运行期多态 xff0c 也称
  • SVM 原理详解,通俗易懂

    看了该作者的文章 xff0c 瞬间膜拜了 xff01 讲得太好了 xff01 转自 xff1a http www blogjava net zhenandaci category 31868 html xff08 一 xff09 SVM的简
  • 线阵相机学习笔记(一)

    1 GigE Vision GigE Vision是由自动化影像协会AIA Automated Imaging Association 发起指定的一种基于千兆以太网的图像传输的标准 具有传输距离长 xff08 无中继时100米 xff09
  • 如何做一个软件项目经理? ----写给公司所有的开发人员

    第一部分 xff1a 软件项目经理的要求 首先是一个管理者 xff0c 其次熟悉某些工具 xff0c 某几种语言 xff0c 行业背景 xff0c 项目管理技能 软件项目经理面临的恶劣环境 xff0c 我们绝大部分软件企业运行在相对混乱的状
  • vector介绍和基本使用

    文章目录 一 vector介绍二 vector使用 1 constructor 2 iterator 3 capacity 4 Element access 5 Modifiers 三 vector迭代器失效问题 一 vector介绍 ve
  • PELCO(派尔高)协议解析及下载(转载)

    PELCO xff08 派尔高 xff09 协议解析及下载 沈雪瑜 在IBMS接口开发 中 xff0c 我们需要用到一些常用的协议 xff0c 而PELCO 派尔高 的监控器材在我国有很广泛的应用 PELCO有自己的传输控制协议 xff0c
  • STM32&nbsp;HAL库&nbsp;STM3…

    原文地址 xff1a STM32 HAL库 STM32CUBEMX KEIL TIM1 PWM 四路输出可调 一 作者 xff1a 用户2797410335 硬件 xff1a TM32F407VET6 8M晶振 xff0c JLINK JT
  • 海康设备网络SDK开发NET_DVR_GetDeviceConfig

    由于官方的例子中没有关于NET DVR GetDeviceConfig的示例 xff0c 在此记录一下 NET DVR GET FIELD DETECTION 获取区域入侵侦测配置 xff0c 避免其他小伙伴踩坑 这里只记录主要代码 xff
  • geoserver热图

    1 参考 GeoServer发布Heatmap wenglabs 博客园 Rendering Transformations GeoServer 2 21 x User Manual 2 下载 GeoServer 及wps插件 xff0c
  • arcgis的lyr样式转qgis的sld样式

    需求 xff1a arcgis样式lyr要发布到geoserver 先说最终技术路线 xff1a qgis安装slyr插件 xff0c lyr转成xml xff0c 再通过xml配图后导出sld 避免的操作 xff1a lyr直接导出sld
  • httpclient海康ISAPI透传

    可以使用海康SDK调用NET DVR STDXMLConfig进行透传 xff0c 但是这种方式仍然比较麻烦 SDK的透传其实就是http的包装 xff0c 可以完全撇开海康SDK xff0c 也就是通过http的方式获取或者设置 xff0
  • openlayers文字随线的方向

    在不使用ol ext时需要自己计算方向 效果 xff1a 核心代码 xff1a function styleArrow start end title var arrowLonLat 61 end 0 43 start 0 2 end 1
  • openlayer点沿线动画

    Marker Animation 核心代码 xff1a 开始动画 let lastTime 61 Date now let distance 61 0 function moveFeature event const speed 61 10