diff --git a/src/layer/vector/Circle.js b/src/layer/vector/Circle.js index be1c6776..9bfd8998 100644 --- a/src/layer/vector/Circle.js +++ b/src/layer/vector/Circle.js @@ -32,26 +32,31 @@ L.Circle = L.CircleMarker.extend({ _project: function () { - var rad = Math.PI / 180, - lng = this._latlng.lng, + var lng = this._latlng.lng, lat = this._latlng.lat, map = this._map, + crs = map.options.crs; - latR = (this._mRadius / L.CRS.Earth.R) / rad, - top = map.project([lat + latR, lng]), - bottom = map.project([lat - latR, lng]), - p = top.add(bottom).divideBy(2), - lat2 = map.unproject(p).lat, + 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; - lngR = Math.acos((Math.cos(latR * rad) - Math.sin(lat * rad) * Math.sin(lat2 * rad)) / - (Math.cos(lat * rad) * Math.cos(lat2 * rad))) / rad || 0, - left = map.project([lat2, lng - lngR]), - r = p.x - left.x, - ry = p.y - top.y; + 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); - this._point = p.subtract(map.getPixelOrigin()); - this._radius = r ? Math.max(Math.round(r), 1) : 0; - this._radiusY = Math.max(Math.round(ry), 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(); }