leaflet
Version:
JavaScript library for mobile-friendly interactive maps
72 lines (56 loc) • 2.12 kB
JavaScript
/*
* 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, options) {
L.setOptions(this, options);
this._latlng = L.latLng(latlng);
this._mRadius = this.options.radius;
},
setRadius: function (radius) {
this._mRadius = radius;
return this.redraw();
},
getRadius: function () {
return this._mRadius;
},
getBounds: function () {
var half = [this._radius, this._radiusY || this._radius];
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, options, legacyOptions) {
if (typeof options === 'number') {
// Backwards compatibility with 0.7.x factory (latlng, radius, options?)
options = L.extend({}, legacyOptions, {radius: options});
}
return new L.Circle(latlng, options);
};