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.hqwc.cn/news/568585.html

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

相关文章

【第三方登录】Google邮箱

登录谷歌邮箱开发者 https://console.developers.google.com/ 先创建项目 我们用的web应用 设置回调 核心主要&#xff1a; 1.创建应用 2.创建客户端ID 3.设置域名和重定向URL 4.对外公开&#xff0c;这样所有的gmail邮箱 都能参与测试PHP代码实现 引入第三方包 h…

软件著作权有哪些作用 好处

随着信息技术的迅猛发展&#xff0c;软件产业已成为全球经济增长的重要引擎。在这个背景下&#xff0c;软件著作权的重要性日益凸显。软件著作权&#xff0c;是指软件的开发者或者其他权利人依据有关著作权法律的规定&#xff0c;对于软件作品所享有的各项专有权利。那么&#…

【应用笔记】LAT1305+使用STM32+TT类型IO的注意事项

1. 概述 在 STM32 系列 MCU 中&#xff0c; 除了一些特殊管脚外&#xff0c;绝大多数管脚都可以分类为 FT (兼容5V 信号)或 TT&#xff08;兼容 3V3 信号&#xff09;类型的 IO&#xff0c;由于 MCU 内部设计的不同&#xff0c; TT IO 相比 5V IO 有更多的限制&#xff0c;下面…

Fiddler关闭后打不开网页

打开网络找到代理 把代理给关闭就可以了

面试算法-103-对链表进行插入排序

题目 给定单个链表的头 head &#xff0c;使用 插入排序 对链表进行排序&#xff0c;并返回 排序后链表的头 。 插入排序 算法的步骤: 插入排序是迭代的&#xff0c;每次只移动一个元素&#xff0c;直到所有元素可以形成一个有序的输出列表。 每次迭代中&#xff0c;插入排序…

【 Vue 3 】Vue3.0所采用的CompositionApi与Vue2.x使用的Options Api 有什么不同?

1. 开始之前 Composition API可以说是Vue3的最大特点&#xff0c;那么为什么要推出Composition Api,解决了什么问题? 通常使用Vue2开发的项目&#xff0c;普遍会存在以下问题&#xff1a; 代码的可读性随着组件变大而变差每一种代码复用的方式&#xff0c;都存在缺点TypeScr…

什么是正向代理和反向代理?

从字面意思上看&#xff0c;代理就是代替处理的意思&#xff0c;一个对象有能力代替另一个对象处理某一件事。 代理&#xff0c;这个词在我们的日常生活中也不陌生&#xff0c;比如在购物、旅游等场景中&#xff0c;我们经常会委托别人代替我们完成某些任务。在技术领域&#…

工业级POE交换机的SSH配置步骤

工业级POE交换机的SSH&#xff08;Secure Shell&#xff09;配置可以通过以下步骤进行&#xff1a; 1. 连接到POE交换机&#xff1a;使用一个支持SSH协议的终端工具&#xff08;如PuTTY&#xff09;连接到POE交换机的管理接口。 2. 登录到POE交换机&#xff1a;输入正确的用户…

nuxt3使用自定义组件

说明&#xff1a;nuxt3只有components文件夹里面的页面会自动注册为组件&#xff0c;但是有些单独的页面也需要组件&#xff0c;但是也不是全局的&#xff0c;所以写在pages里面的页面&#xff0c;需要手动注册为组件使用 1.创建组件 在pages里面创建页面文件夹&#xff0c;在…

CQBF氟塑料磁力泵

引言&#xff1a; 在当今的工业制造和化学处理领域&#xff0c;对高效率、耐用性和安全性的需求日益增长。CQBF氟塑料磁力泵作为这一需求下的创新产品&#xff0c;已经成为许多企业提升工艺水平和确保环境安全的关键工具。本文旨在深入探讨CQBF氟塑料磁力泵的技术特点、应用优势…

qt5-入门-ModelView架构1

参考&#xff1a; Qt model-view 架构_w3cschool https://www.w3cschool.cn/learnroadqt/vtxz1j4y.html QListWidget_w3cschool https://www.w3cschool.cn/learnroadqt/yb2k1j51.html C GUI Programming with Qt 4, Second Edition 本地环境&#xff1a; win10专业版&#x…

SqlServer期末复习(数据库原理及应用)持续更新中

一、SQL语句 1.1 SQL语句知识引入 1.DDL语言(数据定义语言&#xff09;主要是进行定义/改变表的结构、数据类型、表之间的链接等操作&#xff0c;关键字CREATE、DROP、ALTER CREATE TABLE 表面( 列名1 数据类型&#xff0c; 列名2 数据类型&#xff0c; ) ALTER TABLE 表名&a…