OpenLayers基础教程——WebGLPoints图层样式的设置方法

1、前言

前一篇博客介绍了如何在OpenLayers中使用WebGLPoints加载海量数据点的方法,这篇博客就来介绍一下WebGLPoints图层的样式设置问题。

2、样式运算符

VectorLayer图层中,我们只需要创建一个ol.style.Style对象即可,WebGLPoints则不同,它并不是基于Canvas进行绘制,因此其样式渲染不能直接使用ol.style.Style,取而代之的是使用样式表达式进行渲染。

2.1、读取运算符

1['get', 'attributeName']
2['var', 'varName']
3['time']
4['zoom']
5['resolution']

2.2、数学运算符

1['*', value1, value2]
2['/', value1, value2]
3['+', value1, value2]
4['-', value1, value2]
5['clamp', value, low, high]
6['%', value1, value2]
7['^', value1, value2]

2.3、变换运算符

1['case', condition1, output1, ...conditionN, outputN, fallback]
2['match', input, match1, output1, ...matchN, outputN, fallback]
3['interpolate', interpolation, input, stop1, output1, ...stopN, outputN]

2.4、逻辑运算符

1['<', value1, value2]
2['<=', value1, value2]
3['>', value1, value2]
4['>=', value1, value2]
5['==', value1, value2]
6['!=', value1, value2]
7['!', value1]
8['between', value1, value2, value3]

2.5、转换运算符

1['array', value1, ...valueN]
2['color', red, green, blue, alpha]

3、简单渲染

简单颜色渲染很简单,只需要使用['color', red, green, blue, alpha]即可,第一个参数为固定值‘color’,后面的参数依次为红、绿、蓝、透明度。下面的代码会将要素渲染为红色点:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>WebGL</title><style>html,body,#map {width: 100%;height: 100%;margin: 0;padding: 0;}</style><link rel="stylesheet" href="ol/ol.css" /><script src="ol/ol.js"></script>
</head>
<body><div id="map"></div><script>// 创建图层var layer = new ol.layer.WebGLPoints({source: new ol.source.Vector({features: [new ol.Feature({geometry: new ol.geom.Point([120.0, 30.0]),"type": "学校","dbm": 1}),new ol.Feature({geometry: new ol.geom.Point([120.0, 30.1]),"type": "学校","dbm": 2}),new ol.Feature({geometry: new ol.geom.Point([120.1, 30.0]),"type": "超市","dbm": 3}),new ol.Feature({geometry: new ol.geom.Point([120.1, 30.1]),"type": "超市","dbm": 4}),new ol.Feature({geometry: new ol.geom.Point([120.2, 30.0]),"type": "医院","dbm": 5}),new ol.Feature({geometry: new ol.geom.Point([120.2, 30.1]),"type": "医院","dbm": 6}),]}),style: {symbol: {symbolType: 'circle',size: 40,color: ['color', 255, 0, 0, 1]}}});// 创建地图var map = new ol.Map({target: 'map',layers: [layer],view: new ol.View({projection: 'EPSG:4326',center: [120, 30],zoom: 10})});</script>
</body>
</html>

运行结果如下图所示:

在这里插入图片描述

4、分类渲染

测试数据中的type字段将要素分成了3类,即:学校、超市、医院。现在要求将学校渲染为红色、超市渲染为绿色、医院渲染为蓝色。此时需要使用match表达式,其形式如下所示:

['match', type的值, '学校', 红色, '超市', 绿色, '医院', 蓝色, 默认颜色]

那么type的值又该如何获取?其实很简单,使用['get', 'attributeName']表达式即可,所以最后的样式表达式如下所示:

['match', ['get', 'type'], '学校', 红色, '超市', 绿色, '医院', 蓝色, 默认颜色]

代码如下所示:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>WebGL</title><style>html,body,#map {width: 100%;height: 100%;margin: 0;padding: 0;}</style><link rel="stylesheet" href="ol/ol.css" /><script src="ol/ol.js"></script>
</head>
<body><div id="map"></div><script>// 创建图层var layer = new ol.layer.WebGLPoints({source: new ol.source.Vector({features: [new ol.Feature({geometry: new ol.geom.Point([120.0, 30.0]),"type": "学校","dbm": 1}),new ol.Feature({geometry: new ol.geom.Point([120.0, 30.1]),"type": "学校","dbm": 2}),new ol.Feature({geometry: new ol.geom.Point([120.1, 30.0]),"type": "超市","dbm": 3}),new ol.Feature({geometry: new ol.geom.Point([120.1, 30.1]),"type": "超市","dbm": 4}),new ol.Feature({geometry: new ol.geom.Point([120.2, 30.0]),"type": "医院","dbm": 5}),new ol.Feature({geometry: new ol.geom.Point([120.2, 30.1]),"type": "医院","dbm": 6}),]}),style: {symbol: {symbolType: 'circle',size: 40,color: ['match',['get', 'type'], '学校', ['color', 255, 0, 0, 1],'超市', ['color', 0, 255, 0, 1],'医院', ['color', 0, 0, 255, 1],['color', 255, 0, 0, 1]]}}});// 创建地图var map = new ol.Map({target: 'map',layers: [layer],view: new ol.View({projection: 'EPSG:4326',center: [120, 30],zoom: 10})});</script>
</body>
</html>

运行结果如下图所示:

在这里插入图片描述

5、分级渲染

测试数据中包含一个dbm字段,现在根据dbm的范围进行分级渲染,规定如下:
1、dbm∈[1, 2],渲染为红色
2、dbm == 3,渲染为绿色
3、dbm == 4,渲染为蓝色
4、dbm∈[5, 6],渲染为黄色

此时需要使用case表达式,其形式如下所示:

['case', 'dbm∈[1,2]', 红色, 'dbm==3', 绿色, 'dbm==4', 蓝色, 'dbm∈[5,6]', 红色, 默认颜色]

在判断dbm的值的范围时,需要使用逻辑表达式:

['==', dbm, 3]
['==', dbm, 4]
['between', dbm, 1, 2]
['between', dbm, 5, 6]

最后,使用['get', 'attributeName']表达式获取字段值:

['get', 'dbm']

代码如下所示:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>WebGL</title><style>html,body,#map {width: 100%;height: 100%;margin: 0;padding: 0;}</style><link rel="stylesheet" href="ol/ol.css" /><script src="ol/ol.js"></script>
</head>
<body><div id="map"></div><script>// 创建图层var layer = new ol.layer.WebGLPoints({source: new ol.source.Vector({features: [new ol.Feature({geometry: new ol.geom.Point([120.0, 30.0]),"type": "学校","dbm": 1}),new ol.Feature({geometry: new ol.geom.Point([120.0, 30.1]),"type": "学校","dbm": 2}),new ol.Feature({geometry: new ol.geom.Point([120.1, 30.0]),"type": "超市","dbm": 3}),new ol.Feature({geometry: new ol.geom.Point([120.1, 30.1]),"type": "超市","dbm": 4}),new ol.Feature({geometry: new ol.geom.Point([120.2, 30.0]),"type": "医院","dbm": 5}),new ol.Feature({geometry: new ol.geom.Point([120.2, 30.1]),"type": "医院","dbm": 6}),]}),style: {symbol: {symbolType: 'circle',size: 40,color: ['case',['between', ['get', 'dbm'], 1, 2], ['color', 255, 0, 0, 1],['==', ['get', 'dbm'], 3], ['color', 0, 255, 0, 1],['==', ['get', 'dbm'], 4], ['color', 0, 0, 255, 1],['between', ['get', 'dbm'], 5, 6], ['color', 255, 255, 0, 1],['color', 255, 0, 0, 1]]}}});// 创建地图var map = new ol.Map({target: 'map',layers: [layer],view: new ol.View({projection: 'EPSG:4326',center: [120, 30],zoom: 10})});</script>
</body>
</html>

运行结果如下图所示:

在这里插入图片描述

6、根据地图缩放等级渲染

现做如下规定:
1、地图缩放等级zoom∈(0, 10],渲染为红色
2、地图缩放等级zoom∈(10, 12],渲染为绿色
3、地图缩放等级zoom∈(12, 14],渲染为蓝色
4、其余缩放等级,渲染为黄色

看了上面的例子之后,相信同志们应该想到了:利用['zoom']获取地图缩放等级,然后利用case表达式进行情况分类,最后每种情况利用逻辑表达式判断即可。代码如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>WebGL</title><style>html,body,#map {width: 100%;height: 100%;margin: 0;padding: 0;}</style><link rel="stylesheet" href="ol/ol.css" /><script src="ol/ol.js"></script>
</head>
<body><div id="map"></div><script>// 创建图层var layer = new ol.layer.WebGLPoints({source: new ol.source.Vector({features: [new ol.Feature({geometry: new ol.geom.Point([120.0, 30.0]),"type": "学校","dbm": 1}),new ol.Feature({geometry: new ol.geom.Point([120.0, 30.1]),"type": "学校","dbm": 2}),new ol.Feature({geometry: new ol.geom.Point([120.1, 30.0]),"type": "超市","dbm": 3}),new ol.Feature({geometry: new ol.geom.Point([120.1, 30.1]),"type": "超市","dbm": 4}),new ol.Feature({geometry: new ol.geom.Point([120.2, 30.0]),"type": "医院","dbm": 5}),new ol.Feature({geometry: new ol.geom.Point([120.2, 30.1]),"type": "医院","dbm": 6}),]}),style: {symbol: {symbolType: 'circle',size: 40,color: ['case',['<=', ['zoom'], 10], ['color', 255, 0, 0, 1],['<=', ['zoom'], 12], ['color', 0, 255, 0, 1],['<=', ['zoom'], 14], ['color', 0, 0, 255, 1],['color', 255, 255, 0, 1]]}}});// 创建地图var map = new ol.Map({target: 'map',layers: [layer],view: new ol.View({projection: 'EPSG:4326',center: [120, 30],zoom: 10})});</script>
</body>
</html>

运行结果如下图所示:

在这里插入图片描述

7、根据地图分辨率渲染

根据地图分辨率渲染也很简单,只需要把上面的['zoom']替换成['resolution']即可。不过考虑到resolution值是一个小数,因此这里将resolution乘以10000之后再进行判断,代码如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>WebGL</title><style>html,body,#map {width: 100%;height: 100%;margin: 0;padding: 0;}</style><link rel="stylesheet" href="ol/ol.css" /><script src="ol/ol.js"></script>
</head>
<body><div id="map"></div><script>// 创建图层var layer = new ol.layer.WebGLPoints({source: new ol.source.Vector({features: [new ol.Feature({geometry: new ol.geom.Point([120.0, 30.0]),"type": "学校","dbm": 1}),new ol.Feature({geometry: new ol.geom.Point([120.0, 30.1]),"type": "学校","dbm": 2}),new ol.Feature({geometry: new ol.geom.Point([120.1, 30.0]),"type": "超市","dbm": 3}),new ol.Feature({geometry: new ol.geom.Point([120.1, 30.1]),"type": "超市","dbm": 4}),new ol.Feature({geometry: new ol.geom.Point([120.2, 30.0]),"type": "医院","dbm": 5}),new ol.Feature({geometry: new ol.geom.Point([120.2, 30.1]),"type": "医院","dbm": 6}),]}),style: {symbol: {symbolType: 'circle',size: 40,color: ['case',['<=', ['*', ['resolution'], 10000], 2], ['color', 255, 0, 0, 1],['<=', ['*', ['resolution'], 10000], 3], ['color', 0, 255, 0, 1],['<=', ['*', ['resolution'], 10000], 4], ['color', 0, 0, 255, 1],['<=', ['*', ['resolution'], 10000], 5], ['color', 255, 255, 0, 1],['<=', ['*', ['resolution'], 10000], 6], ['color', 255, 0, 255, 1],['<=', ['*', ['resolution'], 10000], 7], ['color', 0, 255, 255, 1],['color', 300, 200, 100, 1]]}}});// 创建地图var map = new ol.Map({target: 'map',layers: [layer],view: new ol.View({projection: 'EPSG:4326',center: [120, 30],zoom: 10})});</script>
</body>
</html>

运行结果如下图所示:

在这里插入图片描述

8、设置要素的形状和透明度

symbol对象中,symbolType参数用于定义要素的形状,它可以设置为circle、triangle、square、image。例如将symbolType设置为triangle

symbol: {symbolType: 'circle',size: 40,color: ['color', 255, 0, 0, 1]
}

此时要素会被渲染为三角形,如下图所示:

在这里插入图片描述
symbolType设置为square

symbol: {symbolType: 'square',size: 40,color: ['color', 255, 0, 0, 1]
}

此时要素会被渲染为正方形,如下图所示:

在这里插入图片描述
如果希望设置透明度,只需要添加opacity属性即可,例如将透明度设置为0.3

symbol: {symbolType: 'circle',size: 40,color: ['color', 255, 0, 0, 1],opacity: 0.3
}

如下图所示:

在这里插入图片描述

9、设置要素的尺寸

上面的代码主要针对color属性进行设置,其实不仅仅是colorsize属性同样可以使用样式表达式。现在根据dbm值生成不同大小的要素,代码如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>WebGL</title><style>html,body,#map {width: 100%;height: 100%;margin: 0;padding: 0;}</style><link rel="stylesheet" href="ol/ol.css" /><script src="ol/ol.js"></script>
</head>
<body><div id="map"></div><script>// 创建图层var layer = new ol.layer.WebGLPoints({source: new ol.source.Vector({features: [new ol.Feature({geometry: new ol.geom.Point([120.0, 30.0]),"type": "学校","dbm": 1}),new ol.Feature({geometry: new ol.geom.Point([120.0, 30.1]),"type": "学校","dbm": 2}),new ol.Feature({geometry: new ol.geom.Point([120.1, 30.0]),"type": "超市","dbm": 3}),new ol.Feature({geometry: new ol.geom.Point([120.1, 30.1]),"type": "超市","dbm": 4}),new ol.Feature({geometry: new ol.geom.Point([120.2, 30.0]),"type": "医院","dbm": 5}),new ol.Feature({geometry: new ol.geom.Point([120.2, 30.1]),"type": "医院","dbm": 6}),]}),style: {symbol: {symbolType: 'circle',size: ['case',['==', ['get', 'dbm'], 1], 10,['==', ['get', 'dbm'], 2], 20,['==', ['get', 'dbm'], 3], 30,['==', ['get', 'dbm'], 4], 40,['==', ['get', 'dbm'], 5], 50,['==', ['get', 'dbm'], 6], 60,20],color: ['color', 255, 0, 0, 1],}}});// 创建地图var map = new ol.Map({target: 'map',layers: [layer],view: new ol.View({projection: 'EPSG:4326',center: [120, 30],zoom: 10})});</script>
</body>
</html>

运行结果如下图所示:

在这里插入图片描述

10、结语

本文主要介绍了OpenLayersWebGLPoints图层的样式设置方法。其实刚接触样式表达式的时候觉得这种方法很反人类,但是习惯之后发现它的灵活度很高,本文也只列举了一些常见的用法,有兴趣的同志可以去官网查看更详细的文档。

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

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

相关文章

浅谈Webmail邮件还原

Webmail还原&#xff0c;其实也就是HTTP协议的还原&#xff0c;而HTTP协议的还原&#xff0c;核心部分是TCP会话的重组。在TCP会话进行重组之后&#xff0c;再对重组的报文进行HTTP解析&#xff0c;得到Webmail中相应的信息。 由于每个邮件服务商实现Webmail的方式都各不相同&a…

LabVIEW智能降噪系统

LabVIEW智能降噪系统 随着噪声污染问题的日益严重&#xff0c;寻找有效的降噪技术变得尤为关键。介绍了一种基于LabVIEW平台开发的智能降噪系统&#xff0c;该系统能够实时采集环境噪声&#xff0c;并通过先进的信号处理技术实现主动降噪&#xff0c;从而有效改善生活和工作环…

CV论文--2024.3.26

1、DiffusionMTL: Learning Multi-Task Denoising Diffusion Model from Partially Annotated Data 中文标题&#xff1a;DiffusionMTL&#xff1a;从部分注释的数据中学习多任务去噪扩散模型 简介&#xff1a;最近&#xff0c;人们对于从部分标注数据中学习多个密集场景理解任…

qt table 简易封装,样式美化,以及 合并表格和颜色的区分 已解决

在需求中&#xff0c; 难免会使用 table 进行渲染窗口&#xff0c;做一个简单的封装。美化表格最终效果&#xff01;&#xff01;&#xff01; 代码部分 // 显示 20行 20列CCendDetailsInfoTableWidget* table new CCendDetailsInfoTableWidget(20,10);for (int i 0; i < …

【AIGC调研系列】DeepSeek模型的优势和劣势

DeepSeek模型的优势主要包括&#xff1a; 多模态能力&#xff1a;DeepSeek-VL能够在不丢失语言能力的情况下融入多模态能力&#xff0c;能够处理包括逻辑图、网页、公式识别、科学文献、自然图像等多种类型的数据&#xff0c;显示出其强大的通用多模式理解能力[1]。高分辨率图…

实现浏览器复制文本原始样式到wps或office

一、概述 本需求是笔者在协助公司前端工程师的一个需求完成的&#xff0c;需求是在Web页面中复制带有样式的文本并期望在WPS或其他富文本编辑器中保持样式&#xff0c;通常需要使用HTML格式进行复制。大多数现代富文本编辑器&#xff0c;包括WPS&#xff0c;都支持从HTML格式的…

蓝桥杯2023年第十四届省赛真题-买瓜|DFS+剪枝

题目链接&#xff1a; 0买瓜 - 蓝桥云课 (lanqiao.cn) 蓝桥杯2023年第十四届省赛真题-买瓜 - C语言网 (dotcpp.com) &#xff08;蓝桥官网的数据要求会高一些&#xff09; 说明&#xff1a; 这道题可以分析出&#xff1a;对一个瓜有三种选择&#xff1a; 不拿&#xff0c…

Hbase解决ERROR: KeeperErrorCode = ConnectionLoss for /hbase/master报错

在使用hbase时出错&#xff0c;错误如下图&#xff1a; 错误原因&#xff1a; 返回去检查启动的Hadoop与zookeeper&#xff0c;发现zookeeper的状态不对&#xff0c;重新启动了一下zookeeper&#xff0c;确保所有机器的zookeeper都启动起来了就可以了。

微服务(基础篇-004-Feign)

目录 http客户端Feign Feign替代RestTemplate&#xff08;1&#xff09; Feign的介绍&#xff08;1.1&#xff09; 使用Feign的步骤&#xff08;1.2&#xff09; 自定义配置&#xff08;2&#xff09; 配置Feign日志的两种方式&#xff08;2.1&#xff09; Feign使用优化…

【C++】哈希应用之位图

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.位图的概念 2.位…

解决“Pycharm中Matplotlib图像不弹出独立的显示窗口”问题

matplotlib的绘图的结果默认显示在SciView窗口中, 而不是弹出独立的窗口, 这样看起来就不是很舒服&#xff0c;不习惯。 通过修改设置&#xff0c;改成独立弹出的窗口。 File—>Settings—>Tools—>Python Scientific—>Show plots in toolwindow 将√去掉即可

初识C++(三)构造函数和析构函数

目录 一、构造函数&#xff1a; 1.构造函数的概念&#xff1a; 2.构造函数的特性&#xff1a; 3.构造函数的形式&#xff1a; 4.为什么要引出构造函数这一概念 5.默认构造函数包括&#xff1a; 6.对默认生成的构造函数不处理内置类型的成员这事的解决办法&#xff1a; …

【Python机器学习系列】skearn机器学习模型的保存---pickle法

这是我的第246篇原创文章。 一、引言 pickle是Python 的标准库&#xff0c;用于序列化对象。可以使用 pickle.dump()将模型保存到文件&#xff0c;然后使用 pickle.load()从文件中加载模型。 序列化&#xff1a;指将一个对象转换为字节流&#xff0c;能够存储在文件或网络上&…

HTML快速入门笔记

一、HTML快速入门 说明&#xff1a;所有加*号内容代表不常用&#xff0c;了解即可。 HTML概述 超文本&#xff1a;Web是一个超文本的集合&#xff1b;超文本是web的基本组成单元&#xff0c;也成为网页或HTML文档&#xff0c;Web页等&#xff0c;通常以.html或.htm为后缀的文件…

Apache SeaTunnel 初识

文章目录 Apache SeaTunnel 初识为什么我们需要SeaTunnel使用场景特点解决的问题工作流连接器输入插件过滤插件输出插件引擎spark 和 flink 引擎SeaTunnel 引擎集群管理核心功能Apach

力扣1----10(更新)

1. 两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按…

计算机网络:现代通信的基石

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

「Linux系列」Linux网络通讯/系统管理/系统设置/备份压缩/设备管理命令

文章目录 一、Linux网络通讯命令二、Linux系统管理命令三、Linux系统设置命令四、Linux备份压缩命令五、Linux设备管理命令六、相关链接 一、Linux网络通讯命令 Linux网络通讯命令是Linux系统中用于管理和调试网络功能的一系列工具。这些命令可以帮助用户查看网络状态、测试网…

SNMP学习笔记SNMPWALK命令

SNMPWALK是SNMP的一个工具&#xff0c;它使用SNMP的GETNEXT请求查询指定OID入口的所有OID树信息&#xff0c;并显示给用户。 IT监控系统常用snmpwalk获取支持SNMP的网络设备信息&#xff0c;使用snmpwalk收集交换机、路由器的CPU、内存、端口流量等信息。 使用snmpwalk需要安装…

Matlab实现序贯变分模态分解(SVMD)

大家好&#xff0c;我是带我去滑雪&#xff01; 序贯变分模态分解(SVMD) 是一种信号处理和数据分析方法。它可以将复杂信号分解为一系列模态函数&#xff0c;每个模态函数代表信号中的特定频率分量。 SVMD 的主要目标是提取信号中的不同频率分量并将其重构为原始信号。SVMD的基…