原文链接及内容
点击地图得到一个弹出窗口。这个弹出窗口由几个基本元素组成:一个容器、一个关闭按钮和一个放置内容的位置。为了将弹出窗口锚定在地图上,我们用弹出窗口容器创建了一个ol/Overlay
。为地图的click
事件注册一个侦听器以显示弹出窗口,将另一个侦听器设置为close
按钮的click
处理程序以隐藏弹出窗口。
main.js
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 import Map from 'ol/Map.js' ;import Overlay from 'ol/Overlay.js' ;import TileLayer from 'ol/layer/Tile.js' ;import View from 'ol/View.js' ;import XYZ from 'ol/source/XYZ.js' ;import {toLonLat} from 'ol/proj.js' ;import {toStringHDMS} from 'ol/coordinate.js' ;const container = document .getElementById ('popup' );const content = document .getElementById ('popup-content' );const closer = document .getElementById ('popup-closer' );const overlay = new Overlay ({ element : container, autoPan : { animation : { duration : 250 , }, }, }); closer.onclick = function ( ) { overlay.setPosition (undefined ); closer.blur (); return false ; }; const key = 'Get your own API key at https://www.maptiler.com/cloud/' ;const attributions = '<a href="https://www.maptiler.com/copyright/" target="_blank">© MapTiler</a> ' + '<a href="https://www.openstreetmap.org/copyright" target="_blank">© OpenStreetMap contributors</a>' ; const map = new Map ({ layers : [ new TileLayer ({ source : new XYZ ({ attributions : attributions, url : 'https://api.maptiler.com/maps/streets/{z}/{x}/{y}.png?key=' + key, tileSize : 512 , }), }), ], overlays : [overlay], target : 'map' , view : new View ({ center : [0 , 0 ], zoom : 2 , }), }); map.on ('singleclick' , function (evt ) { const coordinate = evt.coordinate ; const hdms = toStringHDMS (toLonLat (coordinate)); content.innerHTML = '<p>You clicked here:</p><code>' + hdms + '</code>' ; overlay.setPosition (coordinate); });
界面布局文件index.html
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <title > Popup</title > <link rel ="stylesheet" href ="node_modules/ol/ol.css" > <style > .map { width : 100% ; height : 400px ; } .ol-popup { position : absolute; background-color : white; box-shadow : 0 1px 4px rgba (0 ,0 ,0 ,0.2 ); padding : 15px ; border-radius : 10px ; border : 1px solid #cccccc ; bottom : 12px ; left : -50px ; min-width : 280px ; } .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 ; } .ol-popup-closer :after { content : "✖" ; } </style > </head > <body > <div id ="map" class ="map" > </div > <div id ="popup" class ="ol-popup" > <a href ="#" id ="popup-closer" class ="ol-popup-closer" > </a > <div id ="popup-content" > </div > </div > <script src ="https://cdn.jsdelivr.net/npm/elm-pep@1.0.6/dist/elm-pep.js" > </script > <script type ="module" src ="main.js" > </script > </body > </html >