openlayers WebGLPoints图层应用(光环、光晕扩散收缩)

本篇介绍一下使用 openlayers WebGLPoints图层应用(光环、光晕扩散收缩)

1 需求

  • WebGL渲染的光环、光晕扩散收缩

2 分析

  • WebGLPoints图层应用
  • ol/expr/expression 的简单使用官网解释

WebGLPoints 的 style 属性比较多(基本都是图标、填充色、描边宽度及颜色之类的)具体参见源码v9.2.4(src/ol/style/webgl.js) github地址

3 实现

3.1 光晕扩散

在这里插入图片描述

<template>
  <div id="map" class="map"></div>
  <div class="toolbar">
      <div>
        <span>日期范围</span>
        <el-slider
          v-model="date"
          :min="2000"
          :max="2024"
          range
          show-stops
          @input="handleInput"
        ></el-slider>
      </div>
  </div>
</template>

<script setup lang="ts">
import { Feature, Map, View } from 'ol';
import { WebGLTile as WebGLTileLayer } from 'ol/layer';
import { get } from 'ol/proj';
import { XYZ } from 'ol/source';
import { Vector as VectorSource } from 'ol/source.js';
import { Point } from 'ol/geom';
import WebGLPointsLayer from 'ol/layer/WebGLPoints';

const projection = get('EPSG:4326');
const key = '替换为天地图key';
const layerTypeMap = {
  vector: ['vec', 'cva'], // [矢量底图, 矢量注记]
  image: ['img', 'cia'], // [影像底图, 影像注记]
  terrain: ['ter', 'cta'] // [地形晕渲, 地形注记]
};
const startColor = 'rgba(255, 242, 0,0.7)';
const endColor = '#ff7f00';
const period = 10;
const date = ref([2000, 2024]);
let map = null;

const rate = [
  '/',
  [
    '%',
    ['+', ['time'], ['interpolate', ['linear'], ['get', 'date'], 2000, 0, 2024, period]],
    period
  ],
  period
];

const variables = computed(() => {
  return {
    min: date.value[0],
    max: date.value[1]
  };
});

const source = new VectorSource();

const pointerLayer = new WebGLPointsLayer({
  source: source,
  style: {
    variables: variables.value,
    filter: ['between', ['get', 'date'], ['var', 'min'], ['var', 'max']],
    'circle-radius': [
      '*',
      ['interpolate', ['linear'], ['get', 'count'], 0, 5, 100000, 15],
      ['+', 1.5, ['*', rate, 0.8]]
    ],
    'circle-fill-color': ['interpolate', ['linear'], rate, 0, startColor, 1, endColor],
    'circle-opacity': ['-', 1.0,  rate]
  }
});

onMounted(() => {
  initMap('image');
  initPoints();
});

const initMap = (layerType = 'image') => {
  // c: 经纬度 w: 墨卡托
  const matrixSet = 'c';
  map = new Map({
    target: 'map',
    view: new View({
      center: [116.406393, 39.909006],
      projection: projection,
      zoom: 5,
      maxZoom: 17,
      minZoom: 1
    }),
    layers: [
      // 底图
      new WebGLTileLayer({
        source: new XYZ({
          url: `https://t{0-7}.tianditu.gov.cn/DataServer?T=${layerTypeMap[layerType][0]}_${matrixSet}&tk=${key}&x={x}&y={y}&l={z}`,
          projection
        })
      }),
      // 注记
      new WebGLTileLayer({
        source: new XYZ({
          url: `https://t{0-7}.tianditu.gov.cn/DataServer?T=${layerTypeMap[layerType][1]}_${matrixSet}&tk=${key}&x={x}&y={y}&l={z}`,
          projection
        })
      }),
      pointerLayer
    ]
  });

  pointerLayer.on('postrender', function (event) {
    map.render();
  });
};

const initPoints = () => {
  const points = [
    {
      count: 50000,
      date: 2000,
      coordinates: [123, 29]
    },
    {
      count: 20000,
      date: 2001,
      coordinates: [120, 31]
    },
    {
      count: 6000,
      date: 2002,
      coordinates: [117, 29]
    },
    {
      count: 17900,
      date: 2003,
      coordinates: [121, 37]
    },
    {
      count: 500,
      date: 2005,
      coordinates: [121, 29]
    },
    {
      count: 1500,
      date: 2006,
      coordinates: [122, 22]
    },
    {
      count: 6500,
      date: 2007,
      coordinates: [125, 21]
    },
    {
      count: 70500,
      date: 2008,
      coordinates: [120, 24]
    },
    {
      count: 66500,
      date: 2009,
      coordinates: [127, 26]
    },
    {
      count: 30000,
      date: 2001,
      coordinates: [113, 29]
    },
    {
      count: 10000,
      date: 2002,
      coordinates: [110, 31]
    },
    {
      count: 16000,
      date: 2003,
      coordinates: [114, 29]
    },
    {
      count: 27900,
      date: 2004,
      coordinates: [111, 30]
    },
    {
      count: 15000,
      date: 2005,
      coordinates: [113, 26]
    },
    {
      count: 2500,
      date: 2006,
      coordinates: [111, 26]
    },
    {
      count: 3500,
      date: 2007,
      coordinates: [112, 23]
    },
    {
      count: 9500,
      date: 2007,
      coordinates: [115, 22]
    },
    {
      count: 10500,
      date: 2008,
      coordinates: [110, 25]
    },
    {
      count: 26500,
      date: 2009,
      coordinates: [120, 26]
    }
  ];
  points.forEach(p => {});
  source.addFeatures(
    points.map(
      p =>
        new Feature({
          count: p.count,
          date: p.date,
          geometry: new Point(p.coordinates)
        })
    )
  );
};

const handleInput = () => {
  pointerLayer.updateStyleVariables(variables.value);
};
</script>
<style scoped lang="scss">
.map {
  width: 100%;
  height: 100%;
}
.toolbar {
  position: absolute;
  top: 20px;
  left: 100px;
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  color: #fff;
  .el-slider {
    margin-right: 10px;
    margin-left: 10px;
  }
  div {
    width: 300px;
    height: 40px;
    display: flex;
    justify-content: center;
    align-items: center;
    span {
      width: 120px;
      margin-left: 10px;
    }
  }
}
</style>


3.2 光晕收缩

只需要将下面代码:

['+', 1.5, ['*', rate, 0.8]]

修改为:

['-', 1.5, ['*', rate, 0.8]]

在这里插入图片描述

3.3 光环扩散和收缩

只需要将下面代码:

'circle-fill-color': ['interpolate', ['linear'], rate, 0, startColor, 1, endColor],

修改为:

'circle-stroke-width':2,
'circle-stroke-color': ['interpolate', ['linear'], rate, 0, startColor, 1, endColor],

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CSS选择器(1)

以内部样式表编写CSS选择器&#xff0c;其主要编写在<head></head>元素里&#xff0c;通过<style></style>标签来定义内部样式表。 基本语法为&#xff1a; 选择器{ 声明块 } 声明块&#xff1a;是由一对大括号括起来&#xff0c;声明块中是一个一个的…

03MFC画笔/画刷/画椭圆/圆/(延时)文字

文章目录 画实心矩形自定义画布设计及使用连续画线及自定义定义变量扇形画椭圆/圆输出颜色文本定时器与定时事件画实心矩形 自定义画布设计及使用 连续画线及自定义定义变量 扇形 画椭圆/圆 输出颜色文本

杰发科技AC7801 —— __attribute__指定地址存储常量

const uint8_t usFlashInitVal[] __attribute__((at(0x08002800))) {0x55,0x55,0x55,0x55,0x55};//定位在flash中&#xff0c;0x00030000开始的6个字节信息固定 注意7801的地址在8000000之后 如地址选0x00000800烧录时候报错 不知道是不是atclinktool的bug&#xff0c;使用_…

缓存穿透,缓存雪崩,使用互斥锁解决缓存击穿

20240716学习redis 一、缓存穿透1. isNotBlank()方法和isNotEmpty()方法的区别2. 缓存穿透3. 缓存雪崩4. 缓存击穿的解决5 ctrlaltT&#xff0c;可以快速生成包围方式&#xff1a;6 //模拟重建延时7. 代码 &#xff08;使用互斥锁&#xff09; 一、缓存穿透 1. isNotBlank()方…

Linux系统编程-线程同步详解

线程同步是指多个线程协调工作&#xff0c;以便在共享资源的访问和操作过程中保持数据一致性和正确性。在多线程环境中&#xff0c;线程是并发执行的&#xff0c;因此如果多个线程同时访问和修改共享资源&#xff0c;可能会导致数据不一致、竞态条件&#xff08;race condition…

15 - matlab m_map地学绘图工具基础函数 - 一些数据转换函数(二)

15 - matlab m_map地学绘图工具基础函数 - 一些数据转换函数&#xff08;二&#xff09; 0. 引言1. 关于m_geodesic2. 关于mygrid_sand23. 结语 0. 引言 通过前面篇节已经将m_map绘图工具中大多绘图有关的函数进行过介绍&#xff0c;已经能够满足基本的绘图需求&#xff0c;本节…

我想做信号通路分析,但我就是不想学编程

“我想做信号通路分析&#xff0c;但我就是不想学编程。” “我又不是生信狗&#xff0c;学代码会死。” “你们这些做生信的&#xff0c;整天把数据分析搞得神神秘秘&#xff0c;不就是怕被人抢饭碗而已嘛。” “这都没分析出我想要的结果&#xff0c;不靠谱。” “你们做…

Go语言中GC(垃圾回收回收机制)三色标记与混合写屏障

5、Golang三色标记混合写屏障GC模式全分析 (yuque.com) 第1讲-课程目标_哔哩哔哩_bilibili Golang三色标记GC混合写屏障 Go V1.3之前的标记清除&#xff08;mark and sweep) 垃圾回收、内存管理、自动适放、三色标记法、STW (stop the world) 图的遍历&#xff1f;可达性分…

路网双线合并单线——ArcGISpro 解决方法

路网双线合并成单线是一个在地图制作、交通规划以及GIS分析中常见的需求。双线路网定义&#xff1a;具有不同流向、不同平面结构的道路。此外&#xff0c;车道数较多的道路&#xff08;例如&#xff0c;双黄实线车道数大于4的道路&#xff09;也可以视为双线路网&#xff0c;本…

走,戴上你的旅行搭子去探险吧

如今快节奏的生活经常会让人感到疲惫和压力&#xff0c;炎炎夏日&#xff0c;一直想给自己松松绑&#xff01; 最近我和我的的小伙伴们去户外探险了&#xff0c;三五好友&#xff0c;组队出去玩&#xff0c;真的很让人放松&#xff01;一起去户外呼吸大自然的空气&#xff0c;…

【Hot100】LeetCode—155. 最小栈

目录 题目1- 思路2- 实现⭐155. 最小栈——题解思路 3- ACM 实现 题目 原题连接&#xff1a;155. 最小栈 1- 思路 思路 最小栈 ——> 借助两个栈来实现 2- 实现 ⭐155. 最小栈——题解思路 class MinStack {Stack<Integer> data;Stack<Integer> min;public …

VUE:跨域配置代理服务器

//在vite.config。js中&#xff0c;同插件配置同级进行配置server:{proxy:{"/myrequest":{//代理域名&#xff0c;可自行修改target:"https://m.wzj.com/",//访问服务器的目标域名changeOrigin:true,//允许跨域configure:(proxy,options) > {proxy.on(&…

图片常用的压缩方法,适用多种常用图片格式

jpg、png、jpeg、gif等图片格式是日常最常用的三种图片类型&#xff0c;一般在使用或者上传图片的时候这几种是比较常用的格式。在使用图片的时候&#xff0c;最常见的一个问题就是图片太大需要缩小后才可以正常使用&#xff0c;那么有什么方法或者工具能够快速处理不同图片格式…

在Mac上免费恢复已删除的PowerPoint文件

Microsoft PowerPoint for Mac 允许您在 macOS 环境中访问您熟悉的 PowerPoint 工具。该软件是Mac版Microsoft Office套件的一部分&#xff0c;具有各种稳定版本&#xff0c;即。PowerPoint 2019、2016、2011 等 PowerPoint for Mac 与 Apple 自己的演示应用程序 Keynote 兼容…

组网升级,双击热备和宽带管理

拓扑 要求&#xff1a; 要求12&#xff1a; 要求13&#xff1a; 要求14&#xff1a; 要求15&#xff1a; 要求16&#xff1a;

记录些MySQL题集(2)

MySQL 不使用limit的分页查询 limit问题&#xff1a;limit&#xff0c;offset递增问题。随着offset的增加&#xff0c;条数不变&#xff0c;耗时却增加了。 limit 0,10 耗时1ms limit 300000,10 耗时152ms limit 600000,10 耗时312ms 毫秒级别可能没感觉。假…

netdata 监控软件安装与学习

netdata官网 netdata操作文档 前言&#xff1a; netdata是一款监控软件&#xff0c;可以监控多台主机也可以监控单台主机&#xff0c;监控单台主机时&#xff0c;开箱即用&#xff0c;web ui很棒。 环境&#xff1a; [root192 ~]# cat /etc/system-release CentOS Linux rel…

工业大数据是什么?应用工业大数据时面临哪些挑战?

在当今快速发展的工业领域&#xff0c;大数据已成为推动企业转型升级的核心动力。工业大数据&#xff0c;以其独特的价值和潜力&#xff0c;正逐渐改变着传统的生产、管理和决策模式。然而&#xff0c;伴随着大数据的快速发展&#xff0c;一系列挑战也随之浮现。本文将深入探讨…

玻璃透过率太阳光辐射系统模拟器

太阳光模拟器概述 太阳光模拟器是一种先进的实验室设备&#xff0c;它能模拟太阳光的全光谱辐射&#xff0c;包括紫外线、可见光和红外线&#xff0c;用以评估材料、产品或设备在太阳辐射影响下的性能和耐久性。太阳光模拟器在多个领域有着广泛的应用&#xff0c;如光伏电池测…

【GD32】从零开始学GD32单片机 | WDGT看门狗定时器+独立看门狗和窗口看门狗例程(GD32F470ZGT6)

1. 简介 看门狗从本质上来说也是一个定时器&#xff0c;它是用来监测硬件或软件的故障的&#xff1b;它的工作原理大概就是开启后内部定时器会按照设置的频率更新&#xff0c;在程序运行过程中我们需不断地重装载看门狗&#xff0c;以使它不溢出&#xff1b;如果硬件或软件发生…