Openleyer 获取features样式

news2024/11/13 9:50:55

目录

一、需求说明:

二、业务功能分析:

三、地图点击事件

四、地图要素select事件

五、地图双击事件

六、移动到地图点事件


一、需求说明:

若聚合情况下,点击聚合要素,若只有一个要素,则显示详情信息,否则显示详情列表

二、业务功能分析:

获取地图上的点击要素方法有2种途径,

1、interaction中select方法

2、map中forEachFeatureAtPixel方法

其中,当数据量多大的时候,是不建议采用第二种方法,因为forEachFeatureAtPixel的原理,是遍历操作,当数据量大的时候,页面容易卡顿;因此建议采用第一种方法

三、地图点击事件

1         //点击事件
 2         clickMap(evt) {
 3             let featureMouseOver = this.map.forEachFeatureAtPixel(evt.pixel, function (feature, layer) {
 4                 return feature;
 5             });
 6             if (!featureMouseOver) return 
 7             let overFeature = featureMouseOver.getProperties().features
 8             if(!overFeature || overFeature.length == 0) return false
 9             if (overFeature.length === 1) {// 只有一个元素的情况下
10                 let feature = overFeature[0]; //获取该要素
11                 let featureData = feature.get('data') || {}
12                 this.showFeature(featureData, evt.coordinate) 
13             } else if(overFeature.length > 1){// 多个元素的情况下
14                 this.showFeatureList(overFeature, evt.coordinate)   // 展示设备列表
15             }
16         },

四、地图要素select事件

1        // 给页面的要素添加点击事件
 2         featureClick(evt) {
 3             var selectSingleClick = new ol.interaction.Select({
 4                 style: new ol.style.Style({
 5                     image: new ol.style.Circle({
 6                         radius: 18,
 7                         fill: new ol.style.Fill({
 8                             color: 'rgba(70,220,198,0.5)'
 9                         })
10                     })
11                 })
12             });
13             this.map.addInteraction(selectSingleClick);
14             selectSingleClick.on('select', e =>{
15                 var featuresAry=e.target.getFeatures().getArray();
16                 if (featuresAry.length>0){
17                     let featureList=featuresAry[0];
18                     let coordinate = ol.extent.getCenter(featureList.getGeometry().getExtent());    // 点击的点经纬度
19                     // 至此得出聚合图层的要素列表
20                     let features=featureList.getProperties().features;   
21                     this.closeDevicePopup() // 关闭已打开的列表popup
22                     this.closeVideoPopup()  // 关闭已打开的详情popup
23                     if(features.length == 1 ) {
24                         let featureData = features[0].get('data') || {}
25                         this.showFeature(featureData, coordinate) 
26                     } else if(features.length > 1) {
27                         this.showFeatureList(features, coordinate)   // 展示设备列表
28                     }
29                 }
30             })
31         },

   查看详情和查看列表方法

    Html+js

1         <el-container style="position: relative;">
 2             <div id="map" class="map"></div>
 3             <!-- 自定义开发控件 -->
 4             <div class="tool-box" v-show="hasLoadMap">
 5                 <map-operation :map="map"></map-operation>
 6             </div>
 7             <!-- 设备信息弹窗 -->
 8             <div class="ol-popup" ref="overlayPopup">
 9                 <div class="close-icon" @click="closeVideoPopup">x</div>
10                 <div>
11                     <div class="vedio-selection" @click="showPlayBox(1)">监测</div>
12                     <div class="vedio-selection" @click="showPlayBox(2)">回放</div>
13                     <div class="vedio-selection" @click="showDeviceInfoBox" v-if="dockingOneForOne">设备信息</div>
14                 </div>
15                 <div class="eachItem">名称:{{popupDeviceInfo.dev_chann_name}}</div>
16                 <div class="eachItem">类型:{{popupDeviceInfo.channel_type}}</div>
17             </div> 
18             <!-- 设备聚合列表弹窗 -->
19             <div class="ol-popup-devicelist" ref="deviceListPopup">
20                 <div class="close-icon" @click="closeDevicePopup">x</div>
21                 <div class="popupTitle">设备信息
22                     <span class="popupsubTitle">(合计{{popupDeviceList.length}}个)</span>
23                 </div>
24                 <div class="popupDeviceOutter">
25                     <div v-for="(item,index) in popupDeviceList" :key="index" class="eachItem" :title="item.dev_chann_name" @click="showDeviceInfoFun(item)">
26                         <span class="indexCls">{{index+1}}、</span>
27                         <img :src="rspImg(item.facade, item.status)" class="popupImg">
28                         {{item.dev_chann_name}}
29                     </div>
30                 </div>
31             </div>
32         </el-container>
1 // popup展示,聚合列表数据
 2         showFeatureList(overFeature, coordinate) {
 3             this.popupDeviceList = []
 4             overFeature.forEach(itemFeature =>{
 5                 const itemFeatureData = itemFeature.get('data') || {}
 6                 this.popupDeviceList.push(itemFeatureData)
 7             })
 8             let deviceListPopup = this.$refs.deviceListPopup;
 9             if (!_data.deviceListPopup) {
10                 _data.deviceListPopup = new ol.Overlay({
11                     element: deviceListPopup,
12                     offset: [10, 0],
13                 });
14                 deviceListPopup.style.display = 'block';
15                 this.map.addOverlay(_data.deviceListPopup);
16             } else {
17                 deviceListPopup.style.display = 'block';
18                 _data.deviceListPopup.setOffset([10, 0]); // 设置偏移量
19                 _data.deviceListPopup.setElement(deviceListPopup);
20             }
21             _data.deviceListPopup.setPosition(coordinate);
22         },
23         //popup展示设备的具体信息
24         showFeature(featureData, coordinate) {
25             let overlayPopup = this.$refs.overlayPopup;
26             this.popupDeviceInfo = featureData
27             if (!_data.overlayPopup) {
28                 _data.overlayPopup = new ol.Overlay({
29                     element: overlayPopup,
30                     offset: [10, 0],
31                 });
32                 overlayPopup.style.display = 'block';
33                 this.map.addOverlay(_data.overlayPopup);
34             } else {
35                 overlayPopup.style.display = 'block';
36                 _data.overlayPopup.setOffset([10, 0]); // 设置偏移量
37                 _data.overlayPopup.setElement(overlayPopup);
38             }
39             _data.overlayPopup.setPosition(coordinate);
40             this.setCurrentDevice(featureData)
41         },
42         //关闭overlayPopup
43         closeVideoPopup() {
44             let overlayPopup = this.$refs.overlayPopup;
45             overlayPopup.style.display = 'none';
46         },
47          //关闭overlayPopup
48         closeDevicePopup() {
49             let deviceListPopup = this.$refs.deviceListPopup;
50             deviceListPopup.style.display = 'none';
51         },

五、地图双击事件

1         //双击地图事件
 2         dbclickMap(evt) {
 3             let featureMouseOver = this.map.forEachFeatureAtPixel(evt.pixel, function (feature, layer) {
 4                 return feature;
 5             });
 6             if (featureMouseOver) {
 7                 let featureProperties = featureMouseOver.getProperties();
 8                 if (!featureProperties.features) return;
 9                 //聚合情况下
10                 if (featureProperties.features.length > 1) {
11                     //双击聚合图层放大
12                     let view = this.map.getView();
13                     view.setZoom(view.getZoom() + 2);
14                     view.setCenter(featureMouseOver.getGeometry().getCoordinates()); //设置地图显示中心
15                 }
16             }
17         },

 

六、移动到地图点事件

 // 监听鼠标移动,移动到feature上时,鼠标变为可点击的状态
                    this.map.on('pointermove', (e) => {
                    // 获取像素位置
                    let pixel = this.map.getEventPixel(e.originalEvent);
                    // 根据点位像素位置,获取此位置的要素feature
                    let feature = this.map.forEachFeatureAtPixel(pixel, (feature) => {
                        return feature;
                    });
                    // 要素存在,并且是需要改变鼠标样式为pointer的feature,鼠标样式变为pointer,否则auto
                    if (feature && feature.get('pointer')) {
                        this.map.getTargetElement().style.cursor = 'pointer';
                    } else {
                        this.map.getTargetElement().style.cursor = 'auto';
                    }
                });

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

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

相关文章

【安卓】WebView的用法与HTTP访问网络

文章目录 WebView的用法使用http访问网络使用HttpURLConnection使用OkHttp 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。 点击跳转到网站。 WebView的用法 新建一个WebViewTest项目&#xff0c;然后修…

管易云与金蝶K3-WISE对接集成发货单查询打通新增其他出库

管易云与金蝶K3-WISE对接集成发货单查询打通新增其他出库 对接系统&#xff1a;管易云 管易云是金蝶旗下专注提供电商企业管理软件服务的子品牌&#xff0c;先后开发了C-ERP、EC-OMS、EC-WMS、E店管家、BBC、B2B、B2C商城网站建设等产品和服务&#xff0c;涵盖电商业务全流程。…

本地连接服务器上docker中的redis

在上一篇本地连接服务器redis这篇文章中详细介绍了。 这里连接服务器中docker中的redis&#xff0c;同样的操作步骤 1.看一下服务器上redis实例的运行状态&#xff1a; [rootiZuf67k70ucx14s6zcv54dZ var]# ps aux | grep redis-server若显示&#xff1a; 则说明服务器上do…

Denser Retriever: RAG中更强大的AI检索器,让您10 分钟内构建聊天机器人应用

一、Denser Retriever 介绍 Denser Retriever 是一个企业级的RAG检索器&#xff0c;将多种搜索技术整合到一个平台中。在MTEB数据集上的实验表明&#xff0c;Denser Retriever可以显著提升向量搜索&#xff08;VS&#xff09;的基线&#xff08;snowflake-arctic-embed-m模型,…

如何在PyCharm使用conda虚拟环境,如何使用远程Linux系统上的conda虚拟环境。

目录 在PyCharm使用conda虚拟环境&#xff08;windows&#xff09; 使用远程Linux系统上的conda虚拟环境 在PyCharm使用conda虚拟环境&#xff08;windows&#xff09; 首先请创建好虚拟环境 点击输入 conda create -n pyspark python3.8 # conda create -n 名字任取 py…

智谱AI与和鲸科技签署战略合作协议,共拓大模型产业应用与人才培养新未来

8月9日&#xff0c;北京智谱华章科技有限公司&#xff08;智谱 AI&#xff09;与上海和今信息科技有限公司&#xff08;和鲸科技&#xff09;在北京签署战略合作协议。智谱 AI 总裁王绍兰与和鲸科技创始人、CEO 范向伟亲临现场&#xff0c;发表致辞并见证签约。智谱 AI AIGC 事…

Python软件包和PIP镜像下载地址

一、Python软件下载地址 1. 官网下载 https://www.python.org/downloads/ 2. 国内第三方镜像 https://mirrors.huaweicloud.com/python/ https://registry.npmmirror.com/binary.html?pathpython/ 从以上国内镜像即可下载安装程序&#xff0c;Windows平台&#xff0c;不论是In…

网络安全 DVWA通关指南 DVWA File Inclusion(文件包含)

DVWA File Inclusion&#xff08;文件包含&#xff09; 文章目录 DVWA File Inclusion&#xff08;文件包含&#xff09;本地文件包含(LFI)漏洞利用 远程文件包含(RFL)漏洞利用 修复建议 LowMediumHighImpossible 本地文件包含(LFI) 文件包含漏洞的产生原因是 PHP 语言在通过引…

我的世界 异地联机教程 无需公网IP、服务器

主要内容 什么是Minecraft&#xff08;JAVA国际版&#xff09; 搭建该服务&#xff0c;需要准备什么 详细步骤 1.启动器 安装MC并运行MC 2.运行 MoleSDN 进行异地联机 3.小伙伴皮蛋加入鼠鼠的MC 完成联机 什么是我的世界 一款3D沙盒电子游戏&#xff0c;由Mojang Studio…

ComfyUI大猫咪写真工作流,哩布线上一键运行

前言 这次教程是用ComfyUI做的大猫咪写真。 视频教程 打开下面这个网站&#xff0c;点击【在线运行工作流】就可以一键运行ComfyUI工作流了 所有的AI设计工具&#xff0c;模型和插件&#xff0c;都已经整理好了&#xff0c;&#x1f447;获取~ 正面关键词&#xff1a; Chin…

基于二叉树的近似最近邻搜索-Annoy

在推荐系统的召回阶段&#xff0c;会实时计算用户的表征向量&#xff08;user/query&#xff09;&#xff0c;然后去物料库去寻找与用户最匹配的N个物料返回给用户&#xff1b;在搜索系统&#xff0c;也同样存在这样的需求&#xff0c;用户的搜素&#xff08;query&#xff09;…

Efficient DETR:别再随机初始化了,旷视提出单解码层的高效DETR | CVPR 2021

Efficient DETR结合密集检测和稀疏集合检测的优点&#xff0c;利用密集先验来初始化对象容器&#xff0c;弥补单层解码器结构与 6 层解码器结构的差距。在MS COCO上进行的实验表明&#xff0c;仅 3 个编码器层和 1 个解码器层即可实现与最先进的目标检测方法竞争的性能&#xf…

指针函数与函数指针的区别

1、指针函数 1-1、定义 指针函数&#xff0c;顾名思义&#xff0c;是一个函数&#xff0c;但其返回类型是指针。这意味着当这个函数被调用时&#xff0c;它会返回一个地址值&#xff0c;这个地址值指向某个类型的数据。 1-2、特点 函数性质&#xff1a;首先&#xff0c;它是…

【2024】20个高级 Java 面试问题及答案

1&#xff1a;解释Java序列化中transient关键字的意义。 在 Java 中&#xff0c;“ transient ”关键字用于指示变量在对象序列化期间不应被序列化。当变量被标记为“transient”时&#xff0c;意味着该变量应被序列化机制忽略。 这在处理不应持久的敏感或临时数据时特别有用…

基础 - 前端知识体系详解

一、前端三要素 HTML&#xff08;结构&#xff09;&#xff1a; 超文本标记语言&#xff08;Hyper Text Markup Language&#xff09;&#xff0c;决定网页的结构和内容。CSS&#xff08;表现&#xff09;&#xff1a; 层叠样式表&#xff08;Cascading Style Sheets&#xff0…

基于飞腾平台的Hbase的安装配置

【写在前面】 飞腾开发者平台是基于飞腾自身强大的技术基础和开放能力&#xff0c;聚合行业内优秀资源而打造的。该平台覆盖了操作系统、算法、数据库、安全、平台工具、虚拟化、存储、网络、固件等多个前沿技术领域&#xff0c;包含了应用使能套件、软件仓库、软件支持、软件适…

人脸操作:从检测到识别的全景指南

人脸操作&#xff1a;从检测到识别的全景指南 在现代计算机视觉技术中&#xff0c;人脸操作是一个非常重要的领域。人脸操作不仅包括检测图像中的人脸&#xff0c;还涉及到人脸识别、表情分析、面部特征提取等任务。这些技术在各种应用中发挥着关键作用&#xff0c;从社交媒体…

Windows Server 2016 Standard 将程序加入开机自启动

分3步 1 打开“启动”文件夹&#xff1a;在Windows的搜索栏中输入“shell:startup”&#xff0c;点击搜索结果中的 “启动” 文件夹即可打开。 2 在启动文件夹中&#xff0c;右键点击空白区域&#xff0c;选择“新建”->“快捷方式”。 3 将 “程序的快捷方式” 添加到启动…

IP转地理位置:3个好用免费开源库代码及数据库对比体验详解

最近在做一个IP定位显示国家省市功能&#xff0c;在全网找了一圈&#xff0c;也每个安装体验过&#xff0c;测试他的数据库精准度。 本人是用PHP的第三方库&#xff0c;整理以下使用过的ip定位转地理位置库。 ip定位转地理位置库 1.itbdw/ip-database&#xff1a; **gihub地…

Qt 系统相关 - 网络与音视频

目录 一、Qt 网络 1. UDP Socket 1.1 核心 API 概览 1.2 回显服务器 1.3 回显客户端 2. TCP Socket 2.1 核心 API 概览 2.2 回显服务器 2.3 回显客户端 3. HTTP Client 3.1 核心 API 3.2 代码示例 二、Qt 音视频 1. Qt 音频 1.1 核心API概览 1.2 示例 2. Qt 视…