/* * L.Circle is a circle overlay (with a certain radius in meters). */ L.Circle = L.Path.extend({ initialize: function (latlng, radius, options) { L.Path.prototype.initialize.call(this, options); this._latlng = L.latLng(latlng); this._mRadius = radius; }, options: { fill: true }, setLatLng: function (latlng) { this._latlng = L.latLng(latlng); return this.redraw(); }, setRadius: function (radius) { this._mRadius = radius; return this.redraw(); }, projectLatlngs: function () { var lngRadius = this._getLngRadius(), latlng = this._latlng, pointLeft = this._map.latLngToLayerPoint([latlng.lat, latlng.lng - lngRadius]); this._point = this._map.latLngToLayerPoint(latlng); this._radius = Math.max(this._point.x - pointLeft.x, 1); }, getBounds: function () { var lngRadius = this._getLngRadius(), latRadius = (this._mRadius / 40075017) * 360, latlng = this._latlng; return new L.LatLngBounds( [latlng.lat - latRadius, latlng.lng - lngRadius], [latlng.lat + latRadius, latlng.lng + lngRadius]); }, getLatLng: function () { return this._latlng; }, getPathString: function () { var p = this._point, r = this._radius; if (this._checkIfEmpty()) { return ''; } if (L.Browser.svg) { return 'M' + p.x + ',' + (p.y - r) + 'A' + r + ',' + r + ',0,1,1,' + (p.x - 0.1) + ',' + (p.y - r) + ' z'; } else { p._round(); r = Math.round(r); return 'AL ' + p.x + ',' + p.y + ' ' + r + ',' + r + ' 0,' + (65535 * 360); } }, getRadius: function () { return this._mRadius; }, // TODO Earth hardcoded, move into projection code! _getLatRadius: function () { return (this._mRadius / 40075017) * 360; }, _getLngRadius: function () { return this._getLatRadius() / Math.cos(L.LatLng.DEG_TO_RAD * this._latlng.lat); }, _checkIfEmpty: function () { if (!this._map) { return false; } var vp = this._map._pathViewport, r = this._radius, p = this._point; return p.x - r > vp.max.x || p.y - r > vp.max.y || p.x + r < vp.min.x || p.y + r < vp.min.y; } }); L.circle = function (latlng, radius, options) { return new L.Circle(latlng, radius, options); };