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 然后通過map進(jìn)行綁定,承載在頁面的 dom 上的元素。
2. overlay 實(shí)現(xiàn)popup彈窗
2.1 vue 頁面 addPopup() 方法詳解
①:實(shí)例一個(gè)
new Overlay(),設(shè)置相關(guān)的屬性,element 是和頁面的 最外層彈窗的dom進(jìn)行綁定
②:通過map.addOverlay(this.overlay)把 overlay彈窗添加到頁面
③:closer.onclick添加一個(gè) x 關(guān)閉彈窗事件
④:通過this.map.on("singleclick", function(evt)事件點(diǎn)擊地圖觸發(fā)彈窗效果
具體代碼如下:
addPopup() {
// 使用變量存儲(chǔ)彈窗所需的 DOM 對象
var container = document.getElementById("popup");
var closer = document.getElementById("popup-closer");
var content = document.getElementById("popup-content");
// 創(chuàng)建一個(gè)彈窗 Overlay 對象
this.overlay = new Overlay({
element: container, //綁定 Overlay 對象和 DOM 對象的
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ù)來處理彈窗動(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 頁面
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 頁面
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"; //跟頁面元素的 id 綁定來進(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 //縮放級別
});
this.map = new Map({
target: target, //綁定dom元素進(jìn)行渲染
layers: [tileLayer], //配置地圖數(shù)據(jù)源
view: view //配置地圖顯示的options配置(坐標(biāo)系,中心點(diǎn),縮放級別等)
});
},
/**
* 第一種:點(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 對象
var container = document.getElementById("popup");
var closer = document.getElementById("popup-closer");
var content = document.getElementById("popup-content");
// 創(chuàng)建一個(gè)彈窗 Overlay 對象
this.overlay = new Overlay({
element: container, //綁定 Overlay 對象和 DOM 對象的
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ù)來處理彈窗動(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue-video-player 斷點(diǎn)續(xù)播的實(shí)現(xiàn)
這篇文章主要介紹了vue-video-player 斷點(diǎn)續(xù)播的實(shí)現(xiàn),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02
vue + canvas實(shí)現(xiàn)涂鴉面板的示例代碼
這篇文章主要給大家介紹了vue + canvas實(shí)現(xiàn)涂鴉面板的示例,文章通過代碼示例介紹的非常詳細(xì),感興趣的小伙伴跟著小編一起來看看吧2023-08-08
vue3?使用setup語法糖實(shí)現(xiàn)分類管理功能
這篇文章主要介紹了vue3?使用setup語法糖實(shí)現(xiàn)分類管理,本次模塊使用 vue3+element-plus 實(shí)現(xiàn)一個(gè)新聞?wù)镜暮笈_(tái)分類管理模塊,其中新增、編輯采用對話框方式公用一個(gè)表單,需要的朋友可以參考下2022-08-08
vue開發(fā)樹形結(jié)構(gòu)組件(組件遞歸)
這篇文章主要為大家詳細(xì)介紹了vue開發(fā)樹形結(jié)構(gòu)組件的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
解決Vue使用swiper動(dòng)態(tài)加載數(shù)據(jù),動(dòng)態(tài)輪播數(shù)據(jù)顯示白屏的問題
今天小編就為大家分享一篇解決Vue使用swiper動(dòng)態(tài)加載數(shù)據(jù),動(dòng)態(tài)輪播數(shù)據(jù)顯示白屏的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-09-09
淺談Vue網(wǎng)絡(luò)請求之interceptors實(shí)際應(yīng)用
這篇文章主要介紹了淺談Vue網(wǎng)絡(luò)請求之interceptors實(shí)際應(yīng)用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-02-02

