四十九、openlayers官网示例Immediate Rendering (Geographic)——在地图上绘制星空动画效果

news2024/11/24 7:34:01

官网demo地址:

Immediate Rendering (Geographic) 

首先先创建1000个随机点,创建点对象。 

 const n = 1000;
    const geometries = new Array(n);

    for (let i = 0; i < n; ++i) {
      const lon = 360 * Math.random() - 180;
      const lat = 180 * Math.random() - 90;
      geometries[i] = new Point([lon, lat]);
    }

 因为创建的点坐标是地理坐标,而地图默认是3857投影展示,所以使用 useGeographic()让所有坐标都直接使用地理坐标系(EPSG:4326)

import { useGeographic } from "ol/proj.js"; 
useGeographic();

等同于在view中设置projection为"EPSG:4326"

view: new View({
        center: [0, 0],
        zoom: 2,
        projection: "EPSG:4326",
      }),

 然后利用postrender在地图上绘制动画效果,每次随机生成一个点,push进geometries数组中,同时将数组的第一个删除,使地图上的点动态的出现消失。

layer.on("postrender", function (event) {
      const vectorContext = getVectorContext(event);

      for (let i = 0; i < n; ++i) {
        const importance = upAndDown(Math.pow((n - i) / n, 0.15));
        if (importance < 0.1) {
          continue;
        }
        style.getImage().setOpacity(importance);
        style.getImage().setScale(importance);
        vectorContext.setStyle(style);
        vectorContext.drawGeometry(geometries[i]);
      }

      const lon = 360 * Math.random() - 180;
      const lat = 180 * Math.random() - 90;
      geometries.push(new Point([lon, lat]));
      geometries.shift();
      map.render();
    });

其中upAndDown 是openlayers提供的缓动函数,创建动画效果。定义了动画的进度和速度曲线,使得动画效果更加平滑和自然。调整点的透明度和缩放比例,从而实现点的渐显渐隐效果。

const importance = upAndDown(Math.pow((n - i) / n, 0.15));

计算了每个点的重要性,Math.pow((n - i) / n, 0.15) 计算了一个缩放值,upAndDown 函数应用了缓动效果,使得这个缩放值先增加后减少。 

如果不喜欢点,也可以换成星星图形。

    const star = new RegularShape({
      radius: 10,
      radius2: 3,
      points: 5,
      angle: Math.PI,
      fill: new Fill({
        color: "rgba(255, 153, 0, 0.8)",
      }),
    });
   const style = new Style({
      // image: image,
      image: star,
    });

完整代码:

<template>
  <div class="box">
    <h1>Immediate Rendering (Geographic)</h1>
    <div id="map" class="map"></div>
  </div>
</template>

<script>
import StadiaMaps from "ol/source/StadiaMaps.js";
import TileLayer from "ol/layer/Tile.js";
import { Circle, Fill, Style, Icon, RegularShape } from "ol/style.js";
import { Map, View } from "ol/index.js";
import { Point } from "ol/geom.js";
import { getVectorContext } from "ol/render.js";
import { upAndDown } from "ol/easing.js";
import { useGeographic } from "ol/proj.js";
export default {
  name: "",
  components: {},
  data() {
    return {
      map: null,
    };
  },
  computed: {},
  created() {},
  mounted() {
    useGeographic();

    const layer = new TileLayer({
      source: new StadiaMaps({
        layer: "stamen_toner",
      }),
    });

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

    const image = new Circle({
      radius: 8,
      fill: new Fill({ color: "rgba(255, 153, 0, 0.8)" }),
    });
    const star = new RegularShape({
      radius: 10,
      radius2: 3,
      points: 5,
      angle: Math.PI,
      fill: new Fill({
        color: "rgba(255, 153, 0, 0.8)",
      }),
    });
    const style = new Style({
      // image: image,
      image: star,
    });
    
    const n = 1000;
    const geometries = new Array(n);

    for (let i = 0; i < n; ++i) {
      const lon = 360 * Math.random() - 180;
      const lat = 180 * Math.random() - 90;
      geometries[i] = new Point([lon, lat]);
    }
    layer.on("postrender", function (event) {
      const vectorContext = getVectorContext(event);

      for (let i = 0; i < n; ++i) {
        const importance = upAndDown(Math.pow((n - i) / n, 0.15));
        if (importance < 0.1) {
          continue;
        }
        style.getImage().setOpacity(importance);
        style.getImage().setScale(importance);
        vectorContext.setStyle(style);
        vectorContext.drawGeometry(geometries[i]);
      }

      const lon = 360 * Math.random() - 180;
      const lat = 180 * Math.random() - 90;
      geometries.push(new Point([lon, lat]));
      geometries.shift();
      map.render();
    });
  },
  methods: {},
};
</script>

<style lang="scss" scoped>
#map {
  width: 100%;
  height: 500px;
}
.box {
  height: 100%;
}
#popup {
  width: 160px;
  height: 80px;
  border-radius: 10px;
  background: #fff;
  position: absolute;
  padding: 10px;
  box-sizing: border-box;
}
.triangle {
  position: absolute;
  left: 50%;
  transform: translateX(-50%);
  bottom: -20px;
  border-top: 10px solid #fff;
  border-bottom: 10px solid transparent;
  border-left: 10px solid transparent;
  border-right: 10px solid transparent;
}
</style>

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

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

相关文章

【医学图像处理】从ADNI中下载样本的MMSE数据

MMSE是什么&#xff1f; 简易精神状态检查&#xff08;MMSE&#xff0c;Mini-Mental State Examination&#xff09;是一种广泛使用的认知功能评估工具。它通常用于临床和研究环境中筛查痴呆症及评估其严重程度。MMSE通过考察患者的多种认知功能来进行评估&#xff0c;包括算术…

《算法设计与分析》第五六章:回溯法与分支限界法

文章目录 回溯法分支限界法一、本章作业1.活动安排问题2.旅行商问题3.单源最短路径4.任务分配问题 二、算法积累1.回溯法求解01背包问题2.回溯法求解最大团问题3.回溯法求解n皇后问题4.回溯法求解地图着色5.回溯法求解哈密尔顿图6.回溯法求活动安排7.分支限界法求01背包问题8.分…

模拟原神圣遗物系统-小森设计项目,需求分析

需求分析 我操控某个角色的圣遗物时发现&#xff0c;一开始玩啥也不懂慢慢了解&#xff0c;今天才想起要不做一个 &#xff0c;然后开始想需求 跟Ai聊技术 聊着聊着 发现圣遗物 这个东西有点意思 本来今天打算写一下数据库 的外键想起了一些高兴的事情&#xff08;美人鱼&#…

超酷的数学神器2024最新破解版Mathtype7下载!

嗨&#xff0c;亲爱的朋友们&#xff01;&#x1f44b; 今天我要给大家分享一个超酷的数学神器——最新破解版Mathtype 7&#xff01;&#x1f389; 如果你像我一样&#xff0c;经常需要处理复杂的公式和文档&#xff0c;那么这个工具绝对是你的福音&#xff01;&#x1f4da;&…

大小鼠足底机械刺痛仪——可移动手持随时刺随时记录

简单介绍&#xff1a; 大小鼠足底机械刺痛仪主要用来评估机械痛&#xff08;阈值&#xff09;&#xff0c; 可用来检测所有的感官阈痛测试。配置了探针。能准确检测并能记录痛阈的仪器。操作方便&#xff0c;设计紧凑。 实验简便&#xff1a;使用时&#xff0c;把探针接触实验…

【C++】循环、控制流语句、

8、循环&#xff08;loops&#xff09;&#xff08;1&#xff09;for loops for循环非常灵活&#xff0c;可以做很多事情。上图红框框出来的代码块就是一个for循环。 for是关键字 for后面内容分为三部分&#xff0c;每部分用分号&#xff1b;隔开 第一部分A是变量的声明&…

小白如何重装系统win10?电脑一键重装系统傻瓜式操作!超详细步骤!

随着电脑的广泛应用&#xff0c;给笔记本/台式电脑系统重装已成为一项基本技能。对于电脑新手而言&#xff0c;如何重装Win10系统&#xff0c;或者更高版本的Win11系统可能是一个巨大的挑战。如果对电脑重装系统刚好有需要了解的小伙伴&#xff0c;不妨看看下面的干货分享。本文…

Spring源码-xxxAware实现类和BeanPostProcessor接口调用过程

xxxAware实现类作用 以ApplicationContextAware接口为例 ApplicationContextAware的作用是可以方便获取Spring容器ApplicationContext&#xff0c;从而可以获取容器内的Bean package org.springframework.context;import org.springframework.beans.BeansException; import or…

百度一下首页制作(HTML+CSS)

部分代码展示&#xff1a; <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>百度一下&#xff0c;你就知道</title><style type"text/css">/*清除元素默认性质*/body { margin: 0;padding: 0;list-…

白酒:酒文化的教育价值与实践

酒文化作为中国传统文化的重要组成部分&#xff0c;具有丰富的教育价值。云仓酒庄的豪迈白酒作为酒文化的品牌之一&#xff0c;在传承与发展中不断挖掘和发挥酒文化的教育价值。 首先&#xff0c;豪迈白酒有责任传承丰富的历史文化知识。从酒的起源、酿造技艺、酒器文化到酒礼酒…

NoMaD: Goal Masked Diffusion Policies for Navigation and Exploration

引言 机器人学习的背景和挑战 本文的研究重点 现有方法的局限性 本文的创新点 相关工作 事先准备 视觉目标条件策略 ViNT在目标条件导航中表现出最先进的性能&#xff0c;但它不能执行无方向探索&#xff0c;需要外部的子目标建议机制。Nomad扩展了Vint&#xff0c;同时支持目…

【PyQt5】一文向您详细介绍 QHBoxLayout() 的作用

【PyQt5】一文向您详细介绍 QHBoxLayout() 的作用 下滑即可查看博客内容 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xff1a;985高校的普通本硕&a…

忘记 iPhone 密码:如果忘记密码,如何解锁 iPhone

为了提高个人数据的安全性&#xff0c;用户通常会为不同的帐户和设备创建不同的复杂密码。虽然较新的 iPhone 型号具有生物识别和面部解锁功能&#xff0c;但这些功能并不总是有效 - 如果您忘记了 iPhone 的密码&#xff0c;您可能会遇到麻烦。 iPhone 用户和 Android 用户一样…

docker ce的使用介绍

docker docker17.03以后 docker ce&#xff0c;社区免费版&#xff0c;vscode的docker插件使用的该版本&#xff08;默认windows只支持windows容器&#xff0c;linux支持linux容器&#xff09;docker ee&#xff0c;企业版本 docker17.03以前 docker toolbox&#xff0c;基于…

Python4 操作MySQL数据库

通过python的pymysql库连接到本地的MySQL数据库&#xff0c;并执行查询操作来获取数据&#xff0c;然后打印出每一行的数据&#xff0c;这里以一个简单的学生表为例进行介绍。 1. MySQL的安装与数据准备 首先需要安装MySQL&#xff0c;在安装完成之后使用Navicat与本地数据库…

IFM易福门SV7500SV4200涡街流量计型号都是进口的。

IFM易福门SV7500SV4200涡街流量计型号都是进口的。工程余料。

华为---OSPF单区域配置(一)

09、OSPF 9.1 OSPF单区域配置 9.1.1 原理概述 为了弥补距离矢量路由协议的不足&#xff0c;IETF组织开发了一种基于链路状态的内部网关协议——OSPF&#xff08;Open Shortest Path First&#xff0c;开放式最短路径优先&#xff09;。 OSPF作为基于链路状态的协议&#xf…

Python开发记录--手撸加解密小工具(1)

目录 1.环境搭建 2. PyQt简介 3.小结 最近考虑设计一个涵盖国际、国家等加密算法的小工具&#xff0c;用于组内测试使用。一来回顾下算法&#xff0c;二来很久没写代码得练练手感&#xff0c;给工具取个名字&#xff1a;MuscleV0.1 MuscleV0.1涵盖的算法&#xff1a; 对称算…

ATA-2032高压放大器设计要求是什么内容

高压放大器是一种专门用于放大高电压信号的电子设备。它在许多领域都具有重要的应用&#xff0c;例如在医疗设备、科学研究、传感器驱动和测试测量等方面。设计一个高压放大器需要考虑多个因素&#xff0c;包括性能要求、安全性、稳定性和可靠性等方面。下面我们将详细讨论高压…

【计算机网络】[第4章 网络层][自用]

1 概述 (1)因特网使用的TCP/IP协议体系(四层)的网际层,提供的是无连接、不可靠的数据报服务; (2)ATM、帧中继、X.25的OSI体系(七层)中的网络层,提供的是面向连接的、可靠的虚电路服务。 (3)路由选择分两种: 一种是由用户or管理员人工进行配置(只适用于规…