OpenLayers 快速入门(四)View 对象

看过的知识不等于学会。唯有用心总结、系统记录,并通过温故知新反复实践,才能真正掌握一二
作为一名摸爬滚打三年的前端开发,开源社区给了我饭碗,我也将所学的知识体系回馈给大家,助你少走弯路!
OpenLayers、Leaflet 快速入门 ,每周保持更新 2 个案例
Cesium 快速入门,每周保持更新 4 个案例

OpenLayers 快速入门(一)Map对象
OpenLayers 快速入门(二)Layer 对象
OpenLayers 快速入门(三)Source 对象补充
OpenLayers 快速入门(四)View 对象
OpenLayers 快速入门(五)Controls 对象
OpenLayers 快速入门(六)Interaction 对象
OpenLayers 快速入门(七)矢量数据
OpenLayers 快速入门(八)事件系统
OpenLayers 快速入门(九)Extent 介绍
OpenLayers 快速入门(十)常用 API 补充

View 对象:地图视图控制中心

View 是 OpenLayers 中控制地图显示状态的核心组件,负责管理地图的中心点、缩放级别、旋转角度和坐标系等关键参数。

核心属性

属性名类型默认值描述
centerArray[0, 0]地图中心坐标(地图投影坐标系)
constrainRotationbooleantrue是否约束旋转角度为 0、90、180、270 度(默认为 false)
zoomnumberundefined仅在 resolution 未定义时使用。用于计算视图初始分辨率的缩放级别
projectionstring‘EPSG:3857’地图坐标系(如’EPSG:4326’)
minZoomnumber0最小缩放级别
maxZoomnumber28最大缩放级别
resolutionnumberundefined分辨率(替代 zoom 使用)
resolutionsArrayundefined分辨率数组(用于自定义缩放级别)
rotationnumber0旋转角度(弧度)
extentArrayundefined地图视图的边界限制([minx, miny, maxx, maxy])
constrainOnlyCenterbooleanfalse是否仅限制中心点在 extent 内(默认为限制整个视图)
constrainResolutionbooleanfalse是否将缩放操作约束为固定分辨率(整数级别)
smoothExtentConstraintbooleantrue是否平滑过渡到约束范围
enableRotationbooleantrue是否允许旋转
maxResolutionnumberundefined最大分辨率
minResolutionnumberundefined最小分辨率
zoomFactornumber2缩放因子(每次缩放的比例)
multiWorldbooleanfalse是否允许地图在世界范围外平移(WGS84 投影下通常设为 true)
// 中国区域推荐配置
const view = new View({projection: "EPSG:4326", // 使用经纬度坐标center: [116.4, 39.9], // 北京市中心zoom: 10,minZoom: 3, // 限制最小缩放maxZoom: 18, // 限制最大缩放constrainResolution: true, // 整数缩放级别multiWorld: true, // 允许超出经度-180~180范围
});

projection

  • 定义地图坐标系,EPSG:3857为 Web 墨卡托投影(默认),EPSG:4326为 WGS84 经纬度坐标系(常用)。
  • 所有图层必须使用相同投影
new View({projection: "EPSG:4326", // 使用经纬度坐标系
});
  • 经纬度 -> 墨卡托投影坐标
import { fromLonLat } from "ol/proj";new View({center: fromLonLat([116.4, 39.9]), // 将经纬度转换为EPSG:3857坐标
});
  • 墨卡托投影坐标 -> 经纬度
import { toLonLat } from "ol/proj";
const lonLat = toLonLat([1296000, 4820000]); // 将墨卡托投影坐标转换为经纬度
console.log(lonLat); // 输出经纬度坐标[11.642166082188997, 39.68311704790915]
  • transform 将坐标从源投影转换到目标投影。这会返回一个新的坐标(并且不会修改原始坐标)
import { transform } from "ol/proj";// 经纬度坐标转换为墨卡托投影坐标
var mercator = transform([116.4074, 39.9042], "EPSG:4326", "EPSG:3857");
console.log(mercator); // 输出:[12958412.492568914, 4852030.634814578]// 墨卡托投影坐标转换为经纬度坐标
var lonlat = transform([12958412.492568914, 4852030.634814578],"EPSG:3857","EPSG:4326"
);
console.log(lonlat); // 输出:[116.4074, 39.9042]

center

设置地图中心点坐标,一般使用经纬度坐标

new View({center: [116.4074, 39.9042], // 北京市中心坐标projection: "EPSG:4326", // 使用经纬度坐标系
});

zoom

设置地图缩放级别,如果设置了 resolution,则 zoom 会被忽略

new View({zoom: 10.5, // 设置缩放级别,可以为小数
});

minZoom & maxZoom

限制缩放级别范围,只影响用户交互和 API 缩放,不影响直接设置 resolution

new View({minZoom: 3,maxZoom: 18,zoom: 10,
});

rotation

视图的初始旋转角度,以弧度表示(正旋转为顺时针方向,0 表示北方)

new View({rotation: Math.PI / 4, // 旋转45度
});

extent

设置地图边界,此范围之外的内容无法在地图上显示,值为[minx, miny, maxx, maxy]

// 限制视图在北京市范围内
new View({extent: [115.4, 39.4, 117.5, 41.0],
});

resolution

直接设置分辨率,一般直接设置zoom即可,除非需要精确控制显示比例时使用

// 在EPSG:3857中,zoom0的分辨率约为156543.03392804097
new View({resolution: 78271.51696402048, // 相当于zoom1
});

核心方法

方法名描述
getCenter()获取当前视图中心坐标
setCenter(center)设置视图中心
getZoom()获取当前缩放级别(整数或小数)
setZoom(zoom)设置缩放级别(立即生效)
getRotation()获取当前旋转角度(弧度)
setRotation(rotation)设置旋转角度(弧度)
getProjection()获取当前投影对象
getResolution()获取当前分辨率
setResolution(resolution)设置分辨率(立即生效)
getResolutions()获取分辨率数组(如果设置)
getMinZoom()获取最小缩放级别
setMinZoom(zoom)设置最小缩放级别
getMaxZoom()获取最大缩放级别
setMaxZoom(zoom)设置最大缩放级别
getMinResolution()获取最小分辨率
getMaxResolution()获取最大分辨率
animate(animation)执行动画效果(移动、缩放、旋转等)
cancelAnimations()取消任何正在进行的动画
fit(geometry, options)调整视图以适配指定几何体或范围
calculateExtent(size)计算当前视图的范围(需传入地图容器尺寸[width, height])

视图控制方法

// 获取当前视图状态
const center = view.getCenter();
const zoom = view.getZoom();
const rotation = view.getRotation();// 设置视图状态(立即生效)
view.setCenter([13500000, 4500000]);
view.setZoom(8);
view.setRotation(Math.PI / 6);

animate() - 动画效果

执行平滑的视图过渡,单个动画配置对象或数组

动画配置属性

属性名类型描述
centerArray目标中心
zoomnumber目标缩放
resolutionnumber目标分辨率
rotationnumber目标旋转
durationnumber动画时长(毫秒)
easingfunction缓动函数 参考 常用 api
// 平滑移动到新位置
view.animate({center: [116.4, 39.9],zoom: 14,duration: 2000,easing: ol.easing.easeIn,
});// 链式动画:先缩放后移动
view.animate([{ zoom: 10, duration: 1500 },{ center: [121.4, 31.2], duration: 1000 },
]);

fit() - 适配显示

fit(geometryOrExtent, options)自动调整视图以完整显示指定区域

  • geometryOrExtent:适配视图的几何形状或范围

  • options:适配选项对象,包含以下属性:

选项名类型默认值描述
sizeArray地图容器尺寸用于计算适配的容器尺寸([width, height])
paddingArray[0,0,0,0]内边距([top, right, bottom, left])
minResolutionnumber0适配的最小分辨率
maxZoomnumberundefined适配的最大缩放级别
durationnumberundefined动画时长(毫秒)
easingfunctionundefined缓动函数
callbackfunctionundefined动画完成后的回调函数
<template><div ref="mapContainer" id="map"></div><div style="position: absolute; top: 10px; left: 100px; z-index: 1000"><button @click="goto">定位到polygon区域</button></div>
</template><script setup>
import { ref, onMounted } from "vue";
import Map from "ol/Map.js";
import XYZ from "ol/source/XYZ.js";
import TileLayer from "ol/layer/Tile.js";
import View from "ol/View.js";
import "ol/ol.css";
import Polygon from "ol/geom/Polygon.js";
import Style from "ol/style/Style";
import Fill from "ol/style/Fill";
import Stroke from "ol/style/Stroke";
import Vector from "ol/source/Vector.js";
import VectorLayer from "ol/layer/Vector.js";
import Feature from "ol/Feature.js";const mapContainer = ref(null);
let map = null;
let view = null;
let polygon = null;
onMounted(() => {initMap();
});
const initMap = () => {view = new View({center: [116.4, 39.9], // 北京市中心经纬度zoom: 10.5,projection: "EPSG:4326", // 默认使用球面墨卡托投影(EPSG:3857),需要设置为WGS 84(EPSG:4326)经纬度// extent: [115.4, 39.4, 117.5, 41.0],});map = new Map({target: mapContainer.value,layers: [new TileLayer({// 设置高德地图为数据源底图source: new XYZ({// 矢量图(含路网、含注记)url: "http://wprd0{1-4}.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scl=1&style=7 ",}),}),],view,});polygon = new Polygon([[[117.4, 39.9],[117.5, 39.9],[117.5, 40.0],[117.4, 40.0],[117.4, 39.9],],]);// 将polygon渲染到地图上,设置颜色为红色const feature = new Feature({geometry: polygon,});const source = new Vector({features: [feature],});const layer = new VectorLayer({source,style: new Style({fill: new Fill({color: "rgba(255, 0, 0, 0.5)", // 半透明红色填充}),stroke: new Stroke({color: "red", // 红色边框width: 2,}),}),});map.addLayer(layer);
};
const goto = () => {// 定位到polygon区域view.fit(polygon, {padding: [50, 50, 50, 50], // 四周留白duration: 3000,maxZoom: 15,});
};
</script>
<style scoped>
#map {position: absolute;top: 0;bottom: 0;width: 100%;
}
</style>

效果视频

calculateExtent()

通过传入地图容器的尺寸,计算当前视图的范围。返回值为 [minX, minY, maxX, maxY]

// 计算当前视图范围
const mapSize = map.getSize();
const currentExtent = view.calculateExtent(mapSize);
console.log(currentExtent); // 输出范围 [minX, minY, maxX, maxY]

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

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

相关文章

测试左移方法论

测试左移&#xff08;Shift-Left Testing&#xff09;​是一种软件测试方法论&#xff0c;核心思想是将测试活动从传统的开发后期&#xff08;如系统测试、验收测试阶段&#xff09;提前到软件生命周期的更早期阶段&#xff08;如需求分析、设计、编码阶段&#xff09;&#xf…

OpenCV(01)基本图像操作、绘制,读取视频

图像基础 import cv2 as cv#读取图像 cv.imread(path,读取方式)默认读为彩色图像 #cv.imread(path) cat cv.imread(E:\hqyj\code\opencv\images\\face.png)#显示图像 cv.imshow(window,img) cv.imshow(myimg,cat)print(cat) print(cat.shape) #(h,w,c) 元组(1,1) print(cat…

biji 1

1.应用层&#xff1a;为应用程序提供网络服务。2.表示层&#xff1a;定义数据的格式&#xff0c;对数据进行压缩、解压缩、加密、解密、编码、解码。3.会话层&#xff1a;对通信双方间的会话进行建立、维护、拆除-----session id---区分同一应用程序的不同进程4.传输层&#x…

mongodb的备份和还原(精简)

1 官网下载对应版本msi2 运行msi mongodb-database-tools-windows-x86_64-100.12.2.msi3 将安装地址加到环境变量 C:\Program Files\MongoDB\Tools\100\bin4 查看version mongodump --version mongorestore --version5 运行 备份命令 mongodump --host 127.0.0.1 --db dbname--…

Mac安装Typescript报错

目录 Mac上安装Typescript报错: 原因分析 1. 默认 npm 全局安装目录的权限问题 2. Node.js 的安装方式 如何解决?(无需每次用 `sudo`) 方法 1:修改 npm 全局目录的权限(推荐) 方法 2:配置 npm 使用用户级目录 方法 3:使用 `nvm` 管理 Node.js(最推荐) 为什么建议避免…

spring-cloud概述

单体架构 把业务的所有功能实现都打包在一个war包或者jar包&#xff0c;这种方式就成为单体架构。 比如Spring课程中的博客系统,前端后端数据库实现&#xff0c;都在一个项目中&#xff0c;这种架构就称为单体架构. 举个例子&#xff1a; 比如在电商系统中&#xff0c;我们…

android ROOM kotlin官方文档完全学习

android ROOM kotlin官方文档完全学习2.6 使用 Room 将数据保存到本地数据库 | Android Developers (google.cn) 一、简介 1.1 引入 dependencies {def room_version "2.6.1"implementation "androidx.room:room-runtime:$room_version"//如下三选一a…

DOM编程全解析:操作、事件与存储实战指南

引言&#xff1a;DOM——JavaScript与网页交互的桥梁 DOM&#xff08;文档对象模型&#xff09; 是JavaScript操作HTML/XML文档的接口&#xff0c;它将网页文档抽象为一个树形结构&#xff0c;允许开发者通过API动态修改文档的内容、结构和样式。无论是实现动态交互&#xff0…

Ansible命令

Ansible命令 ansible 常用命令 /usr/bin/ansible   #Ansibe AD-Hoc 临时命令执行工具&#xff0c;常用于临时命令的执行 /usr/bin/ansible-doc    #Ansible 模块功能查看工具 /usr/bin/ansible-galaxy   #下载/上传优秀代码或Roles模块 的官网平台&#xff0c;基于网…

SY6974芯片添加enable充电控制节点

1. 需求描述项目背景&#xff1a;基于 Qualcomm MDM9x07 平台的 4G MIFI 产品&#xff0c;使用 Silergy 公司的 SY6974 充电 IC需求内容&#xff1a; 在环境 /sys/class/power_supply/sy6794/enable 下增加一个 sysfs 节点&#xff0c;用于控制是否允许充电&#xff1a;cat /sy…

趣玩-Ollama-Llm-Chatrbot

软件说明 这个软件本人是从零开始实现的聊天机器人。基于Ollama&#xff08;PythonApi &#xff09; Pyside&#xff0c;实现了聊天机器的基本功能&#xff0c;还有一些个性化的功能比如模型管理&#xff0c;敏感词过滤&#xff0c;个性化主题设置&#xff0c;头像设置等功能。…

在mac 上zsh 如何安装最新的 go 工具

文章目录方法一&#xff1a;使用 Homebrew&#xff08;推荐&#xff09;方法二&#xff1a;从官网下载安装包方法三&#xff1a;使用 g&#xff08;Go 版本管理器&#xff09;方法四&#xff1a;使用 gvm&#xff08;Go Version Manager&#xff09;验证安装和配置常用 Go 工具…

(十九)深入了解 AVFoundation-编辑:使用 AVMutableVideoComposition 实现视频加水印与图层合成(上)——理论篇

一、引言在短视频、Vlog、剪辑工具日益流行的今天&#xff0c;给视频添加 Logo、水印、时间戳或动态贴纸&#xff0c;已经成为非常常见的功能需求。这类效果看似简单&#xff0c;其实背后都涉及到“图层合成”的处理&#xff1a;如何将一个静态或动态的图层&#xff08;如文字、…

Android NDK与JNI深度解析

核心概念定义&#xff1a;NDK (Native Development Kit): 是什么&#xff1a; 一套由 Google 提供的工具集合。目的&#xff1a; 允许 Android 开发者使用 C 和 C 等原生&#xff08;Native&#xff09;语言来实现应用程序的部分功能。包含内容&#xff1a; 交叉编译器&#xf…

Golang各版本特性

1. Go各版本特性 | FeelingLife 2. https://chatgpt.com/share/68808f58-ae5c-800a-8153-5358098f301b 3.https://tonybai.com/2024/11/14/go-map-use-swiss-table/

HTML 转 Word API 接口

HTML 转 Word API 接口 支持网页转 Word&#xff0c;高效转换为 Word&#xff0c;提供永久链接。 1. 产品功能 超高性能转换效率&#xff1b;支持将传递的 HTML 转换为 Word&#xff0c;支持 HTML 中的 CSS 格式在 Word 文档中的呈现&#xff1b;支持传递网站的 URL&#xff…

Lucid Search: 极简、隐私友好的问答式搜索引擎技术解析

Lucid Search: 极简、隐私友好的问答式搜索引擎技术解析 产品定位与价值主张 Lucid Search 是一款革命性的问答式搜索引擎&#xff0c;其核心价值在于&#xff1a; 极简体验&#xff1a;无账户、无广告、前端完全静态隐私保护&#xff1a;不写入 Cookie、不记录 IP、无追踪即…

卷积神经网络:模型评估标准

一、分类模型评价指标在模型评估中&#xff0c;有多个标准用于衡量模型的性能&#xff0c;这些标准包括准确率&#xff08;Accuracy&#xff09;、精确率&#xff08;Precision&#xff09;、召回率&#xff08;Recall&#xff09;、F1 分数&#xff08;F1-Score&#xff09;等…

【前端工程化】前端开发中想做好发布管理可以从哪些方面着手?

在企业级后台系统中&#xff0c;发布管理是整个开发流程的最终环节&#xff0c;也是最为关键的一环。它不仅涉及代码构建完成后的部署操作&#xff0c;还包括版本控制、灰度发布、回滚机制等保障系统稳定性的措施。 本文主要围绕发布流程设计、版本控制、部署方式、灰度策略和回…

替分布式=成本下降50% !

在数字化转型的浪潮中&#xff0c;数据库作为医疗信息系统的“心脏”&#xff0c;其稳定性与效率直接关乎医疗服务的质量。2024年10月30日&#xff0c;绵阳市第三人民医院集成平台的CDR数据库成功从分布式数据库Citus切换为国产集中式数据库KingbaseES&#xff0c;并稳定运行至…