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

openlayers中一些问题的解决方案

一、使用地图时可能会出现的需求

1、定位:需要将地图的中心视野,定位到研究区域的中心点;
2、地图蒙版:只研究特定区域,将其他部分区域用蒙层遮罩,突显重点;
3、变色:设置整体的地图颜色风格,更换不同的主题颜色;
4、打点:在地图上加入一些点位图标的矢量元素;
5、画线:在地图上加入矢量线元素;
6、画面:在地图上加入矢量面元素;
7、事件:设置地图矢量的点击事件等;
8、弹出层:配置地图内部弹出层,显示特定信息。

二、解决方案

以下使用的部分变量基本上均为地图相关变量,需传入对应参数。

1、定位

①直接设置地图中心点(无位移动画)

map.getView().setCenter(coord)

②动画位移至中心点

map.getView().animate( {center: center},{zoom: zoom})

2、地图蒙版

需借助插件"ol-ext"完成。

import Mask from 'ol-ext/filter/Mask'
// region 需要被遮罩的图层let maskLayer = this.getLayer('img')// 创建遮罩过滤, 此处注意坐标系问题const maskFilter = new Mask({feature: new GeoJSON({featureProjection: 'EPSG:4326'}).readFeature(gis.features[0]),wrapX: true,inner: false,fill: new Fill({color: color || 'rgba(0,0,0,0.5)'}),})// 设置图层遮罩过滤maskLayer.addFilter(maskFilter)

3、变色

核心操作:回调函数,通过每次获取瓦片时,对瓦片进行重绘,然后再将瓦片数据上图。

new TileLayer({id: "cia_n",source: new WMTS({url: wmtsUrl_1 + webKey,layer: "cia",matrixSet: "c",format: "tiles",style: "default",projection: projection,tileGrid: new WMTSTileGrid({origin: getTopLeft(projectionExtent),resolutions: resolutions,matrixIds: matrixIds,}),wrapX: true,tileLoadFunction: function (imageTile, src) {// 使用滤镜 将白色修改为深色let img = new Image()// img.crossOrigin = ''// 设置图片不从缓存取,从缓存取可能会出现跨域,导致加载失败img.setAttribute('crossOrigin', 'anonymous')img.onload = function () {let canvas = document.createElement('canvas')let w = img.widthlet h = img.heightcanvas.width = wcanvas.height = hlet context = canvas.getContext('2d')context.filter = 'grayscale(98%) invert(100%) sepia(20%) hue-rotate(180deg) saturate(1600%) brightness(80%) contrast(90%)'context.drawImage(img, 0, 0, w, h, 0, 0, w, h)imageTile.getImage().src = canvas.toDataURL('image/png')}img.src = src}}),});

4、打点

常见需求,对部分地标或者建筑需要将其加入地图中,有助于使用者查看内容分布情况和内容具体位置。

添加地图元素需要分四步走,第一步是生成图层(点位元素的容器),第二步生成点位,第三步声明style(即点位的样式信息,例如点位图片、位置等),第四步将点位加入图层。

import {Point,
} from 'ol/geom'// 声明图层名称变量const addToLayer = toLayer || 'pointerLayer'
// 生成点位,param为函数传入参数,代表点位信息数据
let newFeature = new Feature({id: param.id,layerId: param.layerId,data: param.data,geometry: new Point(param.position)})
// 生成样式
let style = new Style()
newFeature.setStyle(style)
// 此处将第一步和第三步合并,在生成的时候加入点位,当然也可以在生成之后再通过调用source加入
const vectorLayerObj = new VectorLayer({id: addToLayer,zIndex: param.zIndex || 95,minZoom: param.minZoom,maxZoom: param.maxZoom,source: new VectorSource({features: [newFeature]})})

5、画线

步骤与生成点基本一致,只是在声明矢量元素时有所不同。

import {LineString
} from 'ol/geom'let routerLine = new Feature({geometry: new LineString(param.coordinates),data: param.data,layerId: param.layerId,id: param.id,});

6、画面

import {MultiPolygon,Polygon
} from 'ol/geom'let newPolygon = new Feature({geometry: new Polygon(data.coordinates),data: data.data,layerId: data.layerId,id: data.id,});

7、事件

若需要与地图交互时触发相关事件,需要添加对应的监听方法,常用的有点击监听、鼠标移动监听等事件。

①监听鼠标移动事件:常用的方式为,鼠标划过矢量元素时变成小手。

mouseoverEvent() {map.on("pointermove", (e) => {this.$emit("handleMoveCoordinate", e.coordinate);let pixel = this.map.mapObj.getEventPixel(e.originalEvent);let feature = this.map.mapObj.forEachFeatureAtPixel(pixel,(feature) => {return feature;});if (feature) {if (feature.values_.id) {map.getTargetElement().style.cursor = "pointer";}} else {if (that.cursorPointer == "crosshair") {map.getTargetElement().style.cursor = "crosshair";} else {map.getTargetElement().style.cursor = "auto";}}});},

②点击事件:常与弹出层搭配使用,点击对应矢量,弹出相关信息。

var selectSingleClick = new Select();
selectSingleClick.on("select", (e) => {let features = e.target.getFeatures().getArray();if (features.length > 0) {let feature = features[0];let featureObj = feature.values_.data;let coordinate = null;// 获取点击元素的featureif (featureObj) {}selectSingleClick.getFeatures().clear();});map.mapObj.addInteraction(selectSingleClick);

8、弹出层(overlay)

通常情况下,我们可以在html代码中先声明好弹出层的组成结构和样式,然后再将其与overlay对象绑定,从而即可达到理想中的效果。

<div id="popOverLay" class="pop-content" v-show="isShow">
</div>
let overlay = map.getOverlayById('popOverLay')let view = map.getView();view.animate({center: coordinate},{zoom: 15})setTimeout(() => {if (overlay) {overlay.setPosition(coordinate)} else {this.popup = new Overlay({id: 'popOverLay',autoPan: true,autoPanAnimation: {duration: 250},autoPanMargin: 250,element: document.getElementById('popOverLay'),position: coordinate,positioning: 'bottom-center',offset: [-1, -40]})map.addOverlay(this.popup)}}, 1000);

相关文章:

openlayers中一些问题的解决方案

一、使用地图时可能会出现的需求 1、定位&#xff1a;需要将地图的中心视野&#xff0c;定位到研究区域的中心点&#xff1b; 2、地图蒙版&#xff1a;只研究特定区域&#xff0c;将其他部分区域用蒙层遮罩&#xff0c;突显重点&#xff1b; 3、变色&#xff1a;设置整体的地图…...

java通过redis完成幂等性操作

4 幂等 产生 “重复数据或数据不一致”&#xff08; 假定程序业务代码没问题 &#xff09;&#xff0c;绝大部分就是发生了重复的请求&#xff0c;重复请求是指"同一个请求因为某些原因被多次提交"。导致这个情况会有几种场景&#xff1a; 微服务场景&#xff0c;在…...

48 旋转图像

解题思路&#xff1a; \qquad 这道题同样需要用模拟解决&#xff0c;原地算法要求空间复杂度尽量小&#xff0c;最好为 O ( 1 ) O(1) O(1)。模拟的关键是找到旋转的内在规律&#xff0c;即旋转前后的位置坐标的变化规律。 \qquad 正方形矩阵类似洋葱&#xff0c;可以由不同大小…...

TDengine 签约青山钢铁,实现冶金全流程质量管控智能化

在不锈钢生产领域&#xff0c;企业面临着信息孤岛和数据分散的挑战&#xff0c;尤其在冶炼、连铸和轧钢等关键工艺以及能源管理上&#xff0c;这种现象导致生产要素&#xff08;人、机、料、法、环&#xff09;的分析管理模型难以全面、深入地实施。为了应对这一挑战&#xff0…...

__pycache__文件夹

__pycache__ 文件夹是 Python 在运行时自动生成的目录&#xff0c;用于存储已编译的字节码文件。这些字节码文件以 .pyc 扩展名结尾&#xff0c;用于加速程序的启动时间&#xff0c;因为不需要每次运行时都重新编译源代码。 主要特点 自动生成&#xff1a;__pycache__ 文件夹…...

利用 Local Data 导入文件到 OceanBase 的方法

背景 在很多传统方法中&#xff0c;数据的传输常依赖于csv格式。为了提高传输效率&#xff0c;属于同一张表的多个csv文件往往会被打包成gz文件进行传输。 当gz文件从上游传递到下游后&#xff0c;为了将其中的csv数据导入数据库&#xff0c;一种直接的做法是&#xff1a; 1…...

改变安全策略的五大实践

随着网络威胁形势的加剧&#xff0c;网络安全计划必须不断发展以保护组织的使命。 为了管理这种持续的网络安全发展&#xff0c;应遵循五项关键的安全计划变更管理实践&#xff1a; 1. 识别并吸引受安全风险影响的业务利益相关者 随着新的网络安全风险被发现&#xff0c;受影…...

在MacOS上安装MongoDB数据库

一、安装方法 1.1 安装包安装 首先&#xff0c;打开MongoDB 官网下载安装包&#xff0c;下载链接&#xff1a;https://www.mongodb.com/try/download/community。 根据自己的系统环境自行选择下载的版本。将下载好的 MongoDB 安装包解压缩&#xff0c;并将文件夹名改为 mon…...

负载均衡--会话保持失败原因及解决方案(五)

会话保持失败可能由多种因素导致&#xff0c;以下是一些主要原因及其解释&#xff1a; 一、服务器及网络问题 服务器故障&#xff1a; 服务器出现故障或不稳定&#xff0c;导致无法正确处理会话信息。这可能是由于硬件故障、网络问题或软件错误等引起的。网络问题&#xff1a…...

24 Vue3之集成TailwindCSS

Tailwind CSS Tailwind CSS是一个由js编写的CSS 框架 他是基于postCss 去解析的 官网地址Tailwind CSS 中文文档 - Tailwind CSS - 只需书写 HTML 代码&#xff0c;无需书写 CSS&#xff0c;即可快速构建美观的网站。 | TailwindCSS中文文档 | TailwindCSS中文网 对于PostCSS…...

iOS OC 底层原理之 category、load、initialize

文章目录 category底层结构runtime 执行 category 底层原理添加成员变量 load调用形式系统调用形式的内部原理源码实现逻辑 initialize调用形式源码核心函数&#xff08;由上到下依次调用&#xff09;如果分类实现了 initialize category 底层结构 本质是结构体。struct _cat…...

另外知识与网络总结

一、重谈NAT&#xff08;工作在网络层&#xff09; 为什么会有NAT 为了解决ipv4地址太少问题&#xff0c;到了公网的末端就会有运营商路由器来构建私网&#xff0c;在不同私网中私有IP可以重复&#xff0c;这就可以缓解IP地址太少问题&#xff0c;但是这就导致私有IP是重复的…...

怎样用云手机进行TikTok矩阵运营?

在运营TikTok矩阵时&#xff0c;许多用户常常面临操作复杂、设备过多等问题。如果你也感到操作繁琐&#xff0c;不妨考虑使用云手机。云手机具备丰富的功能&#xff0c;能够帮助电商卖家快速打造高效的TikTok矩阵。接下来&#xff0c;我们将详细解析这些功能如何提升你的运营效…...

RTMP播放器全解析

一、RTMP 播放器概述 &#xff08;一&#xff09;RTMP 播放器的定义与作用 RTMP 播放器是一种专门用于播放采用 RTMP&#xff08;Real Time Messaging Protocol&#xff09;协议的视频流的工具。在当今的流媒体播放领域中&#xff0c;它扮演着至关重要的角色。RTMP 播放器能够…...

定期清洗ip是为了什么?怎么清洗iip

定期清洗IP&#xff08;也称为“IP清理”&#xff09;的目的是确保使用的IP池保持高效、可靠、安全&#xff0c;避免因使用无效或被封禁的IP导致网络操作失败。尤其在数据爬取、负载均衡等使用代理的场景中&#xff0c;定期清洗IP有助于提升整体的性能和数据抓取成功率。 定期…...

谁能给我一个ai现在无法替代画师的理由?

小白可做&#xff01;全自动AI影视解说一键成片剪辑工具https://docs.qq.com/doc/DYnl6d0FLdHp0V2ll 如何看待现如今的AI绘画 哎呀玫瑰花来了&#xff0c;所有花式都要玩完了。 我相信大家在网上已经看过了太多惊为天人的AI绘画作品&#xff0c;有人抵制&#xff0c;有人支持&a…...

深入理解MySQL InnoDB中的B+索引机制

目录 一、InnoDB中的B 树索引介绍 二、聚簇索引 &#xff08;一&#xff09;使用记录主键值的大小进行排序 页内记录排序 页之间的排序 目录项页的排序 &#xff08;二&#xff09;叶子节点存储完整的用户记录 数据即索引 自动创建 &#xff08;三&#xff09;聚簇索引…...

语言的输入

编程语言提供最基本的输入输出&#xff0c;输入一个预期的数据也不是看起来那么简单&#xff0c;如下一一展开。 不同输入形式 C语言scanf提供格式串输入&#xff0c;程序员负责配置正确的格式&#xff0c;比如%d整型&#xff0c;%s为字符串。可能出现格式串和变量格式、个数不…...

2024年中国电子学会青少年软件编程(Python)等级考试(二级)核心考点速查卡

考前练习 2024年03月中国电子学会青少年软件编程&#xff08;Python&#xff09;等级考试试卷&#xff08;二级&#xff09;答案 解析 2024年06月中国电子学会青少年软件编程&#xff08;Python&#xff09;等级考试试卷&#xff08;二级&#xff09;答案 解析 知识点描述 …...

OpenCV系列教程二:基本图像增强(数值运算)、滤波器(去噪、边缘检测)

文章目录 一、基本图像增强&#xff08;数值运算&#xff09;1.1 加法 &#xff08;cv2.add&#xff09;1.1.1 图像与标量相加&#xff08;调节亮度&#xff09;1.1.2 图像与图像相加&#xff08;两个图像shape要相同&#xff09;1.1.3 图像的加权加法&#xff08;渐变切换&…...

Chrome 扩展 uMatrix 被弃用,MV3 环境下 matrix³ 原型尝试实现其功能

Chrome 扩展 uMatrix 被弃用&#xff0c;MV3 环境下如何实现其功能&#xff1f;matrix 原型来尝试 曾经有一款很棒的 Chrome 扩展程序叫 uMatrix&#xff0c;它由 uBlock Origin 的开发者 Raymond Hill 编写&#xff0c;是一种直观控制网站权限和子资源请求的工具。 它看上去是…...

HTTP客户端设计哲学:从axios到hoomanity的易用性演进

1. 项目概述&#xff1a;一个为人类设计的HTTP客户端在构建现代应用程序时&#xff0c;与外部API或服务进行HTTP通信几乎是每个开发者都会遇到的日常任务。无论是调用一个天气接口、上传文件到云存储&#xff0c;还是与自家的微服务进行数据交换&#xff0c;我们都需要一个可靠…...

ARM CoreSight SoC-400调试系统勘误解析与解决方案

1. CoreSight SoC-400调试系统深度解析在嵌入式系统开发领域&#xff0c;调试与跟踪技术是确保系统可靠性的关键环节。作为ARM架构下的核心调试解决方案&#xff0c;CoreSight SoC-400系列为开发者提供了强大的硬件支持。今天我将结合多年实战经验&#xff0c;深入剖析这个系统…...

基于Adafruit Audio FX的智能穿戴音频系统设计与实现

1. 项目概述&#xff1a;一件会“捧场”的智能夹克你有没有想过&#xff0c;你的衣服可以成为你专属的喜剧演员、气氛组或者随身音效库&#xff1f;想象一下&#xff0c;在朋友聚会时&#xff0c;一个恰到好处的罐头笑声从你的口袋响起&#xff1b;或者在你做出一个帅气动作时&…...

ComfyUI-Manager 3步深度优化:构建稳定高效的AI工作流管理平台

ComfyUI-Manager 3步深度优化&#xff1a;构建稳定高效的AI工作流管理平台 【免费下载链接】ComfyUI-Manager ComfyUI-Manager is an extension designed to enhance the usability of ComfyUI. It offers management functions to install, remove, disable, and enable vario…...

量子优化基准测试库QOBLIB:原理与应用解析

1. 量子优化基准测试库QOBLIB概述量子计算在组合优化领域展现出突破经典计算极限的潜力&#xff0c;但如何系统评估量子算法的实际性能一直是研究难点。2025年发布的QOBLIB&#xff08;Quantum Optimization Benchmarking Library&#xff09;填补了这一空白&#xff0c;成为首…...

AI 越火,存储越关键:一颗存储藏着设备稳定运行的秘密

很多人看芯片&#xff0c;第一眼喜欢看“大件”。CPU、GPU、主控、屏幕、电池、无线模组&#xff0c;好像这些才是产品的主角。但真正做过硬件的人都知道&#xff1a;一个设备能不能稳定开机&#xff0c;程序能不能快速读取&#xff0c;系统能不能在复杂环境下长期跑得住&#…...

别再让电机乱转了!手把手教你用STM32的TIM3和L298N实现精准PWM调速(附完整工程源码)

STM32与L298N电机控制实战&#xff1a;从原理到精准调速的完整指南 在智能小车、机械臂或自动化设备开发中&#xff0c;直流电机控制是最基础却最容易出问题的环节。很多初学者在第一次连接STM32和L298N驱动模块时&#xff0c;都会遇到电机不转、乱转或速度不稳的情况。本文将彻…...

LVDS协议解析:从差分信号原理到高速接口设计实战

1. LVDS协议基础&#xff1a;差分信号原理与硬件特性 第一次接触LVDS时&#xff0c;我被它那两根看似"镜像对称"的信号线搞糊涂了——为什么传输一个信号需要两根线&#xff1f;后来在调试一块高速图像采集卡时&#xff0c;当其他接口都受到电机干扰出现雪花噪点&…...

三量子比特控制旋转门:挑战与创新协议设计

1. 三量子比特控制旋转门的核心挑战在量子计算领域&#xff0c;多量子比特门是实现复杂量子算法的关键构建模块。其中&#xff0c;三量子比特控制旋转门(C2Ry)作为一种基本的多量子比特操作&#xff0c;能够根据两个控制量子比特的状态对目标量子比特执行条件旋转&#xff0c;在…...