原文链接及内容
 

有了ol/Layer和render函数,我们就可以使用交互式svg作为图层。将鼠标悬停在国家/地区上,可以看到通过css :hover伪类定义的交互性样式。
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
   | import Layer from 'ol/layer/Layer.js'; import Map from 'ol/Map.js'; import View from 'ol/View.js'; import {composeCssTransform} from 'ol/transform.js';
  const map = new Map({   target: 'map',   view: new View({     center: [0, 0],     extent: [-180, -90, 180, 90],     projection: 'EPSG:4326',     zoom: 2,   }), });
  const svgContainer = document.createElement('div'); const xhr = new XMLHttpRequest(); xhr.open('GET', 'data/world.svg'); xhr.addEventListener('load', function () {   const svg = xhr.responseXML.documentElement;   svgContainer.ownerDocument.importNode(svg);   svgContainer.appendChild(svg); }); xhr.send();
  const width = 2560; const height = 1280; const svgResolution = 360 / width; svgContainer.style.width = width + 'px'; svgContainer.style.height = height + 'px'; svgContainer.style.transformOrigin = 'top left'; svgContainer.className = 'svg-layer';
  map.addLayer(   new Layer({     render: function (frameState) {       const scale = svgResolution / frameState.viewState.resolution;       const center = frameState.viewState.center;       const size = frameState.size;       const cssTransform = composeCssTransform(         size[0] / 2,         size[1] / 2,         scale,         scale,         frameState.viewState.rotation,         -center[0] / svgResolution - width / 2,         center[1] / svgResolution - height / 2       );       svgContainer.style.transform = cssTransform;       svgContainer.style.opacity = this.getOpacity();       return svgContainer;     },   }) );
   | 
 
界面布局文件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
   | <!DOCTYPE html> <html lang="en">   <head>     <meta charset="UTF-8">     <title>SVG Layer</title>     <link rel="stylesheet" href="node_modules/ol/ol.css">     <style>       .map {         width: 100%;         height: 400px;       }       #map {         background: black;       }
        .svg-layer path:hover {         opacity: 0.4;       }     </style>   </head>   <body>     <div id="map" class="map"></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>
   |