From 3393de3c5460e0a9411bbcff4d363905b280be3f Mon Sep 17 00:00:00 2001 From: changqing Date: Tue, 15 Dec 2020 15:38:48 +0800 Subject: [PATCH] Custom circle render example --- examples/custom-circle-render.html | 9 ++++ examples/custom-circle-render.js | 66 ++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 examples/custom-circle-render.html create mode 100644 examples/custom-circle-render.js diff --git a/examples/custom-circle-render.html b/examples/custom-circle-render.html new file mode 100644 index 0000000000..f0ed7ad7c0 --- /dev/null +++ b/examples/custom-circle-render.html @@ -0,0 +1,9 @@ +--- +layout: example.html +title: Custom Circle Render +shortdesc: Example of a custom circle render. +docs: > + This example demonstrates the use of 'ol/style/Style' render option function to render circle feature. +tags: "circle, feature, vector, render, custom" +--- +
diff --git a/examples/custom-circle-render.js b/examples/custom-circle-render.js new file mode 100644 index 0000000000..57c7bf4026 --- /dev/null +++ b/examples/custom-circle-render.js @@ -0,0 +1,66 @@ +import Feature from '../src/ol/Feature.js'; +import Map from '../src/ol/Map.js'; +import View from '../src/ol/View.js'; +import {Circle} from '../src/ol/geom.js'; +import {OSM, Vector as VectorSource} from '../src/ol/source.js'; +import {Style} from '../src/ol/style.js'; +import {Tile as TileLayer, Vector as VectorLayer} from '../src/ol/layer.js'; + +const circleFeature = new Feature({ + geometry: new Circle([12127398.797692968, 4063894.123105166], 50), +}); +circleFeature.setStyle( + new Style({ + renderer(coordinate, state) { + // eslint-disable-next-line no-console + console.log('This circle is rendered by the code below.', Date.now()); + const [x, y, x1, y1] = coordinate; + const ctx = state.context; + const dx = x1 - x; + const dy = y1 - y; + const radius = Math.sqrt(dx * dx + dy * dy); + + const innerRadius = 0; + const outerRadius = radius * 1.4; + + const gradient = ctx.createRadialGradient( + x, + y, + innerRadius, + x, + y, + outerRadius + ); + gradient.addColorStop(0, 'rgba(255,0,0,0)'); + gradient.addColorStop(0.6, 'rgba(255,0,0,0.2)'); + gradient.addColorStop(1, 'rgba(255,0,0,0.8)'); + ctx.beginPath(); + ctx.arc(x, y, radius, 0, 2 * Math.PI, true); + ctx.fillStyle = gradient; + ctx.fill(); + + ctx.arc(x, y, radius, 0, 2 * Math.PI, true); + ctx.strokeStyle = 'rgba(255,0,0,1)'; + ctx.stroke(); + }, + }) +); + +new Map({ + layers: [ + new TileLayer({ + source: new OSM(), + visible: true, + }), + new VectorLayer({ + source: new VectorSource({ + features: [circleFeature], + }), + }), + ], + target: 'map', + view: new View({ + center: [12127398.797692968, 4063894.123105166], + zoom: 19, + }), +});