/* * L.Circle is a circle overlay (with a certain radius in meters). * It's an approximation and starts to diverge from a real circle closer to poles (due to projection distortion) */ L.Circle = L.CircleMarker.extend({ initialize: function (latlng, radius, options) { L.setOptions(this, options); this._latlng = L.latLng(latlng); this._mRadius = radius; }, setRadius: function (radius) { this._mRadius = radius; return this.redraw(); }, getRadius: function () { return this._mRadius; }, getBounds: function () { var half = [this._radius, this._radiusY]; return new L.LatLngBounds( this._map.layerPointToLatLng(this._point.subtract(half)), this._map.layerPointToLatLng(this._point.add(half))); }, setStyle: L.Path.prototype.setStyle, _project: function () { var lng = this._latlng.lng, lat = this._latlng.lat, map = this._map, crs = map.options.crs; if (crs.distance === L.CRS.Earth.distance) { var d = Math.PI / 180, latR = (this._mRadius / L.CRS.Earth.R) / d, top = map.project([lat + latR, lng]), bottom = map.project([lat - latR, lng]), p = top.add(bottom).divideBy(2), lat2 = map.unproject(p).lat, lngR = Math.acos((Math.cos(latR * d) - Math.sin(lat * d) * Math.sin(lat2 * d)) / (Math.cos(lat * d) * Math.cos(lat2 * d))) / d; this._point = p.subtract(map.getPixelOrigin()); this._radius = isNaN(lngR) ? 0 : Math.max(Math.round(p.x - map.project([lat2, lng - lngR]).x), 1); this._radiusY = Math.max(Math.round(p.y - top.y), 1); } else { var latlng2 = crs.unproject(crs.project(this._latlng).subtract([this._mRadius, 0])); this._point = map.latLngToLayerPoint(this._latlng); this._radius = this._point.x - map.latLngToLayerPoint(latlng2).x; } this._updateBounds(); } }); L.circle = function (latlng, radius, options) { return new L.Circle(latlng, radius, options); };