当前位置: 首页 > news >正文

OpenLayers 综合案例-底图换肤(变色)

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

OpenLayers 综合案例-底图换肤(变色)

Vue 3 + OpenLayers 实现的 WebGIS 应用提供了完整的底图变色功能

使用RasterSource栅格数据源,图层必须使用ImageLayer来渲染

主要功能

  1. 通过属性operationType: "image", 设置为 image 模式,保持无卡顿高效渲染
  2. 通过调节RGB取色来修改底图颜色,同时保证底图字体随着颜色变化而变化

在这里插入图片描述

MP4效果动画链接地址&官网hcl调色案例教程

技术栈

该环境下代码即拿即用

Vue 3.5.13+
Openlayers 10.5.0+
Vite 6.3.5+
<template><div><div id="map" class="map"></div><table class="controls"><tr><td><label for="red">Red</label></td><td><input id="red" type="range" min="0" max="500" v-model="redValue" /></td><td><span>{{ redValue }}</span> %</td></tr><tr><td><label for="green">Green</label></td><td><inputid="green"type="range"min="0"max="500"v-model="greenValue"/></td><td><span>{{ greenValue }}</span> %</td></tr><tr><td><label for="blue">Blue</label></td><td><input id="blue" type="range" min="0" max="500" v-model="blueValue" /></td><td><span>{{ blueValue }}</span> %</td></tr></table></div>
</template><script setup>
import { ref, onMounted, onUnmounted, watch } from "vue";
import Map from "ol/Map.js";
import View from "ol/View.js";
import XYZ from "ol/source/XYZ.js";
import ImageLayer from "ol/layer/Image.js";
import RasterSource from "ol/source/Raster.js";
import "ol/ol.css";let map = null;
let raster = null;// 定义响应式变量,用于双向绑定
const redValue = ref(89);
const greenValue = ref(223);
const blueValue = ref(325);onMounted(() => {// 定义RGB调节函数const adjustRGB = function (imageData, data) {const pixels = imageData.data;const redMultiplier = data.red || 89;const greenMultiplier = data.green || 223;const blueMultiplier = data.blue || 325;// 遍历所有像素 (每4个值代表一个像素: R, G, B, A)for (let i = 0; i < pixels.length; i += 4) {pixels[i] = redMultiplier - pixels[i]; // Redpixels[i + 1] = greenMultiplier - pixels[i + 1]; // Greenpixels[i + 2] = blueMultiplier - pixels[i + 2]; // Blue}};// 创建栅格源 - 使用XYZ瓦片源raster = new RasterSource({sources: [new XYZ({url: "https://webrd04.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={x}&y={y}&z={z}",crossOrigin: "anonymous", // 添加跨域支持}),],operationType: "image", // 设置为image模式,无卡顿高效渲染operation: function (pixels, data) {// 在image模式下,pixels[0]是ImageData对象const imageData = pixels[0];// 调用RGB调节函数adjustRGB(imageData, data);// 返回修改后的ImageDatareturn imageData;},// 将函数添加到lib中lib: {adjustRGB: adjustRGB,},});// 监听栅格操作前事件,将响应式变量的值传递给操作数据raster.on("beforeoperations", function (event) {const data = event.data;data.red = redValue.value;data.green = greenValue.value;data.blue = blueValue.value;});// 创建地图map = new Map({layers: [// 使用ImageLayer显示处理后的栅格new ImageLayer({source: raster,}),],target: "map",view: new View({center: [12958752, 4825923], // 中国中心坐标 (Web Mercator)zoom: 4,maxZoom: 18,}),});// 监听响应式变量的变化,并触发栅格图层更新watch([redValue, greenValue, blueValue], () => {if (raster) {raster.changed();}});
});onUnmounted(() => {if (map) {map.setTarget(null);map = null;}
});
</script><style scoped>
.map {width: 100vw;height: 100vh;
}
table.controls {position: absolute;top: 10px;right: 10px;background: rgba(255, 255, 255, 0.9);border-radius: 5px;padding: 10px;box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);z-index: 1000;
}
table.controls td {padding: 2px 5px;
}
table.controls td:nth-child(3) {text-align: right;min-width: 4.5em;
}
table.controls label {font-weight: bold;color: #333;
}
table.controls input[type="range"] {width: 150px;
}
table.controls span {color: #666;font-family: monospace;
}
/* 为不同的滑块添加颜色提示 */
table.controls tr:nth-child(1) input[type="range"] {accent-color: #ff4444;
}
table.controls tr:nth-child(2) input[type="range"] {accent-color: #44ff44;
}
table.controls tr:nth-child(3) input[type="range"] {accent-color: #4444ff;
}
</style>
http://www.dtcms.com/a/303923.html

相关文章:

  • DevOps 详解
  • Linux -- 文件【中】
  • CVE-2022-46169漏洞复现
  • DNS污染与劫持
  • 《林景媚与命运协议》
  • 服务器数据恢复—RAID上层部署的oracle数据库数据恢复案例
  • logtrick 按位或最大的最小子数组长度
  • JavaWeb(苍穹外卖)--学习笔记15(分页查询PageHelper)
  • Unity_UI_NGUI_DrawCall
  • Mac安装Navicat步骤Navicat Premium for Mac v17.1.9【亲测】
  • 【腾讯云】EdgeOne网站安全防护的配置方法 防范盗刷流量 附恶意IP和UA黑名单
  • 学习网址备份(二)
  • Linux 启动流程、密码破解、引导修复完全手册
  • 【智能协同云图库】智能协同云图库第八弹:基于阿里云百炼大模型—实现 AI 扩图功能
  • haproxy应用详解
  • 创建型设计模式-工厂方法模式和抽象工厂方法模式
  • 云端文档管理新纪元:Paperless-ngx与cpolar打造的无边界文件生态
  • Ext JS极速项目之 Coworkee
  • 在WSL中配置VS Code C++开发环境完整教程
  • Java抽Oracle数据时编码问题
  • 百元级工业级核心板:明远智睿×瑞萨V2H,开启AIoT开发新纪元
  • 论文阅读:LMM-Det: Make Large Multimodal Models Excel in Object Detection
  • 从0到1学PHP(三):PHP 流程控制:掌控程序的走向
  • 解析hive sql——将别名表、字段转化为指示表字段
  • 算法思维进阶 力扣 375.猜数字大小 II 暴力递归 记忆化搜索 DFS C++详细算法解析 每日一题
  • 详细说明零拷贝
  • LeetCode 1616.分割两个字符串得到回文串
  • 使用鼠标在Canvas上绘制矩形
  • 【dropdown组件填坑指南】鼠标从触发元素到下拉框中间间隙时,下拉框消失,怎么解决?
  • 前后端分离的项目,有一个计算的功能,是前端计算还是后端计算