UNPKG

leaflet

Version:

JavaScript library for mobile-friendly interactive maps

106 lines (87 loc) 2.63 kB
import {Path} from './Path.js'; import * as Util from '../../core/Util.js'; import {LatLng} from '../../geo/LatLng.js'; import {Bounds} from '../../geometry/Bounds.js'; /* * @class CircleMarker * @inherits Path * * A circle of a fixed size with radius specified in pixels. Extends `Path`. */ // @constructor CircleMarker(latlng: LatLng, options?: CircleMarker options) // Instantiates a circle marker object given a geographical point, and an optional options object. export class CircleMarker extends Path { static { // @section // @aka CircleMarker options this.setDefaultOptions({ fill: true, // @option radius: Number = 10 // Radius of the circle marker, in pixels radius: 10 }); } initialize(latlng, options) { Util.setOptions(this, options); this._latlng = new LatLng(latlng); this._radius = this.options.radius; } // @method setLatLng(latLng: LatLng): this // Sets the position of a circle marker to a new location. setLatLng(latlng) { const oldLatLng = this._latlng; this._latlng = new LatLng(latlng); this.redraw(); // @event move: Event // Fired when the marker is moved via [`setLatLng`](#circlemarker-setlatlng). Old and new coordinates are included in event arguments as `oldLatLng`, `latlng`. return this.fire('move', {oldLatLng, latlng: this._latlng}); } // @method getLatLng(): LatLng // Returns the current geographical position of the circle marker getLatLng() { return this._latlng; } // @method setRadius(radius: Number): this // Sets the radius of a circle marker. Units are in pixels. setRadius(radius) { this.options.radius = this._radius = radius; return this.redraw(); } // @method getRadius(): Number // Returns the current radius of the circle getRadius() { return this._radius; } setStyle(options) { const radius = options?.radius ?? this._radius; Path.prototype.setStyle.call(this, options); this.setRadius(radius); return this; } _project() { this._point = this._map.latLngToLayerPoint(this._latlng); this._updateBounds(); } _updateBounds() { const r = this._radius, r2 = this._radiusY ?? r, w = this._clickTolerance(), p = [r + w, r2 + w]; this._pxBounds = new Bounds(this._point.subtract(p), this._point.add(p)); } _update() { if (this._map) { this._updatePath(); } } _updatePath() { this._renderer._updateCircle(this); } _empty() { return this._radius && !this._renderer._bounds.intersects(this._pxBounds); } // Needed by the `Canvas` renderer for interactivity _containsPoint(p) { return p.distanceTo(this._point) <= this._radius + this._clickTolerance(); } }