OpenLayers 综合案例-区域掩膜

看过的知识不等于学会。唯有用心总结、系统记录,并通过温故知新反复实践,才能真正掌握一二
作为一名摸爬滚打三年的前端开发,开源社区给了我饭碗,我也将所学的知识体系回馈给大家,助你少走弯路!
OpenLayers、Leaflet 快速入门 ,每周保持更新 2 个案例
Cesium 快速入门,每周保持更新 4 个案例

OpenLayers 综合案例-区域掩膜

Vue 3 + OpenLayers 实现的 WebGIS 应用提供了完整的区域掩膜功能

实现思路

  1. 主要就是考验 canvas 的使用,核心代码参考openlayers 中区域掩膜的实现
  2. 在地图容器中添加一个 canvas,设置其在 map 之上;
  3. 监听 map 的 postrender 事件,每次事件触发重新绘制掩膜;
  4. 通过 map.getPixelFromCoordinate 实现地理坐标到屏幕坐标的转换;
  5. 通过 globalCompositeOperation = 'source-out’设置反向裁剪;

在这里插入图片描述

MP4效果动画链接地址&JSON数据获取地址

技术栈

该环境下代码即拿即用

Vue 3.5.13+
OpenLayers 10.5.0+
Vite 6.3.5+
<template><div ref="mapContainer" id="map"></div>
</template><script setup>
import { ref, onMounted } from "vue";
import Map from "ol/Map.js";
import XYZ from "ol/source/XYZ.js";
import TileLayer from "ol/layer/Tile.js";
import View from "ol/View.js";
import "ol/ol.css";
import modalData from "./320000_bj.json";const mapContainer = ref(null);
let map = null;
let canvas = null;
let ctx = null;const view = new View({center: [118.7784, 32.0647], // 南京市中心经纬度zoom: 7,projection: "EPSG:4326",
});onMounted(async () => {map = new Map({target: mapContainer.value,layers: [new TileLayer({source: new XYZ({url: "https://webrd04.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={x}&y={y}&z={z}",}),}),],view,});// 创建canvasconst { 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);// 注册map事件map.on("postrender", () => {addMask();});
});// 添加区域掩膜
const addMask = (params) => {const { fillStyle, strokeStyle, lineWidth } = {fillStyle: "rgba(255,255,255,0.8)",strokeStyle: "#f00",lineWidth: 3,...params,};ctx.clearRect(0, 0, canvas.width, canvas.height);// 获取整个江苏省的所有多边形const jiangsuPolygons = modalData.features[0].geometry.coordinates;// 1. 绘制整个画布为半透明白色ctx.fillStyle = fillStyle;ctx.fillRect(0, 0, canvas.width, canvas.height);// 2. 使用组合模式清除多边形区域ctx.globalCompositeOperation = "destination-out";ctx.fillStyle = "rgba(0,0,0,1)"; // 使用任意颜色,alpha=1确保完全清除// 绘制所有多边形(包括主区域和岛屿)jiangsuPolygons.forEach((polygon) => {const ring = polygon[0]; // 获取多边形外环const coords = ring.map((coord) => map.getPixelFromCoordinate(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();});// 3. 恢复组合模式并绘制边界ctx.globalCompositeOperation = "source-over";ctx.strokeStyle = strokeStyle;ctx.lineWidth = lineWidth;// 绘制所有多边形的边界jiangsuPolygons.forEach((polygon) => {const ring = polygon[0];const coords = ring.map((coord) => map.getPixelFromCoordinate(coord));ctx.beginPath();coords.forEach((coord, index) => {index === 0? ctx.moveTo(coord[0], coord[1]): ctx.lineTo(coord[0], coord[1]);});ctx.closePath();ctx.stroke();});
};
</script><style scoped>
#map {position: absolute;top: 0;bottom: 0;width: 100vw;height: 100vh;
}
</style>

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

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

相关文章

30天打牢数模基础-神经网络基础讲解

一、代码说明本代码基于模拟房价数据集&#xff0c;使用scikit-learn库中的MLPRegressor&#xff08;多层感知器回归&#xff09;实现神经网络模型&#xff0c;解决房价预测问题。代码逻辑清晰&#xff0c;适合数模小白入门&#xff0c;包含数据预处理、模型构建、训练评估、新…

Linux应用开发基础知识——LInux学习FreeType编程(七)

目录 一、使用freetype 显示一个文字 二、使用 freetype 显示一行文字 1. 了解笛卡尔坐标系 2. 每个字符的大小可能不同 3. 怎么在指定位置显示一行文字 4. freetype 的几个重要数据结构 4.1、FT_Library结构体 4.2、FT_Face结构体 4.3、FT_GlyphSlot结构体 4.4、FT_G…

Kotlin中Flow

Kotlin Flow 深度解析&#xff1a;从原理到实战一、Flow 核心概念体系1. Flow 的本质与架构Flow 是 Kotlin 协程库中的异步数据流处理框架&#xff0c;核心特点&#xff1a;响应式编程&#xff1a;基于观察者模式的数据处理协程集成&#xff1a;无缝融入 Kotlin 协程生态背压支…

Java程序员学从0学AI(七)

一、前言 上一篇文章围绕 Spring AI 的 Chat Memory&#xff08;聊天记忆&#xff09;功能展开&#xff0c;先是通过代码演示了不使用 Chat Memory 时&#xff0c;大模型因无状态无法记住上下文&#xff08;如用户姓名&#xff09;的情况&#xff0c;随后展示了使用基于内存的 …

ESP32S3 防猫逃脱监测系统

在办公室里&#xff0c;两只可爱的猫咪给大家带来了不少欢乐&#xff0c;但其中一只总爱趁人不注意溜出房间&#xff0c;有时下班后还会被邻居告知它被锁在了外面。为了解决这个问题&#xff0c;我开发了一个基于 SeeedStudio XIAO ESP32S3 Sense 的猫咪逃脱监测预警系统&#…

Python|OpenCV-实现快速处理图像的方法(23)

前言 本文是该专栏的第25篇,后面将持续分享OpenCV计算机视觉的干货知识,记得关注。 在视觉算法落地流程中,数据预处理往往占用 60 % 以上的工程时间。以某沿海城市智慧旅游项目为例,我们从无人机录制的 4K 海滩视频中抽帧得到 10 000 张 PNG 原图,分辨率 38402160,单张体…

Redis四种GetShell方式完整教程

Redis作为高性能内存数据库&#xff0c;若未正确配置认证和访问控制&#xff0c;可能被攻击者利用实现远程代码执行&#xff08;GetShell&#xff09;。本文详细讲解四种常见的Redis GetShell方式&#xff0c;涵盖原理、操作步骤及防御建议。方式一&#xff1a;直接写入Shell脚…

clock_nanosleep系统调用及示例

41. clock_nanosleep - 高精度睡眠 函数介绍 clock_nanosleep系统调用提供纳秒级精度的睡眠功能&#xff0c;支持绝对时间和相对时间两种模式&#xff0c;比传统的nanosleep更加灵活。 函数原型 #include <time.h>int clock_nanosleep(clockid_t clock_id, int flags,con…

用了Flutter包体积增大就弃用Flutter吗?包体积与开发效率,这两者之间如何权衡?

是否因包体积增大而弃用 Flutter&#xff0c;本质上是 “短期成本&#xff08;包体积&#xff09;” 与 “长期价值&#xff08;跨平台效率、体验一致性等&#xff09;” 的权衡 。这一决策没有绝对答案&#xff0c;需结合项目阶段、用户群体、业务需求等具体场景分析。以下从核…

80道面试经典题目

1.OSI参考模型七层网络协议? 物理层:定义计算机、网络设备、以及直接连接的介质、接口类型的标准,建立比特流的传输,用来组件物理网络的连接。 数据链路层:建立逻辑连接、进行硬件地址寻址,差错校验、差错恢复等功能。 网络层:进行逻辑地址寻址,实现不同网络之间的通…

本周大模型新动向:KV缓存压缩、低成本高性能推理框架、多智能体协作

点击蓝字关注我们AI TIME欢迎每一位AI爱好者的加入&#xff01;01Compress Any Segment Anything Model (SAM)受SAM在零样本分割任务上卓越表现的驱动&#xff0c;其各类变体已被广泛应用于医疗、智能制造等场景。然而&#xff0c;SAM系列模型体量巨大&#xff0c;严重限制了在…

利用frp实现内网穿透功能(服务器)Linux、(内网)Windows

适用于&#xff1a; 本地电脑&#xff08;windows&#xff09;或者Linux(本篇未介绍&#xff09; 工具&#xff1a;FRP&#xff08;fast reverse proxy&#xff09; 系统&#xff1a;Linux、Windows 架构&#xff1a;x86、amd Frp版本&#xff1a;frp_0.62.1_windows_amd64准备…

结合二八定律安排整块时间

你是不是常常感觉一天到晚忙忙碌碌&#xff0c;却总觉得没干成几件“要紧事”&#xff1f;时间仿佛从指缝间溜走&#xff0c;成就感却迟迟不来&#xff1f;其实&#xff0c;高效能人士的秘诀往往藏在最简单的原则里。今天&#xff0c;我们就来聊聊如何巧妙运用“二八定律”&…

波形发生器AWG硬件设计方案

目录 简介 设计需求 设计方案 核心原理图展示 简介 波形发生器是一种数据信号发生器&#xff0c;在调试硬件时&#xff0c;常常需要加入一些信号&#xff0c;以观察电路工作是否正常。用一般的信号发生器&#xff0c;不但笨重&#xff0c;而且只发一些简单的波形&#xff…

11.Dockerfile简介

1.是什么&#xff1f; dockerfile是用来构建镜像的文本文件&#xff0c;是由一条条构建镜像所需的指令和参数构成的脚本。 构建三步骤 编写dockerfile文件docker build命令构建镜像docker run依镜像运行的容器实列 2.dockerfile构建过程解析 1)dockerfile内容的基础知识 …

C# 接口(interface 定义接口的关键字)

目录 使用接口案例 接口继承 练习 定义一个接口&#xff0c;在语法中与定义一个抽象类是没有区别的&#xff0c;但是不允许提供接口中任意成员的实现方式&#xff0c;一般接口只会包含方法 、索引器和事件的声明&#xff0c; 不允许声明成员的修饰符&#xff0c; public都不…

5190 - 提高:DFS序和欧拉序:树上操作(区域修改1)

题目传送门 时间限制 : 2 秒 内存限制 : 256 MB 有一棵点数为 N 的树&#xff0c;以点 1 为根&#xff0c;且树点有边权。然后有 M 个 操作&#xff0c;分为三种&#xff1a; 操作 1 &#xff1a;把某个节点 x 的点权增加 a 。 操作 2 &#xff1a;把某个节点 x 为根的子树中…

【Oracle】数据泵

ORACLE数据库 数据泵 核心参数全解析 ORACLE expdp 命令使用详解 1.ATTACH[schema_name.]job_name Schema_name 用于指定方案名,job_name 用于指定导出作业名.注意,如果使用 ATTACH 选项,在命令行除了连接字符串和 ATTACH 选项外,不能指定任何其他选项,示例如下: expdp hr/hr A…

机器学习的算法有哪些?

&#x1f31f; 欢迎来到AI奇妙世界&#xff01; &#x1f31f; 亲爱的开发者朋友们&#xff0c;大家好&#xff01;&#x1f44b; 我是人工智能领域的探索者与分享者&#xff0c;很高兴在CSDN与你们相遇&#xff01;&#x1f389; 在这里&#xff0c;我将持续输出AI前沿技术、实…

【计算机网络】OSI七层模型

OSI七层模型为什么需要OSI七层模型&#xff1f;OSI七层模型具体是什么&#xff1f;Layer7&#xff1a;应用层&#xff08;Application Layer&#xff09;Layer6&#xff1a;表示层&#xff08;Presentation Layer&#xff09;Layer5&#xff1a;会话层&#xff08;Session Laye…