openlayers6之地圖覆蓋物overlay三種常用用法(popup彈窗marker標(biāo)注text文本)
1. 寫在前面
常見的地圖覆蓋物為這三種類型,如:popup彈窗
、label標(biāo)注信息
、text文本信息
等。
上篇講了overlay的一些屬性方法事件等,這篇主要講overlay三種最常用的案例。更多可以參考上篇內(nèi)容openlayers6【八】地圖覆蓋物overlay詳解,這兩篇會(huì)有關(guān)聯(lián)。
popup彈窗
基本是經(jīng)常遇到的需求案例,所有單獨(dú)給大家講下,讓地圖更富有生命力?。?!
你需要理解:overlay 然后通過(guò)map進(jìn)行綁定,承載在頁(yè)面的 dom 上的元素
。
2. overlay 實(shí)現(xiàn)popup彈窗
2.1 vue 頁(yè)面 addPopup() 方法詳解
①:實(shí)例一個(gè)
new Overlay()
,設(shè)置相關(guān)的屬性,element 是和頁(yè)面的 最外層彈窗的dom進(jìn)行綁定
②:通過(guò)map.addOverlay(this.overlay)
把 overlay彈窗添加到頁(yè)面
③:closer.onclick
添加一個(gè) x 關(guān)閉彈窗事件
④:通過(guò)this.map.on("singleclick", function(evt)
事件點(diǎn)擊地圖觸發(fā)彈窗效果
具體代碼如下:
addPopup() { // 使用變量存儲(chǔ)彈窗所需的 DOM 對(duì)象 var container = document.getElementById("popup"); var closer = document.getElementById("popup-closer"); var content = document.getElementById("popup-content"); // 創(chuàng)建一個(gè)彈窗 Overlay 對(duì)象 this.overlay = new Overlay({ element: container, //綁定 Overlay 對(duì)象和 DOM 對(duì)象的 autoPan: true, // 定義彈出窗口在邊緣點(diǎn)擊時(shí)候可能不完整 設(shè)置自動(dòng)平移效果 autoPanAnimation: { duration: 250 //自動(dòng)平移效果的動(dòng)畫時(shí)間 9毫秒) } }); // 將彈窗添加到 map 地圖中 this.map.addOverlay(this.overlay); let _that = this; /** * 為彈窗添加一個(gè)響應(yīng)關(guān)閉的函數(shù) */ closer.onclick = function() { _that.overlay.setPosition(undefined); closer.blur(); return false; }; /** * 添加單擊map 響應(yīng)函數(shù)來(lái)處理彈窗動(dòng)作 */ this.map.on("singleclick", function(evt) { console.log(evt.coordinate); let coordinate = transform( evt.coordinate, "EPSG:3857", "EPSG:4326" ); // 點(diǎn)擊尺 (這里是尺(米),并不是經(jīng)緯度); let hdms = toStringHDMS(toLonLat(evt.coordinate)); // 轉(zhuǎn)換為經(jīng)緯度顯示 content.innerHTML = ` <p>你點(diǎn)擊了這里:</p> <p>經(jīng)緯度:<p><code> ${hdms} </code> <p> <p>坐標(biāo):</p>X:${coordinate[0]} Y: ${coordinate[1]}`; _that.overlay.setPosition(evt.coordinate); //把 overlay 顯示到指定的 x,y坐標(biāo) }); }
效果
2.2 autoPan 屬性為false效果
點(diǎn)擊了屏幕最右邊,可以看到不會(huì)根據(jù)鼠標(biāo)點(diǎn)擊位置進(jìn)行適應(yīng)地圖。
3. overlay 實(shí)現(xiàn) label標(biāo)注信息
vue 頁(yè)面
addMarker() { var marker = new Overlay({ position: fromLonLat([104.043505, 30.58165]), positioning: "center-center", element: document.getElementById("marker"), stopEvent: false }); this.map.addOverlay(marker); },
4 overlay 實(shí)現(xiàn) text文本信息
vue 頁(yè)面
addText() { var textInfo = new Overlay({ position: fromLonLat([104.043505, 30.58165]), offset: [20, -20], element: document.getElementById("textInfo") }); this.map.addOverlay(textInfo); },
5. 附上完整代碼
<template> <div id="app"> <div id="map" ref="map"></div> <div id="marker"></div> <div id="textInfo">我是text文本信息</div> <div id="popup" class="ol-popup"> <a href="#" rel="external nofollow" id="popup-closer" class="ol-popup-closer"></a> <div id="popup-content" class="popup-content"></div> </div> </div> </template> <script> import "ol/ol.css"; import { Map, View, Coordinate } from "ol"; import { toStringHDMS } from "ol/coordinate"; import TileLayer from "ol/layer/Tile"; import XYZ from "ol/source/XYZ"; import Overlay from "ol/Overlay"; import { fromLonLat, transform, toLonLat } from "ol/proj"; // 彈出窗口實(shí)現(xiàn) export default { name: "dashboard", data() { return { map: null, overlay: null }; }, methods: { initMap() { let target = "map"; //跟頁(yè)面元素的 id 綁定來(lái)進(jìn)行渲染 let tileLayer = new TileLayer({ source: new XYZ({ url: "http://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineStreetPurplishBlue/MapServer/tile/{z}/{y}/{x}" }) }); let view = new View({ // projection: "EPSG:4326", //使用這個(gè)坐標(biāo)系 center: fromLonLat([104.912777, 34.730746]), //地圖中心坐標(biāo) zoom: 4.5 //縮放級(jí)別 }); this.map = new Map({ target: target, //綁定dom元素進(jìn)行渲染 layers: [tileLayer], //配置地圖數(shù)據(jù)源 view: view //配置地圖顯示的options配置(坐標(biāo)系,中心點(diǎn),縮放級(jí)別等) }); }, /** * 第一種:點(diǎn)標(biāo)記 marker * 創(chuàng)建一個(gè)標(biāo)注信息 */ addMarker() { var marker = new Overlay({ position: fromLonLat([104.043505, 30.58165]), positioning: "center-center", element: document.getElementById("marker"), stopEvent: false }); this.map.addOverlay(marker); }, /** * 第二種:文字標(biāo)簽 label * 創(chuàng)建一個(gè)label標(biāo)注信息 */ addText() { var textInfo = new Overlay({ position: fromLonLat([104.043505, 30.58165]), offset: [20, -20], element: document.getElementById("textInfo") }); this.map.addOverlay(textInfo); }, /** * 第三種:彈窗式窗口 popup * 創(chuàng)建一個(gè)彈窗popup信息 */ addPopup() { // 使用變量存儲(chǔ)彈窗所需的 DOM 對(duì)象 var container = document.getElementById("popup"); var closer = document.getElementById("popup-closer"); var content = document.getElementById("popup-content"); // 創(chuàng)建一個(gè)彈窗 Overlay 對(duì)象 this.overlay = new Overlay({ element: container, //綁定 Overlay 對(duì)象和 DOM 對(duì)象的 autoPan: false, // 定義彈出窗口在邊緣點(diǎn)擊時(shí)候可能不完整 設(shè)置自動(dòng)平移效果 autoPanAnimation: { duration: 250 //自動(dòng)平移效果的動(dòng)畫時(shí)間 9毫秒) } }); // 將彈窗添加到 map 地圖中 this.map.addOverlay(this.overlay); let _that = this; /** * 為彈窗添加一個(gè)響應(yīng)關(guān)閉的函數(shù) */ closer.onclick = function() { _that.overlay.setPosition(undefined); closer.blur(); return false; }; /** * 添加單擊響應(yīng)函數(shù)來(lái)處理彈窗動(dòng)作 */ this.map.on("singleclick", function(evt) { console.log(evt.coordinate); let coordinate = transform( evt.coordinate, "EPSG:3857", "EPSG:4326" ); // 點(diǎn)擊尺 (這里是尺(米),并不是經(jīng)緯度); let hdms = toStringHDMS(toLonLat(evt.coordinate)); // 轉(zhuǎn)換為經(jīng)緯度顯示 content.innerHTML = ` <p>你點(diǎn)擊了這里:</p> <p>經(jīng)緯度:<p><code> ${hdms} </code> <p> <p>坐標(biāo):</p>X:${coordinate[0]} Y: ${coordinate[1]}`; _that.overlay.setPosition(evt.coordinate); //把 overlay 顯示到指定的 x,y坐標(biāo) }); } }, mounted() { this.initMap(); // 初始化彈窗方法 this.addText(); this.addMarker(); this.addPopup(); } }; </script> <style lang="scss" scoped> html, body { height: 100%; } #app { min-height: calc(100vh - 50px); width: 100%; position: relative; overflow: none; #map { height: 888px; min-height: calc(100vh - 50px); } } .ol-popup { position: absolute; background-color: white; -webkit-filter: drop-shadow(0 1px 4px rgba(0, 0, 0, 0.2)); filter: drop-shadow(0 1px 4px rgba(0, 0, 0, 0.2)); padding: 15px; border-radius: 10px; border: 1px solid #cccccc; bottom: 12px; left: -50px; } .ol-popup:after, .ol-popup:before { top: 100%; border: solid transparent; content: " "; height: 0; width: 0; position: absolute; pointer-events: none; } .ol-popup:after { border-top-color: white; border-width: 10px; left: 48px; margin-left: -10px; } .ol-popup:before { border-top-color: #cccccc; border-width: 11px; left: 48px; margin-left: -11px; } .ol-popup-closer { text-decoration: none; position: absolute; top: 2px; right: 8px; } .popup-content { width: 400px; } .ol-popup-closer:after { content: "✖"; } #marker { width: 20px; height: 20px; background: red; border-radius: 50%; } #textInfo { width: 200px; height: 40px; line-height: 40px; background: burlywood; color: yellow; text-align: center; font-size: 20px; } </style>
到此這篇關(guān)于openlayers6之地圖覆蓋物overlay三種常用用法(popup彈窗marker標(biāo)注text文本)的文章就介紹到這了,更多相關(guān)vue openlayer popup地圖覆蓋物內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue項(xiàng)目中如何封裝axios(統(tǒng)一管理http請(qǐng)求)
這篇文章主要給大家介紹了關(guān)于Vue項(xiàng)目中如何封裝axios(統(tǒng)一管理http請(qǐng)求)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05Vue實(shí)現(xiàn)星級(jí)評(píng)價(jià)效果實(shí)例詳解
這篇文章主要介紹了Vue實(shí)現(xiàn)星級(jí)評(píng)價(jià)效果的實(shí)例代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12vue-element的select下拉框賦值實(shí)例
這篇文章主要介紹了vue-element的select下拉框賦值實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03Vue.js獲取手機(jī)系統(tǒng)型號(hào)、版本、瀏覽器類型的示例代碼
這篇文章主要介紹了vue js獲取手機(jī)系統(tǒng)型號(hào)、版本、瀏覽器類型的示例代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò)具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05php+vue3實(shí)現(xiàn)點(diǎn)選驗(yàn)證碼功能
這篇文章主要介紹了php+vue3實(shí)現(xiàn)點(diǎn)選驗(yàn)證碼,本文通過(guò)實(shí)例代碼給大家介紹的詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-11-11