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..974c8ffdda --- /dev/null +++ b/examples/custom-circle-render.js @@ -0,0 +1,64 @@ +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(coordinates, state) { + const [[x, y], [x1, y1]] = coordinates; + 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, + }), +}); diff --git a/src/ol/render/canvas/Builder.js b/src/ol/render/canvas/Builder.js index 1b710a74a9..215917d532 100644 --- a/src/ol/render/canvas/Builder.js +++ b/src/ol/render/canvas/Builder.js @@ -303,7 +303,10 @@ class CanvasBuilder extends VectorContext { renderer, inflateCoordinatesArray, ]); - } else if (type == GeometryType.LINE_STRING) { + } else if ( + type == GeometryType.LINE_STRING || + type == GeometryType.CIRCLE + ) { flatCoordinates = geometry.getFlatCoordinates(); builderEnd = this.appendFlatLineCoordinates( flatCoordinates,