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 76 77 78 79 80 81 82 83
| import Feature from 'ol/Feature.js'; import Map from 'ol/Map.js'; import OSM from 'ol/source/OSM.js'; import Point from 'ol/geom/Point.js'; import TileLayer from 'ol/layer/Tile.js'; import VectorLayer from 'ol/layer/Vector.js'; import VectorSource from 'ol/source/Vector.js'; import View from 'ol/View.js'; import {Fill, RegularShape, Stroke, Style} from 'ol/style.js'; import {fromLonLat} from 'ol/proj.js';
const shaft = new RegularShape({ points: 2, radius: 5, stroke: new Stroke({ width: 2, color: 'black', }), rotateWithView: true, });
const head = new RegularShape({ points: 3, radius: 5, fill: new Fill({ color: 'black', }), rotateWithView: true, });
const styles = [new Style({image: shaft}), new Style({image: head})];
const source = new VectorSource({ attributions: 'Weather data by <a href="https://openweathermap.org/current">OpenWeather</a>', });
const map = new Map({ layers: [ new TileLayer({ source: new OSM(), }), new VectorLayer({ source: source, style: function (feature) { const wind = feature.get('wind'); const angle = ((wind.deg - 180) * Math.PI) / 180; const scale = wind.speed / 10; shaft.setScale([1, scale]); shaft.setRotation(angle); head.setDisplacement([ 0, head.getRadius() / 2 + shaft.getRadius() * scale, ]); head.setRotation(angle); return styles; }, }), ], target: 'map', view: new View({ center: [0, 0], zoom: 2, }), });
fetch('data/openweather/weather.json') .then(function (response) { return response.json(); }) .then(function (data) { const features = []; data.list.forEach(function (report) { const feature = new Feature( new Point(fromLonLat([report.coord.lon, report.coord.lat])) ); feature.setProperties(report); features.push(feature); }); source.addFeatures(features); map.getView().fit(source.getExtent()); });
|