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
英文地址,請注明出處:http://en.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;并穩定運行至…