openlayers中一些问题的解决方案

news2024/9/25 17:17:04

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

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.width
            let h = img.height
            canvas.width = w
            canvas.height = h
            let 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;
          // 获取点击元素的feature
          if (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);

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

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

相关文章

父母血型与子女血型对照表

人类的血型是有遗传性的&#xff0c;父母的血型直接影响孩子的血型&#xff0c;我们可以根据父母血型推测孩子血型&#xff0c;排除不可能血型&#xff0c;那么下面就由血型分析为大家揭晓下父母血型与孩子血型对照表&#xff08;排除基因突变&#xff09; 血型遗传规律表又称血…

IMS注册流程中的基本路由寻址过程

目录 1. SIP 协议栈在 TCP/IP 中的位置 2. 看看 SIP 协议栈各层的寻址功能 本课程,以 IMS 注册流程为例,讲解 IP 网络网元是如何完成 IP 层寻址的 第一跳:UE->P-CSCF 第二跳:P-CSCF->DNS 第三跳:P-CSCF->I-CSCF 第四跳:I-CSCF->HSS 第五跳:I-CSCF-&…

深入解析Debian与Ubuntu:技术特点与用户使用指南

深入解析Debian与Ubuntu&#xff1a;技术特点与用户使用指南 引言 Debian和Ubuntu作为两大知名的Linux发行版&#xff0c;不仅在历史和理念上有所不同&#xff0c;在技术特点和用户使用方法上也各具特色。本文将深入解析它们的技术特点&#xff0c;并提供用户使用指南&#x…

SSM+Vue大学生社团管理系统

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 spring-mybatis.xml3.5 spring-mvc.xml3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质创作…

东华大学《2020年+2022年824自动控制原理真题》 (完整版)

本文内容&#xff0c;全部选自自动化考研联盟的&#xff1a;《25届东华大学824自控考研资料》的真题篇。后续会持续更新更多学校&#xff0c;更多年份的真题&#xff0c;记得关注哦~ 目录 2020年真题 2022年真题 Part1&#xff1a;2020年2022年完整版真题 2020年真题 2022年…

惊艳桌面时钟软件 为你的桌面打造专属时间管理!

在快节奏的现代生活中&#xff0c;时间是最宝贵的资源之一。无论是在工作还是生活中&#xff0c;我们都需要时刻关注时间&#xff0c;在桌面显示一个时钟&#xff0c;可以让你更方便的掌握时间。芝麻时钟 &#xff08;下载地址&#xff1a;https://clock.zhimasoft.cn/?bili&a…

Jmeter——参数化的9种方法

jmeter工具无论做接口测试还是性能测试&#xff0c;参数化都是一个必须掌握且非常有用的知识点。参数化的使用场景: 1&#xff09;多个请求都是同一个ip地址&#xff0c;若服务器地址更换了&#xff0c;则脚本需要更改每个请求的ip 2&#xff09;注册账号&#xff0c;不允许账…

【图形学】数学基础

行矩阵和列矩阵 在图形处理中&#xff0c;矩阵操作时最基本的操作&#xff0c;但是不同的系统中对矩阵的存储是不同&#xff0c;比如OpenGL和Cg中就是不一样的&#xff1a; 比如一个4x4矩阵 [m11,m12,m13,m14m21,m22,m23,m24m31,m32,m33,m34m41,m42,m43,m44]在实现中通常将其…

海康威视网络摄像头校时、修改分辨率等操作汇总!

目录 操作环境&#xff1a; 操作原因&#xff1a; 解决办法&#xff1a; 手动校准时间&#xff0c;随着时间推移&#xff0c;可能再次出现偏差&#xff0c;操作简单&#xff1a; 【IVMS-4200】对设备批量校时操作指导&#xff1a;操作之前先把本地服务器的时间改对&#x…

【学习笔记】Kylin-Desktop-V10-SP1 麒麟系统知识2——账户设置

提示&#xff1a;学习麒麟Kylin-Desktop-V10-SP1系统账户设置相关知识&#xff0c;包含用户名修改、用户密码修改、账户类型修改、开机自动登录、免密登录、添加用户、删除用户&#xff0c;以及修改登录选项相关知识 一、前期准备 成功安装麒麟系统&#xff08;本次实验的安装…

视频压缩成文件怎么弄?4招教会你

视频文件过大&#xff0c;不仅占用存储空间&#xff0c;还影响传输效率。但是&#xff0c;压缩视频时又担心会损失画质。有没有一种方法&#xff0c;能在不牺牲画质的前提下&#xff0c;实现视频文件的压缩呢&#xff1f;答案是肯定的。 想快速学会怎么视频压缩不改变清晰度&a…

手机二要素接口如何用C#实现调用

一、什么是手机二要素&#xff1f; 手机二要素又称运营商二要素&#xff0c;运营商二要素核验&#xff0c;实名核验&#xff0c;手机号核验&#xff0c;手机二要素核验&#xff0c;即传入姓名、手机号码&#xff0c;校验此两项是否一致。实时核验&#xff0c;返回校验结果&…

不在同一局域网怎么远程桌面?非局域网环境下,实现远程桌面访问的5个方法分享!

非局域网环境下&#xff0c;怎么远程桌面&#xff1f;还能做到吗&#xff1f; 在企业管理中&#xff0c;远程桌面访问已成为提高工作效率、实现跨地域协同工作的关键工具。 然而&#xff0c;当被控端与控制端不在同一局域网时&#xff0c;如何实现远程桌面连接成为了许多企业…

ROS学习笔记(二):鱼香ROS — 超便捷的一键安装/配置/换源指令(Ubuntu/ROS/ROS2/IDE等)

文章目录 前言鱼香ROS1 一键安装&#xff1a;快速搭建开发环境2 具体使用2.1 如何开始&#xff1f;2.2 我的常用配置方案2.3 安装示例 3 总结相关链接 前言 关于Ubuntu与ROS的常规安装&#xff0c;可以看这几篇。 SLAM实操入门&#xff08;一&#xff09;&#xff1a;在已有…

特种作业管理系统 —— 企业安全与效率的卓越保障

在当今复杂多变的工业生产和作业环境中&#xff0c;安全与效率是企业发展的两大核心关键。我们深知您在特种作业管理方面面临着诸多挑战&#xff0c;如作业流程的规范性、证件的有效管理以及设备的安全运行等。今天&#xff0c;我们为您带来一款专门解决这些问题的创新产品——…

如何解决项目申报过程中文件管理混乱问题?

在项目申报的复杂流程中&#xff0c;文件管理是一项至关重要的环节。它直接关系到项目信息的完整性、安全性和可访问性。然而&#xff0c;传统的文件管理方式往往面临诸多痛点&#xff0c;如资料分散、权限混乱、版本冲突等。 文件管理痛点 资料分散难管理&#xff1a;在项目…

2024年【黑龙江省安全员C证】报名考试及黑龙江省安全员C证免费试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 黑龙江省安全员C证报名考试考前必练&#xff01;安全生产模拟考试一点通每个月更新黑龙江省安全员C证免费试题题目及答案&#xff01;多做几遍&#xff0c;其实通过黑龙江省安全员C证模拟考试很简单。 1、【多选题】《…

如何搭建测试平台?理清思路很重要

01 测试平台 01 职责 一个健康的测试平台体系&#xff0c;对测试人员的职责分工、协作模式会有不同的要求。 测试平台核心的职责是完成高质量的交付已满足业务需求。测试活动包括单元测试、集成测试、接口测试、性能测试等&#xff0c;都是通过这些测试手段&#xff0c;协同…

22k star,最强开源堡垒机,强推

最开始接触jumpserver已经是五年前了&#xff0c;最近又发布了最新的v3版本&#xff0c;迫不及待的就去体验了一波&#xff0c;真心不错&#xff0c;增加很多新的功能&#xff0c;操作真的丝滑&#xff0c;比起公司采购的上个世纪的堡垒机真心好用多了。 1 jumpserver简介 ju…

【linux进程】深度理解进程--什么是进程什么是pcb进程创建

目录 前言一&#xff0c;对PCB的理解二&#xff0c;CPU对进程列表的处理三&#xff0c;进程标识符:pid1. 查看系统进程1: ps axj2. 查看系统进程2: /proc 四&#xff0c;系统调用函数:getpid五&#xff0c;父进程和子进程的概念六&#xff0c;创建子进程--fork函数的使用1. 创建…