1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | 1 6 6 6 1 1 12 12 12 12 1 1 12 12 12 1 1 | /* * 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(), latlng2 = new L.LatLng(this._latlng.lat, this._latlng.lng - lngRadius), point2 = this._map.latLngToLayerPoint(latlng2); this._point = this._map.latLngToLayerPoint(this._latlng); this._radius = Math.max(Math.round(this._point.x - point2.x), 1); }, getBounds: function () { var lngRadius = this._getLngRadius(), latRadius = (this._mRadius / 40075017) * 360, latlng = this._latlng, sw = new L.LatLng(latlng.lat - latRadius, latlng.lng - lngRadius), ne = new L.LatLng(latlng.lat + latRadius, latlng.lng + lngRadius); return new L.LatLngBounds(sw, ne); }, getLatLng: function () { return this._latlng; }, getPathString: function () { var p = this._point, r = this._radius; Iif (this._checkIfEmpty()) { return ''; } Eif (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 () { Iif (!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); }; |