remove LatLng coords wrapping/clamping, add explicit LatLng wrap method
This commit is contained in:
parent
b9d0d60a04
commit
f5cfab73a1
@ -2,7 +2,7 @@
|
|||||||
L.LatLng represents a geographical point with latitude and longitude coordinates.
|
L.LatLng represents a geographical point with latitude and longitude coordinates.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
L.LatLng = function (rawLat, rawLng, noWrap) { // (Number, Number[, Boolean])
|
L.LatLng = function (rawLat, rawLng) { // (Number, Number)
|
||||||
var lat = parseFloat(rawLat),
|
var lat = parseFloat(rawLat),
|
||||||
lng = parseFloat(rawLng);
|
lng = parseFloat(rawLng);
|
||||||
|
|
||||||
@ -10,11 +10,6 @@ L.LatLng = function (rawLat, rawLng, noWrap) { // (Number, Number[, Boolean])
|
|||||||
throw new Error('Invalid LatLng object: (' + rawLat + ', ' + rawLng + ')');
|
throw new Error('Invalid LatLng object: (' + rawLat + ', ' + rawLng + ')');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (noWrap !== true) {
|
|
||||||
lat = Math.max(Math.min(lat, 90), -90); // clamp latitude into -90..90
|
|
||||||
lng = (lng + 180) % 360 + ((lng < -180 || lng === 180) ? 180 : -180); // wrap longitude into -180..180
|
|
||||||
}
|
|
||||||
|
|
||||||
this.lat = lat;
|
this.lat = lat;
|
||||||
this.lng = lng;
|
this.lng = lng;
|
||||||
};
|
};
|
||||||
@ -31,17 +26,21 @@ L.LatLng.prototype = {
|
|||||||
|
|
||||||
obj = L.latLng(obj);
|
obj = L.latLng(obj);
|
||||||
|
|
||||||
var margin = Math.max(Math.abs(this.lat - obj.lat), Math.abs(this.lng - obj.lng));
|
var margin = Math.max(
|
||||||
|
Math.abs(this.lat - obj.lat),
|
||||||
|
Math.abs(this.lng - obj.lng));
|
||||||
|
|
||||||
return margin <= L.LatLng.MAX_MARGIN;
|
return margin <= L.LatLng.MAX_MARGIN;
|
||||||
},
|
},
|
||||||
|
|
||||||
toString: function (precision) { // -> String
|
toString: function (precision) { // (Number) -> String
|
||||||
return 'LatLng(' +
|
return 'LatLng(' +
|
||||||
L.Util.formatNum(this.lat, precision) + ', ' +
|
L.Util.formatNum(this.lat, precision) + ', ' +
|
||||||
L.Util.formatNum(this.lng, precision) + ')';
|
L.Util.formatNum(this.lng, precision) + ')';
|
||||||
},
|
},
|
||||||
|
|
||||||
// Haversine distance formula, see http://en.wikipedia.org/wiki/Haversine_formula
|
// Haversine distance formula, see http://en.wikipedia.org/wiki/Haversine_formula
|
||||||
|
// TODO move to projection code, LatLng shouldn't know about Earth
|
||||||
distanceTo: function (other) { // (LatLng) -> Number
|
distanceTo: function (other) { // (LatLng) -> Number
|
||||||
other = L.latLng(other);
|
other = L.latLng(other);
|
||||||
|
|
||||||
@ -57,10 +56,21 @@ L.LatLng.prototype = {
|
|||||||
var a = sin1 * sin1 + sin2 * sin2 * Math.cos(lat1) * Math.cos(lat2);
|
var a = sin1 * sin1 + sin2 * sin2 * Math.cos(lat1) * Math.cos(lat2);
|
||||||
|
|
||||||
return R * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
|
return R * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
|
||||||
|
},
|
||||||
|
|
||||||
|
wrap: function (a, b) { // (Number, Number) -> LatLng
|
||||||
|
var lng = this.lng;
|
||||||
|
|
||||||
|
a = a || -180;
|
||||||
|
b = b || 180;
|
||||||
|
|
||||||
|
lng = (lng + b) % (b - a) + (lng < a || lng === b ? b : a);
|
||||||
|
|
||||||
|
return new L.LatLng(this.lat, lng);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
L.latLng = function (a, b, c) { // (LatLng) or ([Number, Number]) or (Number, Number, Boolean)
|
L.latLng = function (a, b) { // (LatLng) or ([Number, Number]) or (Number, Number)
|
||||||
if (a instanceof L.LatLng) {
|
if (a instanceof L.LatLng) {
|
||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
@ -70,6 +80,6 @@ L.latLng = function (a, b, c) { // (LatLng) or ([Number, Number]) or (Number, Nu
|
|||||||
if (isNaN(a)) {
|
if (isNaN(a)) {
|
||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
return new L.LatLng(a, b, c);
|
return new L.LatLng(a, b);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -23,8 +23,8 @@ L.LatLngBounds = L.Class.extend({
|
|||||||
|
|
||||||
if (obj instanceof L.LatLng) {
|
if (obj instanceof L.LatLng) {
|
||||||
if (!this._southWest && !this._northEast) {
|
if (!this._southWest && !this._northEast) {
|
||||||
this._southWest = new L.LatLng(obj.lat, obj.lng, true);
|
this._southWest = new L.LatLng(obj.lat, obj.lng);
|
||||||
this._northEast = new L.LatLng(obj.lat, obj.lng, true);
|
this._northEast = new L.LatLng(obj.lat, obj.lng);
|
||||||
} else {
|
} else {
|
||||||
this._southWest.lat = Math.min(obj.lat, this._southWest.lat);
|
this._southWest.lat = Math.min(obj.lat, this._southWest.lat);
|
||||||
this._southWest.lng = Math.min(obj.lng, this._southWest.lng);
|
this._southWest.lng = Math.min(obj.lng, this._southWest.lng);
|
||||||
@ -66,11 +66,11 @@ L.LatLngBounds = L.Class.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
getNorthWest: function () {
|
getNorthWest: function () {
|
||||||
return new L.LatLng(this._northEast.lat, this._southWest.lng, true);
|
return new L.LatLng(this._northEast.lat, this._southWest.lng);
|
||||||
},
|
},
|
||||||
|
|
||||||
getSouthEast: function () {
|
getSouthEast: function () {
|
||||||
return new L.LatLng(this._southWest.lat, this._northEast.lng, true);
|
return new L.LatLng(this._southWest.lat, this._northEast.lng);
|
||||||
},
|
},
|
||||||
|
|
||||||
contains: function (obj) { // (LatLngBounds) or (LatLng) -> Boolean
|
contains: function (obj) { // (LatLngBounds) or (LatLng) -> Boolean
|
||||||
|
@ -5,6 +5,6 @@ L.Projection.LonLat = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
unproject: function (point) {
|
unproject: function (point) {
|
||||||
return new L.LatLng(point.y, point.x, true);
|
return new L.LatLng(point.y, point.x);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -47,6 +47,6 @@ L.Projection.Mercator = {
|
|||||||
phi += dphi;
|
phi += dphi;
|
||||||
}
|
}
|
||||||
|
|
||||||
return new L.LatLng(phi * d, lng, true);
|
return new L.LatLng(phi * d, lng);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -19,7 +19,6 @@ L.Projection.SphericalMercator = {
|
|||||||
lng = point.x * d,
|
lng = point.x * d,
|
||||||
lat = (2 * Math.atan(Math.exp(point.y)) - (Math.PI / 2)) * d;
|
lat = (2 * Math.atan(Math.exp(point.y)) - (Math.PI / 2)) * d;
|
||||||
|
|
||||||
// TODO refactor LatLng wrapping
|
return new L.LatLng(lat, lng);
|
||||||
return new L.LatLng(lat, lng, true);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -111,7 +111,7 @@ L.extend(L.GeoJSON, {
|
|||||||
var lat = parseFloat(coords[reverse ? 0 : 1]),
|
var lat = parseFloat(coords[reverse ? 0 : 1]),
|
||||||
lng = parseFloat(coords[reverse ? 1 : 0]);
|
lng = parseFloat(coords[reverse ? 1 : 0]);
|
||||||
|
|
||||||
return new L.LatLng(lat, lng, true);
|
return new L.LatLng(lat, lng);
|
||||||
},
|
},
|
||||||
|
|
||||||
coordsToLatLngs: function (coords, levelsDeep, reverse) { // (Array, Number, Boolean) -> Array
|
coordsToLatLngs: function (coords, levelsDeep, reverse) { // (Array, Number, Boolean) -> Array
|
||||||
|
@ -26,7 +26,7 @@ L.Circle = L.Path.extend({
|
|||||||
|
|
||||||
projectLatlngs: function () {
|
projectLatlngs: function () {
|
||||||
var lngRadius = this._getLngRadius(),
|
var lngRadius = this._getLngRadius(),
|
||||||
latlng2 = new L.LatLng(this._latlng.lat, this._latlng.lng - lngRadius, true),
|
latlng2 = new L.LatLng(this._latlng.lat, this._latlng.lng - lngRadius),
|
||||||
point2 = this._map.latLngToLayerPoint(latlng2);
|
point2 = this._map.latLngToLayerPoint(latlng2);
|
||||||
|
|
||||||
this._point = this._map.latLngToLayerPoint(this._latlng);
|
this._point = this._map.latLngToLayerPoint(this._latlng);
|
||||||
|
Loading…
Reference in New Issue
Block a user