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

源码分析之Openlayers中的Zoom缩放控件

概述

放大或缩小是地图中最基本的功能,本文主要介绍分析 Openlayers 中Zoom缩放控件的源码实现。

源码分析

Zoom控件继承Control类,关于Control类,可以参考这篇文章源码分析之Openlayers中的控件篇Control基类介绍

如果直接实例化Zoom类,页面上显示的是 Openlayers 中原生的样式,无论是控件的标签页还是样式,我们都可以通过传参进行定制。本文只讨论默认情况,不传参的情况。

源码如下:

class Zoom extends Control {constructor(options) {options = options ? options : {};super({element: document.createElement("div"),target: options.target,});const className =options.className !== undefined ? options.className : "ol-zoom";const delta = options.delta !== undefined ? options.delta : 1;const zoomInClassName =options.zoomInClassName !== undefined? options.zoomInClassName: className + "-in";const zoomOutClassName =options.zoomOutClassName !== undefined? options.zoomOutClassName: className + "-out";const zoomInLabel =options.zoomInLabel !== undefined ? options.zoomInLabel : "+";const zoomOutLabel =options.zoomOutLabel !== undefined ? options.zoomOutLabel : "\u2013";const zoomInTipLabel =options.zoomInTipLabel !== undefined ? options.zoomInTipLabel : "Zoom in";const zoomOutTipLabel =options.zoomOutTipLabel !== undefined? options.zoomOutTipLabel: "Zoom out";const inElement = document.createElement("button");inElement.className = zoomInClassName;inElement.setAttribute("type", "button");inElement.title = zoomInTipLabel;inElement.appendChild(typeof zoomInLabel === "string"? document.createTextNode(zoomInLabel): zoomInLabel);inElement.addEventListener(EventType.CLICK,this.handleClick_.bind(this, delta),false);const outElement = document.createElement("button");outElement.className = zoomOutClassName;outElement.setAttribute("type", "button");outElement.title = zoomOutTipLabel;outElement.appendChild(typeof zoomOutLabel === "string"? document.createTextNode(zoomOutLabel): zoomOutLabel);outElement.addEventListener(EventType.CLICK,this.handleClick_.bind(this, -delta),false);const cssClasses =className + " " + CLASS_UNSELECTABLE + " " + CLASS_CONTROL;const element = this.element;element.className = cssClasses;element.appendChild(inElement);element.appendChild(outElement);this.duration_ = options.duration !== undefined ? options.duration : 250;}handleClick_(delta, event) {event.preventDefault();this.zoomByDelta_(delta);}zoomByDelta_(delta) {}
}

Zoom控件参数

Zoom类中的构造函数接受一个参数options,若它为空或者不传,则 Openlayers 将采用默认样式。options对象可以有如下属性:

  • className:Zoom类名,默认为ol-zoom
  • delta:缩放地图的变化量,默认为1
  • zoomInClassName:放大控件的类名,默认为ol-zoom-in
  • zoomOutClassName:缩小控件的类名,默认为ol-zoom-out
  • zoomInLabel:放大控件图标,默认为+
  • zoomOutLabel:缩小控件图标,默认为\u2013(即-
  • zoomInTipLabel:放大控件hover时的提示,默认为Zoom in
  • zoomOutTipLabel:缩小控件hover时的提示,默认为Zoom out

Zoom类构造函数

Zoom类的构造函数除了根据参数options定义上述变量外,还调用super({element:document.createElement('div'),target:options.target})elementtarget传给父类Control,默认情况下options.targetundefined,因此这个传值就是设置了this.element=document.createElement('div');然后就是创建放大和缩小控件的DOM元素,设置属性,并将它们插入到this.element。期间还会注册放大按钮和缩小按钮的两个事件,事件名为handleClick,不同的是delta传参不同。最后设置了this.duration_,若参数options中定义了duration属性和值,则赋给this.duration_,否则默认为250,表示是250 毫秒

Zoom类方法介绍

Zoom类中定义了两个方法handleClick_zoomByDelta_handleClick_就是后者的一个调用,核心方法就是zoomByDelta_

  • zoomByDelta_方法

zoomByDelta方法如下

zoomByDelta_(delta) {const map = this.getMap();const view = map.getView();if (!view) {return;}const currentZoom = view.getZoom();if (currentZoom !== undefined) {const newZoom = view.getConstrainedZoom(currentZoom + delta); //返回被限制的级别,不超出范围if (this.duration_ > 0) {if (view.getAnimating()) { // 若有动画正在进行,则取消动画view.cancelAnimations();}view.animate({zoom: newZoom,duration: this.duration_,easing: easeOut,});} else {view.setZoom(newZoom);}}
}

在上面代码中this.getMap()实际上就是调用父类ControlgetMap方法中,在Map类中实例化时,会遍历this.controls,调用setMap方法;或者在const map=new Map(...)后,用map.addControl添加控件时,会触发this.controls.addEventListener(CollectionEventType.ADD,(event) => {event.element.setMap(this);},);同样地会设置setMap,因此Zoom缩放控件被点击时触发zoomByDelta_,调用this.getMap是可以取到map对象,然后通过map.getView获取当前视图view,继而获取当前地图的级别currentZoom,进行边界判断,然后放大调用view.animate,缩小调用view.setZoom

总结

本文主要介绍了Openlayers中Zoom缩放控件的源码实现,讲解了缩放的核心知识。

相关文章:

源码分析之Openlayers中的Zoom缩放控件

概述 放大或缩小是地图中最基本的功能,本文主要介绍分析 Openlayers 中Zoom缩放控件的源码实现。 源码分析 Zoom控件继承Control类,关于Control类,可以参考这篇文章源码分析之Openlayers中的控件篇Control基类介绍 如果直接实例化Zoom类&…...

k8s的ConfigMap是什么, 为什么设计ConfigMap, 如何使用ConfigMap

ConfigMap简介, 为什么设计ConfigMap 在k8s中, ConfigMap是一种API对象, 用于将非机密的配置数据存储到键值对中。 Configmap作用是, 把配置数据从应用代码中分隔开, 让镜像和配置文件解耦,实现了镜像的可移植性。 举例: 我有一个Squid(正向代理)的Pod…...

fiddler设置抓取https,还抓取不到https如何解决?

一、清楚 C:\Users\Admin\AppData\Roaming\Microsoft\Crypto\RSA 目录下所有文件(首次安装fiddler请忽略) 二、清除电脑上的根证书,WINR快捷键,输入:certmgr.msc, 然后回车,查找所有fiddler证书…...

Python高性能web框架-FastApi教程:(1)创建一个简单的FastApi

(1)创建一个简单的FastApi 1. 导入必要的库 from fastapi import FastAPI import uvicornFastAPI 是一个用于构建现代、快速(高性能)的Web API的Python框架。uvicorn 是一个ASGI服务器,用于运行异步的Python Web应用…...

Django基础之模板

一.前言 前面我们讲了视图,我们今天来讲一下模板,模板其实也就是视图中render返回的html进行的渲染,然后展示到浏览器页面上去,那我们今天就来和大家来说一下模板的基本用法 二.寻找html模板 这个也就是我们前面说了的找html&a…...

RabbitMQ Work Queues (工作队列模式) 使用案例

Hi~!这里是奋斗的明志,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 🌱🌱个人主页:奋斗的明志 🌱🌱所属专栏:RabbitMQ 📚本系列文章为个人学…...

C#高级:Winform桌面开发中TreeView的基础例子

一、方案一&#xff1a;免递归使用树 namespace WinFormsApp1 {public partial class Form1 : Form{public Form1(){InitializeComponent();}/// <summary>/// 自定义树实体/// </summary>public class WinFormTree{/// <summary>/// 标签名称/// </summ…...

大模型的文件有哪些?

在大模型仓库&#xff08;如Hugging Face&#xff09;中&#xff0c;例如&#xff1a;https://modelscope.cn/models/ZhipuAI/glm-4-9b-chat/files&#xff0c;通常会发现以下几类文件&#xff1a; 模型权重文件&#xff1a;存储训练好的模型参数&#xff0c;是模型推理和微调…...

QT 国际化(翻译)

QT国际化&#xff08;Internationalization&#xff0c;简称I18N&#xff09;是指将一个软件应用程序的界面、文本、日期、数字等元素转化为不同的语言和文化习惯的过程。这使得软件能够在不同的国家和地区使用&#xff0c;并且可以根据用户的语言和地区提供本地化的使用体验。…...

C 进阶 — 指针的使用

C 进阶 — 指针的使用 主要内容 1、字符指针 2、数组指针 3、指针数组 4、数组传参和指针传参 5、函数指针 6、函数指针数组 7、指向函数指针数组的指针 8、 回调函数 9、指针和数组练习题 前节回顾 1、指针就是个变量&#xff0c;用来存放地址&#xff0c;地址唯一…...

【经验分享】容器云运维的知识点

最近忙于备考没关注&#xff0c;有次点进某小黄鱼发现首页出现了我的笔记还被人收费了 虽然我也卖了一些资源&#xff0c;但我以交流、交换为主&#xff0c;笔记都是免费给别人看的 由于当时刚刚接触写的并不成熟&#xff0c;为了避免更多人花没必要的钱&#xff0c;所以决定公…...

MFC学习笔记专栏开篇语

MFC&#xff0c;是一个英文简写&#xff0c;全称为 Microsoft Foundation Class Library&#xff0c;中文翻译为微软基础类库。它是微软开发的一套C类库&#xff0c;是面向对象的函数库。 微软开发它&#xff0c;是为了给程序员提供方便&#xff0c;减少程序员的工作量。如果没…...

电子科技大学《高级算法设计与分析》期末复习问题汇总(客观题-选择题、判断题)

电子科技大学《高级算法设计与分析》问题汇总_已知背包问题的动态规划算法时间复杂度为o(nw),其中n为物品数目,w为背包容量。请-CSDN博客 转载自上面这个链接&#xff0c;古希腊掌管成电专业课的神&#xff01;&#xff01;为了防止他的链接失效&#xff0c;自己也转存一份 &…...

GPTcelltype——scRNA-seq注释

#安装包 install.packages("openai") remotes::install_github("Winnie09/GPTCelltype") #填写API Sys.setenv(OPENAI_API_KEY your_openai_API_key) #加载包 #Load packages library(GPTCelltype) library(openai) #准备文件 #Assume you have already r…...

AI与大数据的深度结合:驱动决策的革命性力量

引言&#xff1a;数字时代的决策挑战 在这个信息爆炸的数字时代&#xff0c;数据早已渗透到我们生活的方方面面。全球每天产生的数据量呈指数级增长&#xff0c;无论是用户的消费行为、设备的运行状态&#xff0c;还是社会热点的实时动态&#xff0c;这些信息的规模和复杂性前所…...

Java多线程与线程池技术详解(九)

面对苦难的态度&#xff1a;《病隙碎笔》“不断的苦难才是不断地需要信心的原因&#xff0c;这是信心的原则&#xff0c;不可稍有更动。” 孤独与心灵的成长&#xff1a;《我与地坛》“孤独的心必是充盈的心&#xff0c;充盈得要流溢出来要冲涌出去&#xff0c;便渴望有人呼应他…...

【常考前端面试题总结】---2025

React fiber架构 1.为什么会出现 React fiber 架构? React 15 Stack Reconciler 是通过递归更新子组件 。由于递归执行&#xff0c;所以更新一旦开始&#xff0c;中途就无法中断。当层级很深时&#xff0c;递归更新时间超过了 16ms&#xff0c;用户交互就会卡顿。对于特别庞…...

什么是大语言模型(LLM)

1. 什么是大语言模型&#xff08;LLM&#xff09;&#xff1f; LLM 是一种基础模型&#xff08;Foundation Model&#xff09;的实例。 基础模型的特点&#xff1a; 使用大量未标注的自监督数据进行预训练。通过学习数据中的模式&#xff0c;生成具有普适性和可适应性的输出…...

柚坛工具箱Uotan Toolbox适配鸿蒙,刷机体验再升级

想要探索智能设备的无限可能&#xff1f;Uotan Toolbox&#xff08;柚坛工具箱&#xff09;将是您的得力助手。这款采用C#语言打造的创新型开源工具箱&#xff0c;以其独特的设计理念和全面的功能支持&#xff0c;正在改变着用户与移动设备互动的方式。 作为一款面向专业用户的…...

supervisor使用详解

参考文章&#xff1a; Supervisor使用详解 Supervisor 是一个用 Python 编写的客户端/服务器系统&#xff0c;它允许用户在类 UNIX 操作系统&#xff08;如 Linux&#xff09;上监控和控制进程。Supervisor 并不是一个分布式调度框架&#xff0c;而是一个进程管理工具&#x…...

ENSP实验避坑指南:搭建园区网时,VLAN间通信、MSTP负载分担、VRRP主备切换这些细节你配对了吗?

ENSP园区网实战排错手册&#xff1a;从VLAN间通信到VRRP主备切换的深度解析 刚完成ENSP园区网搭建实验的网络工程师小王盯着屏幕&#xff0c;眉头紧锁——所有配置明明都按照教程一步步操作&#xff0c;可VLAN间的PC就是无法互通&#xff0c;MSTP负载分担也没生效。这种"…...

GD32F303外部中断实战:从按键消抖到中断优先级配置,一个例程全搞定

GD32F303外部中断实战&#xff1a;从按键消抖到中断优先级配置 第一次接触嵌入式开发时&#xff0c;最让我困惑的就是中断系统。记得当时用按键控制LED&#xff0c;明明代码逻辑没问题&#xff0c;LED却总是莫名其妙地闪烁。后来才发现是按键抖动导致多次触发中断。今天我们就以…...

如何高效使用COMET翻译评估工具:专业用户实战指南

如何高效使用COMET翻译评估工具&#xff1a;专业用户实战指南 【免费下载链接】COMET A Neural Framework for MT Evaluation 项目地址: https://gitcode.com/gh_mirrors/com/COMET 在机器翻译快速发展的今天&#xff0c;你如何准确评估翻译质量&#xff1f;传统的人工…...

在Taotoken模型广场中根据任务与预算选择合适的AI模型

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 在Taotoken模型广场中根据任务与预算选择合适的AI模型 当你准备将大模型能力集成到自己的应用或工作流中时&#xff0c;面对市场上…...

免费开源AMD Ryzen调试工具:SMUDebugTool完全指南与实用教程

免费开源AMD Ryzen调试工具&#xff1a;SMUDebugTool完全指南与实用教程 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: http…...

Kafka压测实战:用JMeter精准诊断消息延迟与Lag根因

1. 为什么Kafka压测不能只靠“发消息看延迟”——JMeter不是万能胶&#xff0c;但它是唯一能说清真相的尺子很多人第一次给Kafka做负载测试&#xff0c;就是写个Python脚本&#xff0c;用confluent-kafka库往topic里狂塞10万条消息&#xff0c;然后看ProducerRecord的callback耗…...

多模态大模型落地实战:对齐、融合与生成的工程化拆解

1. 这不是“多模态大模型”的科普文&#xff0c;而是一份实操者手记“Understanding Multimodal LLMs: The Next Evolution of AI”——这个标题乍看像学术综述的副标题&#xff0c;但在我过去三年深度参与7个跨模态AI落地项目&#xff08;从工业质检图像-文本联合推理&#xf…...

如何高效使用B站视频下载工具:DownKyi专业用户的全面技巧指南

如何高效使用B站视频下载工具&#xff1a;DownKyi专业用户的全面技巧指南 【免费下载链接】downkyi 哔哩下载姬downkyi&#xff0c;哔哩哔哩网站视频下载工具&#xff0c;支持批量下载&#xff0c;支持8K、HDR、杜比视界&#xff0c;提供工具箱&#xff08;音视频提取、去水印等…...

不跨界,现有的地盘就会被别人用跨界的方式蚕食掉

微软这么多员工养着&#xff0c;有时也不得不多个行业发展&#xff0c;就像是美团一样&#xff0c;不得不电商也做起来和京东抢生意。阿里也同时多个行业做着&#xff0c;影视&#xff0c;外卖&#xff0c;生鲜。否则纯电商做不下去就完了。就像是华为一样本来可以卖AI服务器&a…...

别再硬编码IP了!用LabVIEW类+队列实现仪器参数动态管理(附网口类实战代码)

告别硬编码&#xff1a;LabVIEW面向对象编程在仪器参数管理中的实战应用 在工业自动化和测试测量领域&#xff0c;工程师们经常面临一个共同的挑战&#xff1a;如何高效管理各类仪器的配置参数。传统开发方式中&#xff0c;IP地址、端口号等关键参数往往直接硬编码在程序里&…...