OpenLayers:视图变换的方法

一、什么是视图变换?

视图变换就是指视图的 extent(范围)、center(中心点)、zoom(缩放级别)、 resolution(分辨率)、rotation(旋转角)等参数发生变化从而导致地图展示范围改变的情况。

在OpenLayers中能够实现视图变换的方法有不少,但是在实际开发中我们主要还是推荐使用view的animate()fit()方法,这两个方法功能强大可以实现许多特殊的视图变换效果,在下面的章节中我将着重介绍这两个方法。

二、animate方法

view.animate()方法的作用是以平滑的动画来实现视图的缩放级别、中心点、旋转角度等属性的变换。简单来说animate()能够实现飞行动画或者叫视图动画,它能够实现动态的效果,提升用户的交互体验。

1.参数介绍

animate()方法主要有两个参数 动画对象(们) 和 回调函数。

动画对象

动画对象中定义了一个动画的相关配置,animate()方法可以接收多个动画对象,从而将多个动画连接起来,形成一个系列动画。

例如,先缩放再平移:

view.animate({zoom: 10}, {center: [0, 0]});

回调函数

如果你提供一个函数作为animate()方法的最后一个参数,它将在系列动画的末尾被调用。如果系列动画执行完成则返回true,动画被取消则返回false

view.animate({duration: 2000,zoom: initialZoom.value,center: initialCenter.value,},// 回调函数isFinish => {console.log(isFinish);console.log("视角飞行完成");});

动画的取消

动画可以通过用户交互(例如拖动地图)或调用view.setCenter()view.setResolution()view.setRotation()(或调用这些方法中的任何一个的其他方法)来取消。

2.动画对象中的属性

animate()方法的动画对象中有着如下的属性:

名称

说明

center

动画结束时视图的中心点坐标,如[116,23]。

zoom

动画结束时视图的缩放级别。这优先于分辨率

resolution

动画结束时视图的分辨率。如果还提供缩放(zoom ),则此选项将被忽略。

rotation

动画结束时视图的旋转角度。

anchor

在旋转或分辨率动画期间保持固定的可选锚点坐标,如[116,23]。

duration

动画的持续时间(以毫秒为单位)。

easing

在动画过程中使用的缓动函数(默认为inAndOut 先加速后减速)。该函数会在动画的每一帧被调用,并接收一个表示动画持续时间的比例值作为参数。函数应该返回一个0到1之间的数字,表示当前动画进度相对于目标状态的完成程度。

它们大致可以分为两类:

  • 视图参数centerzoomresolutionrotation,用于设置视图该如何变化。
  • 动画参数anchordurationeasing,用于设置视图动画的内容。

下面我将对其中几个重点的参数做一下介绍。

anchor 锚点

锚点就是旋转动画和分辨率动画的中心点,通过下面这个旋转动画示例应该可以很明显的看出锚点的作用:

我写了一个围绕锚点旋转180°的功能

const anchor = [113.00864859159968, 23.735462919857348];function rotate() {const view = window.map.getView();const currentRotation = view.getRotation();view.animate({duration: 3000,rotation: currentRotation + Math.PI,anchor,});
}

如果没有设置锚点,则会围绕中心点旋转。

easing 缓动函数

缓动函数在动画中十分的重要,它定义了动画在持续时间内是如何进行。像 CSS 动画中也有设置缓动函数的属性:

在Opnelayers中给animate()方法设置缓动函数 ( easing属性 ) , 可以使用OpenLayers中封装好的缓动函数(ol/easing)或者自定义。这里我肯定推荐使用OpenLayers内置的缓动函数,因为自定义一个缓动函数需要有一定的数学基础比较困难。

OpenLayers中内置的缓动函数如下:

函数

介绍

easeIn

缓慢开始然后逐渐加速

easeOut

快速开始然后逐渐减速

inAndOut

缓慢开始,然后加速,最后再减速

linear

保持固定速度

upAndDown

与 inAndOut 相似 ,但最终的减速过程会延迟。

三、fit方法

fit()方法的作用是将视图匹配到一个范围或几何图形,让指定的几何图形或范围完整地显示在地图视窗内。

1.参数介绍

fit()方法的参数也有两个:匹配目标配置项

匹配目标可以是一个范围也可以是一个几何图形。

// 匹配一个范围
view.fit([minx , miny , maxx , maxy])// 匹配一个几何图形
view.fit(new Point([116,23]))

配置项中的属性如下:

名称

描述

size

用于适配该范围的矩形框的像素尺寸。默认值为与该视图相关联的地图的大小。如果没有地图与该视图相连,或者有多个地图与该视图相连,则需提供所需的矩形框尺寸(例如 map.getSize() 所获取的尺寸)。

padding

视图的内边距(以像素为单位)。属性是一个数组 [上内边距 , 有内边距 , 左内边距 , 右内边距]

nearest

如果视图的 constrainResolution 选项为 true,则获取最接近的范围,而不是实际能恰好适配该视图的最接近范围。

minResolution

我们缩放到的最小分辨率。

maxZoom

我们缩放到的最大缩放级别。如果已经设置了minResolution,该属性将会被忽略。

duration

animate()方法。

easing

animate()方法。

callback

animate()方法。

在下面的例子中我实现了一个定位到锚点图形的功能:

function flyToGeometry() {// 获取锚点的几何图形const anchorGeometry = getLayer(window.map, {layerId: "vector-test",})[0].getSource().getFeatureById("anchor").getGeometry();window.map.getView().fit(anchorGeometry, {duration: 3000,minResolution: 0.000002682209014892578,});
}

参考资料

  1. OpenLayers v10.5.0 API - Class: View
  2. OpenLayers v10.5.0 API - Module: ol/easing

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

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

相关文章

数字孪生火星探测车,星际探索可视化

运用图扑构建数字孪生火星探测车,高精度还原外观与内部构造。实时映射探测车在火星表面的移动、探测作业及设备状态,助力科研人员远程监测、分析数据,为火星探索任务提供可视化决策支持。

【NLP 66、实践 ⑰ 基于Agent + Prompt Engineering文章阅读】

你用什么擦干我的眼泪 莎士比亚全集 工业纸巾 还是你同样泛红的眼睛 —— 4.19 一、⭐【核心函数】定义大模型调用函数 call_large_model prompt:用户传入的提示词(如 “请分析这篇作文的主题”),指导模型执行任务 client&…

黑马Java基础笔记-1

JVM,JDK和JRE JDK是java的开发环境 JVM虚拟机:Java程序运行的地方 核心类库:Java已经写好的东西,我们可以直接用。 System.out.print中的这些方法就是核心库中的所包含的 开发工具: javac(编译工具)、java&…

PR第一课

目录 1.新建 2.PR内部设置 3.导入素材 4.关于素材窗口 5.关于编辑窗口 6.序列的创建 7.视频、图片、音乐 7.1 带有透明通道的素材 8.导出作品 8.1 打开方法 8.2 导出时,需要修改的参数 1.新建 2.PR内部设置 随意点开 编辑->首选项 中的任意内容&a…

Xcode16 调整 Provisioning Profiles 目录导致证书查不到

cronet demo 使用的 ninja 打包,查找 Provisioning Profiles 路径是 ~/Library/MobileDevice/Provisioning Profiles,但 Xcode16 把该路径改为了 ~/Library/Developer/Xcode/UserData/Provisioning Profiles,导致在编译 cronet 的demo 时找不…

【更新完毕】2025华中杯C题数学建模网络挑战赛思路代码文章教学数学建模思路:就业状态分析与预测

完整内容请看文末最后的推广群 先展示文章和代码、再给出四个问题详细的模型 基于多模型下的就业状态研究 摘要 随着全球经济一体化和信息技术的迅猛发展,失业问题和就业市场的匹配性问题愈加突出。为了解决这一问题,本文提出了一种基于统计学习和机器学…

[HOT 100] 1964. 找出到每个位置为止最长的有效障碍赛跑路线

文章目录 1. 题目链接2. 题目描述3. 题目示例4. 解题思路5. 题解代码6. 复杂度分析 1. 题目链接 1964. 找出到每个位置为止最长的有效障碍赛跑路线 - 力扣(LeetCode) 2. 题目描述 你打算构建一些障碍赛跑路线。给你一个 下标从 0 开始 的整数数组 obst…

2025年KBS SCI1区TOP:增强天鹰算法EBAO,深度解析+性能实测

目录 1.摘要2.天鹰算法AO原理3.改进策略4.结果展示5.参考文献6.代码获取 1.摘要 本文提出了增强二进制天鹰算法(EBAO),针对无线传感器网络(WSNs)中的入侵检测系统(IDSs)。由于WSNs的特点是规模…

JavaScript数据类型简介

在JavaScript中,理解不同的数据类型是掌握这门语言的基础。数据类型决定了变量可以存储什么样的值以及这些值能够执行的操作。JavaScript支持多种数据类型,每种都有其特定的用途和特点。本文将详细介绍JavaScript中的主要数据类型,并提供一些…

性能比拼: Elixir vs Go(第二轮)

本内容是对知名性能评测博主 Anton Putra Elixir vs Go (Golang) Performance Benchmark (Round 2) 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准 这是第二轮关于 Elixir 和 Go 的对比测试。我收到了一份来自 Elixir 创作者的 Pull Request ,并且我认为…

接口自动化 ——fixture allure

一.参数化实现数据驱动 上一篇介绍了参数化,这篇 说说用参数化实现数据驱动。在有很多测试用例的时候,可以将测试用例都存储在文件里,进行读写调用。本篇主要介绍 csv 文件和 json 文件。 1.读取 csv 文件数据 首先创建 csv 文件&#xff…

`peft`(Parameter-Efficient Fine-Tuning:高效微调)是什么

peft(Parameter-Efficient Fine-Tuning:高效微调)是什么 peft库是Hugging Face推出的用于高效参数微调的库,它能在不调整模型全部参数的情况下,以较少的可训练参数对预训练模型进行微调,从而显著降低计算资源需求和微调成本。以下从核心功能、优势、常见微调方法、使用场…

编程常见错误归类

上一篇讲了调试&#xff0c;今天通过一个举例回忆一下上一篇内容吧&#xff01; 1. 回顾&#xff1a;调试举例 在VS2022、X86、Debug的环境下&#xff0c;编译器不做任何优化的话&#xff0c;下⾯代码执⾏的结果是啥&#xff1f; #include <stdio.h> int main() {int …

在windows上交叉编译opencv供RK3588使用

环境 NDK r27、RK3588 安卓板子、Android 12 步骤操作要点1. NDK 下载选择 r27 版本&#xff0c;解压到无空格路径&#xff08;如 C:/ndk&#xff09;2. 环境变量配置添加 ANDROID_NDK_ROOT 和工具链路径到系统 PATH3. CMake 参数调整指定 ANDROID_NATIVE_API_LEVEL31、ANDRO…

浅析MySQL事务锁

在 MySQL 中,事务锁是用于确保数据一致性和并发控制的重要机制。事务锁可以帮助防止多个事务同时修改同一数据,从而避免数据不一致和脏读、不可重复读、幻读等问题。 以下是 MySQL 事务锁的关键点总结: 事务锁:用于确保数据一致性和并发控制。锁的类型: 行级锁:InnoDB,粒…

vue3 文件下载(excel/rar/zip)

安装axios npm install axios 在项目中引入 import axios from axios; 1、get接口excel文件下载 const file_key ref() const downLoadExcel (value:any) > {//file_key.value value axios({method: "get",url: "/api/da/download_excel/",//url:…

RT-Thread RTThread studio 初使用

RT-Thread Studio 下载 https://www.rt-thread.org/studio.html 安装使用 https://bbs.elecfans.com/jishu_2425653_1_1.html 4 编译问题解决 问题一&#xff1a;error: unknown type name clock_t 具体的类型值是在sys/_types.h中定义的&#xff0c;需要包含sys/_types.h 这个…

汉诺塔专题:P1760 通天之汉诺塔 题解 + Problem D: 汉诺塔 题解

1. P1760 通天之汉诺塔 题解 题目背景 直达通天路小A历险记第四篇 题目描述 在你的帮助下&#xff0c;小 A 成功收集到了宝贵的数据&#xff0c;他终于来到了传说中连接通天路的通天山。但是这距离通天路仍然有一段距离&#xff0c;但是小 A 突然发现他没有地图&#xff0…

探索 HumanoidBench:类人机器人学习的新平台

在科技飞速发展的当下&#xff0c;类人机器人逐渐走进我们的视野&#xff0c;它们有着和人类相似的外形&#xff0c;看起来能像人类一样在各种环境里完成复杂任务&#xff0c;潜力巨大。但实际上&#xff0c;让类人机器人真正发挥出实力&#xff0c;还面临着重重挑战。 这篇文…

数据结构中的宝藏秘籍之广义表

广义表&#xff0c;也被称作列表&#xff08;Lists&#xff09;&#xff0c;是一种递归的数据结构。它就像一个神秘的盒子&#xff0c;既可以装着单个元素&#xff08;原子&#xff09;&#xff0c;也可以嵌套着其他的盒子&#xff08;子列表&#xff09;。比如广义表 (a (b c)…