openlayers中区域掩膜的实现

news2025/1/19 2:58:20

概述

在前文完成了mapboxGL中区域掩膜的实现。近日有人问到说在openlayers中如何实现,本文就带大家看看如何在openlayers中实现区域掩膜。

实现效果

map1.gif

实现

1. 实现思路

  1. 在地图容器中添加一个canvas,设置其在map之上;
  2. 监听map的postrender事件,每次事件触发重新绘制掩膜;
  3. 通过map.getPixelFromCoordinate实现地理坐标到屏幕坐标的转换;
  4. 通过globalCompositeOperation = 'source-out’设置反向裁剪;

2. 实现代码

1. 添加canvas

const { offsetWidth, offsetHeight } = map.getViewport()
canvas = document.createElement('canvas');
canvas.width = offsetWidth;
canvas.height = offsetHeight;
canvas.style.position = 'absolute';
canvas.style.top = '0px';
canvas.style.left = '0px';
canvas.style.zIndex = '1';
ctx = canvas.getContext('2d');
map.getViewport().appendChild(canvas);

2. 注册map事件

map.on('postrender', e => {
  addMapModal()
})

3. 事件实现

function addMapModal(params) {
const { fillStyle, strokeStyle, lineWidth } = {
  fillStyle: 'rgba(255,255,255,0.8)',
  strokeStyle: '#f00',
  lineWidth: 3,
  ...params
}
ctx.fillStyle = fillStyle;
ctx.strokeStyle = strokeStyle;
ctx.lineWidth = lineWidth;
ctx.clearRect(0, 0, canvas.width, canvas.height)
const coords = modalData.map(coord => {
  return map.getPixelFromCoordinate(ol.proj.fromLonLat(coord))
})

ctx.beginPath();
coords.forEach((coord, index) => {
  index === 0 ? ctx.moveTo(coord[0], coord[1]) : ctx.lineTo(coord[0], coord[1])
})
ctx.closePath();
ctx.fill();

ctx.globalCompositeOperation = 'source-out';
ctx.rect(0, 0, canvas.width, canvas.height)
ctx.fill();
ctx.globalCompositeOperation = 'source-over';
ctx.beginPath();
coords.forEach((coord, index) => {
  index === 0 ? ctx.moveTo(coord[0], coord[1]) : ctx.lineTo(coord[0], coord[1])
})
ctx.closePath();
ctx.stroke()
}

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

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

相关文章

1-认识网络爬虫

1.什么是网络爬虫 ​ 网络爬虫(Web Crawler)又称网络蜘蛛、网络机器人,它是一种按照一定规则,自动浏览万维网的程序或脚本。通俗地讲,网络爬虫就是一个模拟真人浏览万维网行为的程序,这个程序可以代替真人…

在虚拟仿真中学习人工智能,可以达到什么目标?

人工智能已经成为引领社会创新的关键力量,想要在这个充满机遇的领域中脱颖而出,掌握扎实的专业技能和积累丰富的实践经验至关重要。然而,许多学习者在追求这一目标的过程中面临着几个主要问题:专业技术掌握有难度、实践经验积累存…

【算法训练记录——Day41】

Day41——动态规划Ⅲ 1.理论基础——代码随想录2.纯01背包_[kamacoder46](https://kamacoder.com/problempage.php?pid1046)3.leetcode_416分割等和子集 背包!! 1.理论基础——代码随想录 主要掌握01背包和完全背包 物品数量: 只有一个 ——…

(十三)MipMap

MipMap概念 滤波 采样 mipmap级别判定 问题:opengl如何判定应该使用下一级的mipmap呢? 通过glsl中的求偏导函数计算变化量决定 手动实现mipmap原理 1、生成mipmap的各个级别 2、修改vertexShader使得三角形随着时间变小 **** 需要更改Filter才能…

如何在操作使用ufw设置防火墙

UFW(简单防火墙)是用于管理iptables防火墙规则的用户友好型前端。它的主要目标是使iptables的管理更容易。 在学习Linux的时候大家一般都会关心命令,Posix API和桌面等,很少会去了解防护墙。其实除了一些网络安全厂商提供的付费防…

Zabbix 配置MySQL数据库监控

Zabbix MySQL数据库监控简介 通过 Zabbix 监控 MySQL 数据库,可以获取有关数据库性能、运行状况和资源使用情况的详细信息,帮助及时发现和解决问题。 Zabbix官方提供了一个名为MySQL by Zabbix agent的监控模板,该模板专为 Zabbix 通过 Zabb…

波动方程 - 在三维图中动态显示二维波动方程的解就像水面波澜起伏

波动方程 - 在三维图中动态显示二维波动方程的解就像水面波澜起伏 flyfish 波动方程的求解结果通常不是一个单一的数值,而是一个函数或一组函数,这些函数描述了波随时间和空间的传播情况。具体来说,波动方程的解可以是关于时间和空间变量的…

技术驱动旅游创新!深度解析景区导览小程序的地图渲染与AR导航技术

随着现代生活节奏的加快,人们在外出旅游时更倾向于轻便出行,携带导览地图已成为过去。然而,面对景区广阔的面积和众多景点,游客常常感到迷茫,难以快速定位到自己所需的地点。景区导览小程序让游客只需搜索景区名称&…

PyQT: 开发一款ROI绘制小程序

在一些基于图像或者视频流的应用中,比如电子围栏/客流统计等,我们需要手动绘制一些感兴趣(Region of Interest,简称ROI)区域。 在这里,我们基于Python和PyQt5框架开发了一款桌面应用程序,允许用…

谷粒商城学习笔记-05-项目微服务划分图

文章目录 一,商城业务服务-前端服务二,商城业务服务-后端服务三,存储服务四,第三方服务五,服务治理六,日志七,监控预警系统1,Prometheus2,Grafana3,Prometheu…

TSINGSEE智能分析网关V4人员区域徘徊AI检测:算法原理介绍及技术应用场景

一、引言 在现代社会,随着科技的不断发展,视频监控系统已广泛应用于各个领域,如公共安全、商业管理、交通监控等。其中,区域徘徊检测算法作为一种重要的视频分析技术,能够有效地识别出特定区域内人员的徘徊行为&#…

LLMs之gpt_academic:gpt_academic的简介、安装和使用方法、案例应用之详细攻略

LLMs之gpt_academic:gpt_academic的简介、安装和使用方法、案例应用之详细攻略 目录 gpt_academic的简介 1、版本更新历史 版本: 1、新增功能及其描述 新界面(修改config.py中的LAYOUT选项即可实现“左右布局”和“上下布局”的切换) 所…

SpringBoot开发细节

1.✨前后端时间不一致 解决方法1:在实体类属性上添加 JsonFormat(pattern "yyyy-MM-dd HH:mm:ss", timezone "GMT8")解决方法2:springboot配置文件中 spring:jackson:date-format: yyyy-MM-dd HH:mm:sstime-zone: GMT82.定义返回…

电商数据仓库

1.数据仓库的数据来源为业务数据库(mysql) 2.通过sqoop将mysql中的业务数据导入到大数据平台(hive) 3.通过hive进行数据计算和数据分析 形成数据报表 4.再通过sqoop将数据报表导出到mysql 5.使用FineReport制作数据报表 1.数据…

开始尝试从0写一个项目--后端(一)

创建文件的目录结构 利用这个界面创建 序号 名称 说明 1 SEMS maven父工程,统一管理依赖版本,聚合其他子模块 2 sems-common 子模块,存放公共类,例如:工具类、常量类、异常类等 3 sems-pojo 子模块&#x…

前端Debugger时复制的JS对象字符转JSON对象

前端debugger时,复制的对象在控制台输出时是如下格式,需要转换为对象格式来进行验证操作 bridgeId : 4118 createBy : null createTime : "2023-03-24 10:35:26" createUserId : 1 具体实现代码: // 转换transform (text) {l…

数据库表导出到excel:前置知识3 项目封装的Quartz实现动态定时任务

参考网址 目标:定时任务持久化到数据库,动态调整数据库里保存的cron表达式使定时任务可以跟随变化。 从SYS_QUARTZ_JOB表(通过反射创建任务)和SYS_QUARTZ_LOG表(主要就是记录日志)构建两个对应的实体类:QuartzJob和QuartzLog 1.看表结构 …

云计算【第一阶段(26)】Linux网络设置

一、查看网络配置 1.查看网络接口信息ifconfig 查看所有活动的网络接口信息 2.ifconfig命令 查看指定网络接口信息 ifconfig 网络接口 (1)第一行:以太网卡的名字 ens33其中en代表以太网卡, centos6的是eth0, e…

什么是数字体验成熟度,以及数字成熟度的模型计算和实现方法

“开发成功的全渠道数字身份,并通过无缝的数字体验吸引广泛的受众。无论您身在何处,都可以加速数字化转型并促进业务增长。通过直观、全面的工具,并了解您个人的数字体验成熟度水平,超越不断增长的客户期望并超越竞争对手。今天就…

第二十条:与抽象类相比,优先选择接口

要定义多种实现的类型:JAVA有两种机制:接口和抽象类。这两种机制都支持为某些实例方法提供实现,但二者有个重要的区别:要实现由抽象类定义的类型,这个类必须是抽象类的子类。因为Java只允许单继承,对抽象类…