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 74 75
| import GeoJSON from 'ol/format/GeoJSON.js'; import Map from 'ol/Map.js'; import VectorLayer from 'ol/layer/Vector.js'; import VectorSource from 'ol/source/Vector.js'; import View from 'ol/View.js'; import {Fill, Stroke, Style} from 'ol/style.js'; import {getBottomLeft, getHeight, getWidth} from 'ol/extent.js'; import {toContext} from 'ol/render.js';
const fill = new Fill(); const stroke = new Stroke({ color: 'rgba(255,255,255,0.8)', width: 2, }); const style = new Style({ renderer: function (pixelCoordinates, state) { const context = state.context; const geometry = state.geometry.clone(); geometry.setCoordinates(pixelCoordinates); const extent = geometry.getExtent(); const width = getWidth(extent); const height = getHeight(extent); const flag = state.feature.get('flag'); if (!flag || height < 1 || width < 1) { return; }
context.save(); const renderContext = toContext(context, { pixelRatio: 1, }); renderContext.setFillStrokeStyle(fill, stroke); renderContext.drawGeometry(geometry); context.clip();
const bottomLeft = getBottomLeft(extent); const left = bottomLeft[0]; const bottom = bottomLeft[1]; context.drawImage(flag, left, bottom, width, height); context.restore(); }, });
const vectorLayer = new VectorLayer({ source: new VectorSource({ url: 'https://openlayersbook.github.io/openlayers_book_samples/assets/data/countries.geojson', format: new GeoJSON(), }), style: style, });
vectorLayer.getSource().on('addfeature', function (event) { const feature = event.feature; const img = new Image(); img.onload = function () { feature.set('flag', img); }; img.src = 'https://flagcdn.com/w320/' + feature.get('iso_a2').toLowerCase() + '.png'; });
new Map({ layers: [vectorLayer], target: 'map', view: new View({ center: [0, 0], zoom: 1, }), });
|