原文链接及内容

有了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>
|