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]})this.mapObj.addOverlay(this.popup)}}, 1000);

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

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

相关文章

基于Springboot个性化图书推荐系统JAVA|VUE|SSM计算机毕业设计源代码+数据库+LW文档+开题报告+答辩稿+部署教+代码讲解

源代码数据库LW文档&#xff08;1万字以上&#xff09;开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统&#xff1a;Window操作系统 2、开发工具&#xff1a;IntelliJ IDEA或者Eclipse 3、数据库存储&#xff1a…

优思学院|TQM和ISO9001有什么关系?

TQM 和 ISO 9001有什么关系&#xff1f;我们把这个问题交给AI&#xff0c;它的回答是&#xff1a; 老实说&#xff0c;说它答错&#xff0c;又不算是错&#xff0c;但说它答对&#xff0c;也不算&#xff0c;总之就是一种模凌两可的感觉。 为什么会这样&#xff1f;因为管理中…

【gradio介绍】Python 可视化 web 神器---gradio介绍

Gradio是一个开源的Python库&#xff0c;专为帮助开发者快速搭建和分享机器学习模型、API或任意Python函数的用户界面&#xff08;UI&#xff09;而设计。它基于FastAPI和Svelte&#xff0c;是一个易于部署且功能强大的Web界面构建工具&#xff0c;特别适用于展示和测试机器学习…

在产品上扩大库存?教你一招!全开源!

几乎所有人都会遇到的头疼问题&#xff1a;内存不够&#xff0c;因为很多照片、音频、文档药存储。。。 我们都知道芯片的储存都是寸土寸金的&#xff0c;内部不够只能外扩&#xff01; 有没有简单一点的方法呢&#xff1f;实在不想编写各种驱动&#xff0c;替换Flash&#x…

探索未来:MultiOn,AI的下一个革命

文章目录 探索未来&#xff1a;MultiOn&#xff0c;AI的下一个革命背景&#xff1a;为什么选择MultiOn&#xff1f;MultiOn是什么&#xff1f;如何安装MultiOn&#xff1f;简单的库函数使用方法场景应用常见问题及解决方案总结 探索未来&#xff1a;MultiOn&#xff0c;AI的下一…

conda环境下module ‘numba.types‘ has no attribute ‘Macro‘问题解决

1 问题描述 conda环境下运行数据处理&#xff0c;报出如下错误&#xff1a; Traceback (most recent call last):File "train_preprocess.py", line 13, in <module>import audioFile "/opt/service/lipsync/audio.py", line 1, in <module>…

增强网络威胁防御能力的云安全新兴技术

一些行业专家强调了基于云的运营的独特网络安全需求&#xff0c;并指出保护敏感数据与传统的本地网络不同。尽管新兴技术并没有改变网络安全专业人员与犯罪分子之间持续的斗争&#xff0c;但它们提高了赌注&#xff0c;使斗争变得更加复杂。 如今&#xff0c;我们面对的是技术…

药用植物的空间多组学:从生物合成途径到工业应用-文献精读51

Spatial multi-omics in medicinal plants: from biosynthesis pathways to industrial applications 药用植物的空间多组学&#xff1a;从生物合成途径到工业应用 摘要 随着分子测序和成像技术的快速发展&#xff0c;药用植物的多组学研究进入了单细胞时代。我们讨论了空间多…

西安云仪:心无旁骛做实业 精益求精造仪表

仪器仪表&#xff0c;被誉为工业生产的“倍增器”&#xff0c;是国家测量精度和科技发展水平的重要体现。近年来&#xff0c;我国仪器仪表产业正在稳步增长。据统计&#xff0c;2023年实现营收10112亿元&#xff0c;正式进入万亿元时代&#xff0c;部分高端产品已经达到或接近国…

阿里云「通义灵码」迎来重磅升级,「AI 程序员」正式亮相!

最近两年&#xff0c;随着大语言模型和生成式 AI 技术的爆火&#xff0c;软件开发领域首当其冲成为了最热门的大模型应用场景之一&#xff0c;GitHub Copilot、通义灵码等 AI 辅助编程工具纷纷问世。这些工具通过自然语言处理和机器学习技术&#xff0c;能够理解开发者的意图&a…

USB转8路串口 USB转8路RS232 USB转8路TTL

一、功能描述 本模块采用CH348Q芯片作为主芯片&#xff0c;CH348 是一款高速 USB 总线的转接芯片&#xff0c;实现USB转八个异步串口UARTA/B/C/D/E/F/G/H 功能&#xff0c; 用于为计算机扩展异步串口&#xff0c;或者将普通的串口设备或者MCU直接升级到USB总线。外加4颗MAX323…

Leetcode 每日一题:Diameter of Binary Tree

写在前面&#xff1a; 最近被学校的 campus involvement 社团活动的招新宣传和选拔&#xff0c;以及找工作频繁的参加招聘会和网上申请忙的焦头烂额&#xff0c;马上又要到来的期中考试让我再次意识到了大学生活的险恶。虽然大家都说学生时代是最幸福的时代&#xff0c;但这个…

Vue3使用通信组件库mitt作为事件总线实现跨组件通信

mitt 介绍: Mitt 是一个在 Vue.js 应用程序中使用的小型事件总线库。该库允许组件进行通信&#xff0c;而不必过度依赖父级或子级组件之间的 props。 先看项目用例&#xff1a; 【 以下转载自&#xff1a;https://blog.csdn.net/yuanlong12178/article/details/139579299 】…

无人机飞手教员培训持证,必须会组装,模拟,维修才能带好学员

无人机飞手员的教培训不应仅仅局限于获取飞行执照或证书&#xff0c;而应是一个全面等多、方面的深入能力且&#xff0c;实践以确保导向能够的过程全面。、一个有效地合格的指导无人机学员飞。手教员不仅需要掌握扎实的飞行技能&#xff0c;还需要具备组装、模拟训练、维修。 组…

线性调频信号脉冲压缩并非是一个门信号

如果是频域是门信号&#xff0c;时域是sinc信号&#xff0c;时间越长震荡只会越小。图象是线性卷积做的&#xff0c;肯定没错。

SGLang——结构化语言模型程序的高效执行

前言 大型语言模型 (LLM) 越来越多地用于需要多次生成调用、高级提示技术、控制流和结构化输入/输出的复杂任务。然而&#xff0c;缺乏用于编程和执行这些应用程序的高效系统。新推出的系统 SGLang 旨在通过提供复杂语言模型程序的高效执行来解决这一问题。SGLang 包含前端语言…

828华为云征文|华为云Flexus X轻松实现Redis一主多从高效部署

目录 前言 一、华为云Flexus X加速Redis购买 1.1 Flexus X实例购买 1.2 Redis加速镜像选择 1.3 重置密码 1.4 登录Flexus X实例 1.5 Flexus X实例Redis验证 二、华为云Flexus X主节点Redis配置 2.1 重置密码 2.2 Redis外部访问配置 三、华为云Flexus X从节点Redis配置 3.1 从机…

亚马逊商品详情数据接口:提升运营排名的工具

亚马逊商品详情数据接口是亚马逊平台提供的一种服务&#xff0c;允许用户通过程序调用API&#xff08;应用程序接口&#xff09;来获取亚马逊商品的相关数据。这个接口为开发者和商家提供了丰富的商品信息&#xff0c;有助于优化用户体验、支持购买决策、竞品分析和市场研究等。…

Comfyui海报工作流:出图快,质量高!

前言 工作流获取方式放在这里了 在快节奏的现代生活中&#xff0c;高效的工作流程对于企业和个人而言&#xff0c;无疑是提升竞争力的关键。 特别是在设计领域&#xff0c;能够快速而精准地完成海报设计&#xff0c;不仅意味着时间的节省&#xff0c;更代表着工作效率的飞跃。…

玩转图像处理:Python与OpenCV实现高效绿幕背景替换

文章目录 前言色度抠图技术&#xff08;Chroma Keying&#xff09;基本原理 数据准备代码实现性能分析代码优化优化后的速度 前言 现阶段绿幕抠图有很多种方式&#xff0c;比如色度抠图&#xff08;Chroma Keying&#xff09;、亮度抠图&#xff08;Luma Keying&#xff09;、色…