OpenLayers3, 航线动画实现

news2024/9/20 7:51:21

文章目录

  • 一、前言
  • 二、代码实现
  • 三、总结


一、前言

本文基于OpenLayers3,实现航线动画的功能。

二、代码实现

<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>航线动画</title>
    <link href="../../libs/ol3/ol.css" rel="stylesheet" type="text/css" />
    <script src="../../libs/ol/ol.js" type="text/javascript"></script>
    <script src="../../libs/arc.js" type="text/javascript"></script>
</head>
<body>
    <div id="map" style="width: 100%; height: 95%; position: absolute;">
    </div>
    <script type="text/javascript">
    var tdttk = '*****' // tdttk 为天地图密钥
        var map = new ol.Map({
            layers: [
              new ol.layer.Tile({
                  title: "天地图影像图层",
                  source: new ol.source.XYZ({
                      url: "http://t0.tianditu.com/DataServer?T=img_w&x={x}&y={y}&l={z}&tk=" + tdttk
                      wrapX: false
                  })
              }),
              new ol.layer.Tile({
                  title: "天地图矢量注记图层",
                  source: new ol.source.XYZ({
                      url: "http://t0.tianditu.com/DataServer?T=cia_w&x={x}&y={y}&l={z}&tk=" + tdttk
                      wrapX: false
                  })
              })
            ],
            target: 'map',
            view: new ol.View({
                center: [0, 0],
                zoom: 2
            })
        });

        var style = new ol.style.Style({
            stroke: new ol.style.Stroke({
                color: '#EAE911',
                width: 2
            })
        });

        var flightsSource;
        var addLater = function (feature, timeout) {
            window.setTimeout(function () {
                feature.set('start', new Date().getTime());
                flightsSource.addFeature(feature);
            }, timeout);
        };

        var pointsPerMs = 0.1;
        var animateFlights = function (event) {
            var vectorContext = event.vectorContext;
            var frameState = event.frameState;
            vectorContext.setStyle(style);

            var features = flightsSource.getFeatures();
            for (var i = 0; i < features.length; i++) {
                var feature = features[i];
                if (!feature.get('finished')) {

                    var coords = feature.getGeometry().getCoordinates();
                    var elapsedTime = frameState.time - feature.get('start');
                    var elapsedPoints = elapsedTime * pointsPerMs;

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

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

                    //根据要素来描绘出线条
                    vectorContext.drawGeometry(currentLine);
                }
            }
            //继续动画效果
            map.render();
        };

        flightsSource = new ol.source.Vector({
            wrapX: false,
            attributions: 'Flight data by ' +
                  '<a href="http://openflights.org/data.html">OpenFlights</a>,',
            loader: function () {
                var url = 'flights.json';
                fetch(url).then(function (response) {
                    return response.json();
                }).then(function (json) {
                    var flightsData = json.flights;
                    for (var i = 0; i < flightsData.length; i++) {
                        var flight = flightsData[i];
                        var from = flight[0];
                        var to = flight[1];

                        //创建一个两个地点之间的弧段
                        var arcGenerator = new arc.GreatCircle(
                            { x: from[1], y: from[0] },
                            { x: to[1], y: to[0] });

                        var arcLine = arcGenerator.Arc(100, { offset: 10 });
                        if (arcLine.geometries.length === 1) {
                            var line = new ol.geom.LineString(arcLine.geometries[0].coords);
                            line.transform(ol.proj.get('EPSG:4326'), ol.proj.get('EPSG:3857'));

                            var feature = new ol.Feature({
                                geometry: line,
                                finished: false
                            });
                            //添加动画的特性与延迟所有功能并不在同一时间开始
                            addLater(feature, i * 50);
                        }
                    }
                    map.on('postcompose', animateFlights);
                });
            }
        });

        var flightsLayer = new ol.layer.Vector({
            source: flightsSource,
            style: function (feature) {
                //如果动画仍然是活跃的特性,不渲染图层样式的特性
                if (feature.get('finished')) {
                    return style;
                } else {
                    return null;
                }
            }
        });
        map.addLayer(flightsLayer);
    </script>
</body>
</html>

效果如下:
在这里插入图片描述

三、总结

以上为基于openlayer3 实现航线动画功能的简单案例,希望对您有帮助~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2095479.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

题解AtCoder ABC 358 F Easiest Maze

一道模拟题。 思路 最短的路线是直接竖着走下来&#xff0c;经过 n n n 个格子&#xff0c;所以 k k k 最小是 n n n。如果想要延长路线&#xff0c;可以采用九转大肠的形状&#xff0c;就像这样&#xff1a; 可以发现&#xff0c;每次向左走之后都必须走回来&#xff0c;…

关于几道计算机网络题的解答

2017年12月28日&#xff0c;星期四&#xff0c; 照片上的第一题中多项式的指数看不清&#xff0c;但没关系&#xff0c;就现在的情形&#xff0c;说一下大概的思路&#xff0c;参考着再结合题目中实际的参数&#xff0c;再套一遍就能把题目解出来了&#xff0c; 假设&#xf…

JS 如何判断是否是IE浏览器

例子 if(!!window.ActiveXObject || "ActiveXObject" in window){alert("抱歉&#xff0c;不支持IE浏览器&#xff01;");return; }

kafka使用

异步发送数据 package com.shf.kafka.producer; import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.ProducerConfig; import org.apache.kafka.clients.producer.ProducerRecord; import org.apache.kafka.common.serializa…

算法基础-双指针算法

最长连续不重复子序列 双指针[j, i]维护的是以a[i]结尾的最长连续不重复子序列[j, i - 1]是前一步得到的最长连续不重复子序列&#xff0c;所以如果[j, i]中有重复元素&#xff0c;一定是a[i]&#xff0c;所以[j, i - 1]中一定有一个数字与a[i]重复&#xff0c;因此右移j直到a[…

【AI学习笔记】AIGC,AI绘画 ComfyUI+ComfyUI Manager安装

【AI学习笔记】ComfyUIComfyUI Manager安装 最近在面向BOSS直聘学习ComfyUI的使用&#xff0c;但是不出意外&#xff0c;因为学习者们迥异的电脑配置以及杂乱的AI软件工具包互相纠缠&#xff0c;跟人工智能相关的环境安装多少都会遇到点教程预料不到的BUG。 推荐入门教程&…

基于SpringBoot的智能医院管理系统

&#x1f4a5;&#x1f4a5;源码和论文下载&#x1f4a5;&#x1f4a5;&#xff1a;基于SpringBoot的智能医院管理系统-源码论文报告数据库文件.rar 1. 系统介绍 随着计算机科学的迅猛发展和互联网技术的不断推进&#xff0c;人们的生活方式发生了巨大的变化&#xff0c;同时也…

华为云征文 | Tomcat保姆级安装教程

简介 华为云Flexus云服务是新一代开箱即用、体验跃级、面向中小企业和开发者打造的高品价比云服务产品。Flexus云服务器X实例是华为云Flexus云服务的一个产品。 Flexus云服务器X实例是新一代面向中小企业和开发者打造的柔性算力云服务器&#xff0c;可智能感知业务负载&#…

借鉴腾讯系统架构从小到大的过程 - 如何做好一个系统设计?不限于(慧哥)慧知开源充电桩平台

推荐一套企业级开源充电桩平台&#xff1a;完整代码包含多租户、硬件模拟器、多运营商、多小程序&#xff0c;汽车 电动自行车、云快充协议&#xff1b;——(慧哥)慧知开源充电桩平台&#xff1b;https://liwenhui.blog.csdn.net/article/details/134773779?spm1001.2014.3001…

华为云征文|Flexus X实例性能测评

在数字化转型时代&#xff0c;云服务器成为企业 IT 基础设施的核心&#xff0c;其性能直接影响业务运行效率和用户体验。 面对众多云服务商提供的多样配置&#xff0c;如何选择合适的云服务器就变得尤为重要。 云服务器的性能测试对于识别潜在性能瓶颈&#xff0c;确保在高并…

安装python软件

系统是32位还是64位 “此电脑"或者"我的电脑”&#xff0c;鼠标右键——属性&#xff0c;出现如下图查看电脑系统类型&#xff08;图中显示电脑系统类型是64位系统&#xff0c;安装Python则选择其名含有"adm64"字样的文件&#xff09;: 软件安装地址 全…

AtCoder ABC 369 C 题 题解

题目传送门 C - Count Arithmetic Subarrays (atcoder.jp) 题解&#xff1a; 本题可以先预处理好 与 之间的差值。首先每个数都是一个等差数列&#xff0c;接着&#xff0c;每两个数也是一个等差数列&#xff0c;然后可以看一个数字持续了几位&#xff0c;如果持续了位&am…

layui中 子页面获取父页面的数据

父页面中 window.autosend function (obj) {//获取对应行的数据&#xff0c;var datafather obj.data;// console.log(data)layer.open({type: 2,maxmin: true,title: 选择发送时间,shade: 0.1,// area: screen(),area: [600px, 400px],content: autosend,success: function(…

Linux 背景、命令

一、嵌入式、Linux背景 1、嵌入式&#xff1a; 硬件与软件相结合 定制、为硬件设计相关代码来进行操作&#xff0c;代码测试&#xff0c;烧进板子&#xff0c;通过语音、图像、按钮等操作方式来调用。 2、操作系统种类&#xff1a; Dos&#xff0c;Windows&#xff0c;Uni…

【小白教程(无伤速通)】Visual Studio中Libtorch安装与配置

1. Libtorch下载 Download here (Release version): https://download.pytorch.org/libtorch/cpu/libtorch-win-shared-with-deps-1.8.0%2Bcpu.zipDownload here (Debug version): https://download.pytorch.org/libtorch/cpu/libtorch-win-shared-with-deps-debug-1.8.0%2B…

嵌入式Linux:信号分类

目录 1、不可靠信号与可靠信号 1.1、不可靠信号 1.2、可靠信号 2、实时信号和非实时信号 2.1、非实时信号 2.2、实时信号 在Linux系统中&#xff0c;信号可以从两个不同的角度进行分类&#xff1a;一是从可靠性方面&#xff0c;将信号分为可靠信号与不可靠信号&#xff1…

小柴带你学AutoSar系列三、标准和规范篇(3)ModeManagement

目录 ModeManagementGuide 2 Overall mechanisms and concepts 2.1 Declaration of modes 2.2 Mode managers and mode users 2.3 Modes in the RTE 2.4 Modes in the Basic Software Scheduler 2.5 Communication of modes 3 Configuration of the Basic Software Mod…

系统思考—盲点突破

最‮发近‬现服务的一些‮业企‬明明‮经已‬投入了大‮资量‬源在‮化优‬产品‮服和‬务上&#xff0c;但‮觉总‬得缺少一些‮键关‬点来‮正真‬实现突破&#xff1f;团‮每队‬天都在忙碌&#xff0c;但‮绩业‬增长却‮来越‬越缓慢&#xff0c;问‮总题‬是层出不穷&…

华为云征文 | Flexus X与宝塔面板的完美结合,让云管理更轻松

需要了解 本文章主要讲述在华为云Flexus X实例 上通过命令行的方式安装宝塔面板&#xff0c;搭建项目基础软件&#xff0c;实现服务器可视化管理&#xff0c;一键部署业务代码&#xff0c;简化操作流程。选择合适的云服务器&#xff1a; 本文采用的是 华为云服务器 Flexus X 实…

22. Lammps命令学习-7之read_restart

来源&#xff1a; “码农不会写诗”公众号 链接&#xff1a;Lammps命令学习-6之read_data read_restart file 从restart文件中读取先前保存的系统配置从而可以继续先前的模拟。   https://docs.lammps.org/read_restart.html Syntax read_restart fileDescription 从restart…