Merge pull request #4035 from tschaub/remove-unused

Remove unused sphere and ellipsoid methods.
This commit is contained in:
Tim Schaub
2015-08-23 13:06:13 -06:00
5 changed files with 15 additions and 891 deletions

View File

@@ -1,185 +0,0 @@
goog.provide('ol.Ellipsoid');
goog.require('goog.math');
goog.require('ol.Coordinate');
/**
* @constructor
* @param {number} a Major radius.
* @param {number} flattening Flattening.
*/
ol.Ellipsoid = function(a, flattening) {
/**
* @const
* @type {number}
*/
this.a = a;
/**
* @const
* @type {number}
*/
this.flattening = flattening;
/**
* @const
* @type {number}
*/
this.b = this.a * (1 - this.flattening);
/**
* @const
* @type {number}
*/
this.eSquared = 2 * flattening - flattening * flattening;
/**
* @const
* @type {number}
*/
this.e = Math.sqrt(this.eSquared);
};
/**
* @param {ol.Coordinate} c1 Coordinate 1.
* @param {ol.Coordinate} c2 Coordinate 1.
* @param {number=} opt_minDeltaLambda Minimum delta lambda for convergence.
* @param {number=} opt_maxIterations Maximum iterations.
* @return {{distance: number, initialBearing: number, finalBearing: number}}
* Vincenty.
*/
ol.Ellipsoid.prototype.vincenty =
function(c1, c2, opt_minDeltaLambda, opt_maxIterations) {
var minDeltaLambda = goog.isDef(opt_minDeltaLambda) ?
opt_minDeltaLambda : 1e-12;
var maxIterations = goog.isDef(opt_maxIterations) ?
opt_maxIterations : 100;
var f = this.flattening;
var lat1 = goog.math.toRadians(c1[1]);
var lat2 = goog.math.toRadians(c2[1]);
var deltaLon = goog.math.toRadians(c2[0] - c1[0]);
var U1 = Math.atan((1 - f) * Math.tan(lat1));
var cosU1 = Math.cos(U1);
var sinU1 = Math.sin(U1);
var U2 = Math.atan((1 - f) * Math.tan(lat2));
var cosU2 = Math.cos(U2);
var sinU2 = Math.sin(U2);
var lambda = deltaLon;
var cosSquaredAlpha, sinAlpha;
var cosLambda, deltaLambda = Infinity, sinLambda;
var cos2SigmaM, cosSigma, sigma, sinSigma;
var i;
for (i = maxIterations; i > 0; --i) {
cosLambda = Math.cos(lambda);
sinLambda = Math.sin(lambda);
var x = cosU2 * sinLambda;
var y = cosU1 * sinU2 - sinU1 * cosU2 * cosLambda;
sinSigma = Math.sqrt(x * x + y * y);
if (sinSigma === 0) {
return {
distance: 0,
initialBearing: 0,
finalBearing: 0
};
}
cosSigma = sinU1 * sinU2 + cosU1 * cosU2 * cosLambda;
sigma = Math.atan2(sinSigma, cosSigma);
sinAlpha = cosU1 * cosU2 * sinLambda / sinSigma;
cosSquaredAlpha = 1 - sinAlpha * sinAlpha;
cos2SigmaM = cosSigma - 2 * sinU1 * sinU2 / cosSquaredAlpha;
if (isNaN(cos2SigmaM)) {
cos2SigmaM = 0;
}
var C = f / 16 * cosSquaredAlpha * (4 + f * (4 - 3 * cosSquaredAlpha));
var lambdaPrime = deltaLon + (1 - C) * f * sinAlpha * (sigma +
C * sinSigma * (cos2SigmaM +
C * cosSigma * (2 * cos2SigmaM * cos2SigmaM - 1)));
deltaLambda = Math.abs(lambdaPrime - lambda);
lambda = lambdaPrime;
if (deltaLambda < minDeltaLambda) {
break;
}
}
if (i === 0) {
return {
distance: NaN,
finalBearing: NaN,
initialBearing: NaN
};
}
var aSquared = this.a * this.a;
var bSquared = this.b * this.b;
var uSquared = cosSquaredAlpha * (aSquared - bSquared) / bSquared;
var A = 1 + uSquared / 16384 *
(4096 + uSquared * (uSquared * (320 - 175 * uSquared) - 768));
var B = uSquared / 1024 *
(256 + uSquared * (uSquared * (74 - 47 * uSquared) - 128));
var deltaSigma = B * sinSigma * (cos2SigmaM + B / 4 *
(cosSigma * (2 * cos2SigmaM * cos2SigmaM - 1) -
B / 6 * cos2SigmaM * (4 * sinSigma * sinSigma - 3) *
(4 * cos2SigmaM * cos2SigmaM - 3)));
cosLambda = Math.cos(lambda);
sinLambda = Math.sin(lambda);
var alpha1 = Math.atan2(cosU2 * sinLambda,
cosU1 * sinU2 - sinU1 * cosU2 * cosLambda);
var alpha2 = Math.atan2(cosU1 * sinLambda,
cosU1 * sinU2 * cosLambda - sinU1 * cosU2);
return {
distance: this.b * A * (sigma - deltaSigma),
initialBearing: goog.math.toDegrees(alpha1),
finalBearing: goog.math.toDegrees(alpha2)
};
};
/**
* Returns the distance from c1 to c2 using Vincenty.
*
* @param {ol.Coordinate} c1 Coordinate 1.
* @param {ol.Coordinate} c2 Coordinate 1.
* @param {number=} opt_minDeltaLambda Minimum delta lambda for convergence.
* @param {number=} opt_maxIterations Maximum iterations.
* @return {number} Vincenty distance.
*/
ol.Ellipsoid.prototype.vincentyDistance =
function(c1, c2, opt_minDeltaLambda, opt_maxIterations) {
var vincenty = this.vincenty(c1, c2, opt_minDeltaLambda, opt_maxIterations);
return vincenty.distance;
};
/**
* Returns the final bearing from c1 to c2 using Vincenty.
*
* @param {ol.Coordinate} c1 Coordinate 1.
* @param {ol.Coordinate} c2 Coordinate 1.
* @param {number=} opt_minDeltaLambda Minimum delta lambda for convergence.
* @param {number=} opt_maxIterations Maximum iterations.
* @return {number} Initial bearing.
*/
ol.Ellipsoid.prototype.vincentyFinalBearing =
function(c1, c2, opt_minDeltaLambda, opt_maxIterations) {
var vincenty = this.vincenty(c1, c2, opt_minDeltaLambda, opt_maxIterations);
return vincenty.finalBearing;
};
/**
* Returns the initial bearing from c1 to c2 using Vincenty.
*
* @param {ol.Coordinate} c1 Coordinate 1.
* @param {ol.Coordinate} c2 Coordinate 1.
* @param {number=} opt_minDeltaLambda Minimum delta lambda for convergence.
* @param {number=} opt_maxIterations Maximum iterations.
* @return {number} Initial bearing.
*/
ol.Ellipsoid.prototype.vincentyInitialBearing =
function(c1, c2, opt_minDeltaLambda, opt_maxIterations) {
var vincenty = this.vincenty(c1, c2, opt_minDeltaLambda, opt_maxIterations);
return vincenty.initialBearing;
};

View File

@@ -1,10 +0,0 @@
goog.provide('ol.ellipsoid.WGS84');
goog.require('ol.Ellipsoid');
/**
* @const
* @type {ol.Ellipsoid}
*/
ol.ellipsoid.WGS84 = new ol.Ellipsoid(6378137, 1 / 298.257223563);

View File

@@ -5,9 +5,6 @@
* Licensed under CC-BY-3.0.
*/
// FIXME add intersection of two paths given start points and bearings
// FIXME add rhumb lines
goog.provide('ol.Sphere');
goog.require('goog.math');
@@ -40,23 +37,6 @@ ol.Sphere = function(radius) {
};
/**
* Returns the distance from c1 to c2 using the spherical law of cosines.
*
* @param {ol.Coordinate} c1 Coordinate 1.
* @param {ol.Coordinate} c2 Coordinate 2.
* @return {number} Spherical law of cosines distance.
*/
ol.Sphere.prototype.cosineDistance = function(c1, c2) {
var lat1 = goog.math.toRadians(c1[1]);
var lat2 = goog.math.toRadians(c2[1]);
var deltaLon = goog.math.toRadians(c2[0] - c1[0]);
return this.radius * Math.acos(
Math.sin(lat1) * Math.sin(lat2) +
Math.cos(lat1) * Math.cos(lat2) * Math.cos(deltaLon));
};
/**
* Returns the geodesic area for a list of coordinates.
*
@@ -87,53 +67,6 @@ ol.Sphere.prototype.geodesicArea = function(coordinates) {
};
/**
* Returns the distance of c3 from the great circle path defined by c1 and c2.
*
* @param {ol.Coordinate} c1 Coordinate 1.
* @param {ol.Coordinate} c2 Coordinate 2.
* @param {ol.Coordinate} c3 Coordinate 3.
* @return {number} Cross-track distance.
*/
ol.Sphere.prototype.crossTrackDistance = function(c1, c2, c3) {
var d13 = this.cosineDistance(c1, c2);
var theta12 = goog.math.toRadians(this.initialBearing(c1, c2));
var theta13 = goog.math.toRadians(this.initialBearing(c1, c3));
return this.radius *
Math.asin(Math.sin(d13 / this.radius) * Math.sin(theta13 - theta12));
};
/**
* Returns the distance from c1 to c2 using Pythagoras's theorem on an
* equirectangular projection.
*
* @param {ol.Coordinate} c1 Coordinate 1.
* @param {ol.Coordinate} c2 Coordinate 2.
* @return {number} Equirectangular distance.
*/
ol.Sphere.prototype.equirectangularDistance = function(c1, c2) {
var lat1 = goog.math.toRadians(c1[1]);
var lat2 = goog.math.toRadians(c2[1]);
var deltaLon = goog.math.toRadians(c2[0] - c1[0]);
var x = deltaLon * Math.cos((lat1 + lat2) / 2);
var y = lat2 - lat1;
return this.radius * Math.sqrt(x * x + y * y);
};
/**
* Returns the final bearing from c1 to c2.
*
* @param {ol.Coordinate} c1 Coordinate 1.
* @param {ol.Coordinate} c2 Coordinate 2.
* @return {number} Initial bearing.
*/
ol.Sphere.prototype.finalBearing = function(c1, c2) {
return (this.initialBearing(c2, c1) + 180) % 360;
};
/**
* Returns the distance from c1 to c2 using the haversine formula.
*
@@ -154,96 +87,6 @@ ol.Sphere.prototype.haversineDistance = function(c1, c2) {
};
/**
* Returns the point at `fraction` along the segment of the great circle passing
* through c1 and c2.
*
* @param {ol.Coordinate} c1 Coordinate 1.
* @param {ol.Coordinate} c2 Coordinate 2.
* @param {number} fraction Fraction.
* @return {ol.Coordinate} Coordinate between c1 and c2.
*/
ol.Sphere.prototype.interpolate = function(c1, c2, fraction) {
var lat1 = goog.math.toRadians(c1[1]);
var lon1 = goog.math.toRadians(c1[0]);
var lat2 = goog.math.toRadians(c2[1]);
var lon2 = goog.math.toRadians(c2[0]);
var cosLat1 = Math.cos(lat1);
var sinLat1 = Math.sin(lat1);
var cosLat2 = Math.cos(lat2);
var sinLat2 = Math.sin(lat2);
var cosDeltaLon = Math.cos(lon2 - lon1);
var d = sinLat1 * sinLat2 + cosLat1 * cosLat2 * cosDeltaLon;
if (1 <= d) {
return c2.slice();
}
d = fraction * Math.acos(d);
var cosD = Math.cos(d);
var sinD = Math.sin(d);
var y = Math.sin(lon2 - lon1) * cosLat2;
var x = cosLat1 * sinLat2 - sinLat1 * cosLat2 * cosDeltaLon;
var theta = Math.atan2(y, x);
var lat = Math.asin(sinLat1 * cosD + cosLat1 * sinD * Math.cos(theta));
var lon = lon1 + Math.atan2(Math.sin(theta) * sinD * cosLat1,
cosD - sinLat1 * Math.sin(lat));
return [goog.math.toDegrees(lon), goog.math.toDegrees(lat)];
};
/**
* Returns the initial bearing from c1 to c2.
*
* @param {ol.Coordinate} c1 Coordinate 1.
* @param {ol.Coordinate} c2 Coordinate 2.
* @return {number} Initial bearing.
*/
ol.Sphere.prototype.initialBearing = function(c1, c2) {
var lat1 = goog.math.toRadians(c1[1]);
var lat2 = goog.math.toRadians(c2[1]);
var deltaLon = goog.math.toRadians(c2[0] - c1[0]);
var y = Math.sin(deltaLon) * Math.cos(lat2);
var x = Math.cos(lat1) * Math.sin(lat2) -
Math.sin(lat1) * Math.cos(lat2) * Math.cos(deltaLon);
return goog.math.toDegrees(Math.atan2(y, x));
};
/**
* Returns the maximum latitude of the great circle defined by bearing and
* latitude.
*
* @param {number} bearing Bearing.
* @param {number} latitude Latitude.
* @return {number} Maximum latitude.
*/
ol.Sphere.prototype.maximumLatitude = function(bearing, latitude) {
return Math.cos(Math.abs(Math.sin(goog.math.toRadians(bearing)) *
Math.cos(goog.math.toRadians(latitude))));
};
/**
* Returns the midpoint between c1 and c2.
*
* @param {ol.Coordinate} c1 Coordinate 1.
* @param {ol.Coordinate} c2 Coordinate 2.
* @return {ol.Coordinate} Midpoint.
*/
ol.Sphere.prototype.midpoint = function(c1, c2) {
var lat1 = goog.math.toRadians(c1[1]);
var lat2 = goog.math.toRadians(c2[1]);
var lon1 = goog.math.toRadians(c1[0]);
var deltaLon = goog.math.toRadians(c2[0] - c1[0]);
var Bx = Math.cos(lat2) * Math.cos(deltaLon);
var By = Math.cos(lat2) * Math.sin(deltaLon);
var cosLat1PlusBx = Math.cos(lat1) + Bx;
var lat = Math.atan2(Math.sin(lat1) + Math.sin(lat2),
Math.sqrt(cosLat1PlusBx * cosLat1PlusBx + By * By));
var lon = lon1 + Math.atan2(By, cosLat1PlusBx);
return [goog.math.toDegrees(lon), goog.math.toDegrees(lat)];
};
/**
* Returns the coordinate at the given distance and bearing from `c1`.
*

View File

@@ -1,358 +0,0 @@
goog.provide('ol.test.Ellipsoid');
describe('ol.Ellipsoid', function() {
var expected = [
{
c1: [0, 0],
c2: [0, 0],
vincentyFinalBearing: 0,
vincentyInitialBearing: 0,
vincentyDistance: 0
},
{
c1: [0, 0],
c2: [45, 45],
vincentyFinalBearing: 54.890773827979565,
vincentyInitialBearing: 35.41005890511814,
vincentyDistance: 6662472.718217184
},
{
c1: [0, 0],
c2: [45, -45],
vincentyFinalBearing: 125.10922617202044,
vincentyInitialBearing: 144.58994109488185,
vincentyDistance: 6662472.718217184
},
{
c1: [0, 0],
c2: [-45, -45],
vincentyFinalBearing: -125.10922617202044,
vincentyInitialBearing: -144.58994109488185,
vincentyDistance: 6662472.718217184
},
{
c1: [0, 0],
c2: [-45, 45],
vincentyFinalBearing: -54.890773827979565,
vincentyInitialBearing: -35.41005890511814,
vincentyDistance: 6662472.718217184
},
{
c1: [0, 0],
c2: [180, 90],
vincentyFinalBearing: 180,
vincentyInitialBearing: 4.296211503097554e-31,
vincentyDistance: 10001965.729311794
},
{
c1: [0, 0],
c2: [180, -90],
vincentyFinalBearing: 7.0164775638926606e-15,
vincentyInitialBearing: 180,
vincentyDistance: 10001965.729311794
},
{
c1: [0, 0],
c2: [-180, 90],
vincentyFinalBearing: -180,
vincentyInitialBearing: -4.296211503097554e-31,
vincentyDistance: 10001965.729311794
},
{
c1: [0, 0],
c2: [-180, 90],
vincentyFinalBearing: -180,
vincentyInitialBearing: -4.296211503097554e-31,
vincentyDistance: 10001965.729311794
},
{
c1: [45, 45],
c2: [45, 45],
vincentyFinalBearing: 0,
vincentyInitialBearing: 0,
vincentyDistance: 0
},
{
c1: [45, 45],
c2: [45, -45],
vincentyFinalBearing: 180,
vincentyInitialBearing: 180,
vincentyDistance: 9969888.755957305
},
{
c1: [45, 45],
c2: [-45, -45],
vincentyFinalBearing: -125.10922617202044,
vincentyInitialBearing: -125.10922617202044,
vincentyDistance: 13324945.436434371
},
{
c1: [45, 45],
c2: [-45, 45],
vincentyFinalBearing: -125.27390277185786,
vincentyInitialBearing: -54.726097228142166,
vincentyDistance: 6690232.932559058
},
{
c1: [45, 45],
c2: [180, 90],
vincentyFinalBearing: 135,
vincentyInitialBearing: 3.5023624896823797e-15,
vincentyDistance: 5017021.35133314
},
{
c1: [45, 45],
c2: [180, -90],
vincentyFinalBearing: 45.00000000000001,
vincentyInitialBearing: 180,
vincentyDistance: 14986910.107290443
},
{
c1: [45, 45],
c2: [-180, 90],
vincentyFinalBearing: 135.00000000000003,
vincentyInitialBearing: 3.5023624896823793e-15,
vincentyDistance: 5017021.35133314
},
{
c1: [45, 45],
c2: [-180, 90],
vincentyFinalBearing: 135.00000000000003,
vincentyInitialBearing: 3.5023624896823793e-15,
vincentyDistance: 5017021.35133314
},
{
c1: [45, -45],
c2: [45, -45],
vincentyFinalBearing: 0,
vincentyInitialBearing: 0,
vincentyDistance: 0
},
{
c1: [45, -45],
c2: [-45, -45],
vincentyFinalBearing: -54.726097228142166,
vincentyInitialBearing: -125.27390277185786,
vincentyDistance: 6690232.932559058
},
{
c1: [45, -45],
c2: [-45, 45],
vincentyFinalBearing: -54.890773827979565,
vincentyInitialBearing: -54.890773827979565,
vincentyDistance: 13324945.436434371
},
{
c1: [45, -45],
c2: [180, 90],
vincentyFinalBearing: 135,
vincentyInitialBearing: 3.5023624896823797e-15,
vincentyDistance: 14986910.107290443
},
{
c1: [45, -45],
c2: [180, -90],
vincentyFinalBearing: 45.00000000000001,
vincentyInitialBearing: 180,
vincentyDistance: 5017021.35133314
},
{
c1: [45, -45],
c2: [-180, 90],
vincentyFinalBearing: 135.00000000000003,
vincentyInitialBearing: 3.5023624896823793e-15,
vincentyDistance: 14986910.107290443
},
{
c1: [45, -45],
c2: [-180, 90],
vincentyFinalBearing: 135.00000000000003,
vincentyInitialBearing: 3.5023624896823793e-15,
vincentyDistance: 14986910.107290443
},
{
c1: [-45, -45],
c2: [-45, -45],
vincentyFinalBearing: 0,
vincentyInitialBearing: 0,
vincentyDistance: 0
},
{
c1: [-45, -45],
c2: [-45, 45],
vincentyFinalBearing: 0,
vincentyInitialBearing: 0,
vincentyDistance: 9969888.755957305
},
{
c1: [-45, -45],
c2: [180, 90],
vincentyFinalBearing: -135.00000000000003,
vincentyInitialBearing: -3.5023624896823793e-15,
vincentyDistance: 14986910.107290443
},
{
c1: [-45, -45],
c2: [180, -90],
vincentyFinalBearing: -44.999999999999986,
vincentyInitialBearing: -180,
vincentyDistance: 5017021.35133314
},
{
c1: [-45, -45],
c2: [-180, 90],
vincentyFinalBearing: -135,
vincentyInitialBearing: -3.5023624896823797e-15,
vincentyDistance: 14986910.107290443
},
{
c1: [-45, -45],
c2: [-180, 90],
vincentyFinalBearing: -135,
vincentyInitialBearing: -3.5023624896823797e-15,
vincentyDistance: 14986910.107290443
},
{
c1: [-45, 45],
c2: [-45, 45],
vincentyFinalBearing: 0,
vincentyInitialBearing: 0,
vincentyDistance: 0
},
{
c1: [-45, 45],
c2: [180, 90],
vincentyFinalBearing: -135.00000000000003,
vincentyInitialBearing: -3.5023624896823793e-15,
vincentyDistance: 5017021.35133314
},
{
c1: [-45, 45],
c2: [180, -90],
vincentyFinalBearing: -44.999999999999986,
vincentyInitialBearing: -180,
vincentyDistance: 14986910.107290443
},
{
c1: [-45, 45],
c2: [-180, 90],
vincentyFinalBearing: -135,
vincentyInitialBearing: -3.5023624896823797e-15,
vincentyDistance: 5017021.35133314
},
{
c1: [-45, 45],
c2: [-180, 90],
vincentyFinalBearing: -135,
vincentyInitialBearing: -3.5023624896823797e-15,
vincentyDistance: 5017021.35133314
},
{
c1: [180, 90],
c2: [180, 90],
vincentyFinalBearing: 0,
vincentyInitialBearing: 0,
vincentyDistance: 0
},
{
c1: [180, -90],
c2: [180, -90],
vincentyFinalBearing: 0,
vincentyInitialBearing: 0,
vincentyDistance: 0
},
{
c1: [-180, 90],
c2: [-180, 90],
vincentyFinalBearing: 0,
vincentyInitialBearing: 0,
vincentyDistance: 0
},
{
c1: [-180, 90],
c2: [-180, 90],
vincentyFinalBearing: 0,
vincentyInitialBearing: 0,
vincentyDistance: 0
},
{
c1: [-180, 90],
c2: [-180, 90],
vincentyFinalBearing: 0,
vincentyInitialBearing: 0,
vincentyDistance: 0
}
];
describe('vincenty', function() {
it('returns the same distances as Chris Veness\'s reference implementation',
function() {
var e, i, v;
for (i = 0; i < expected.length; ++i) {
e = expected[i];
v = ol.ellipsoid.WGS84.vincenty(e.c1, e.c2, 1e-12, 100);
expect(v.distance).to.roughlyEqual(e.vincentyDistance, 1e-8);
expect(v.finalBearing).to.roughlyEqual(
e.vincentyFinalBearing, 1e-9);
expect(v.initialBearing).to.roughlyEqual(
e.vincentyInitialBearing, 1e-9);
}
});
});
describe('vincentyDistance', function() {
it('returns the same distances as Chris Veness\'s reference implementation',
function() {
var e, i, vincentyDistance;
for (i = 0; i < expected.length; ++i) {
e = expected[i];
vincentyDistance =
ol.ellipsoid.WGS84.vincentyDistance(e.c1, e.c2, 1e-12, 100);
expect(vincentyDistance).to.roughlyEqual(e.vincentyDistance, 1e-8);
}
});
});
describe('vincentyFinalBearing', function() {
it('returns the same distances as Chris Veness\'s reference implementation',
function() {
var e, i, vincentyFinalBearing;
for (i = 0; i < expected.length; ++i) {
e = expected[i];
vincentyFinalBearing =
ol.ellipsoid.WGS84.vincentyFinalBearing(e.c1, e.c2, 1e-12, 100);
expect(vincentyFinalBearing).to.roughlyEqual(
e.vincentyFinalBearing, 1e-9);
}
});
});
describe('vincentyInitialBearing', function() {
it('returns the same distances as Chris Veness\'s reference implementation',
function() {
var e, i, vincentyInitialBearing;
for (i = 0; i < expected.length; ++i) {
e = expected[i];
vincentyInitialBearing = ol.ellipsoid.WGS84.vincentyInitialBearing(
e.c1, e.c2, 1e-12, 100);
expect(vincentyInitialBearing).to.roughlyEqual(
e.vincentyInitialBearing, 1e-9);
}
});
});
});
goog.require('ol.Ellipsoid');
goog.require('ol.ellipsoid.WGS84');

View File

@@ -1,6 +1,4 @@
// See http://www.movable-type.co.uk/scripts/latlong.html
// FIXME add tests for crossTrackDistance
// FIXME add tests for maximumLatitude
// FIXME add tests for offset
goog.provide('ol.test.Sphere');
@@ -13,194 +11,80 @@ describe('ol.Sphere', function() {
{
c1: [0, 0],
c2: [0, 0],
cosineDistance: 0,
equirectangularDistance: 0,
finalBearing: 180,
haversineDistance: 0,
initialBearing: 0,
midpoint: [0, 0]
haversineDistance: 0
},
{
c1: [0, 0],
c2: [45, 45],
cosineDistance: 6671.695598673524,
equirectangularDistance: 6812.398372654371,
finalBearing: 54.735610317245346,
haversineDistance: 6671.695598673525,
initialBearing: 35.264389682754654,
midpoint: [18.434948822922006, 24.0948425521107]
haversineDistance: 6671.695598673525
},
{
c1: [0, 0],
c2: [-45, 45],
cosineDistance: 6671.695598673524,
equirectangularDistance: 6812.398372654371,
finalBearing: 305.26438968275465,
haversineDistance: 6671.695598673525,
initialBearing: -35.264389682754654,
midpoint: [-18.434948822922006, 24.0948425521107]
haversineDistance: 6671.695598673525
},
{
c1: [0, 0],
c2: [-45, -45],
cosineDistance: 6671.695598673524,
equirectangularDistance: 6812.398372654371,
finalBearing: 234.73561031724535,
haversineDistance: 6671.695598673525,
initialBearing: -144.73561031724535,
midpoint: [-18.434948822922006, -24.0948425521107]
haversineDistance: 6671.695598673525
},
{
c1: [0, 0],
c2: [45, -45],
cosineDistance: 6671.695598673524,
equirectangularDistance: 6812.398372654371,
finalBearing: 125.26438968275465,
haversineDistance: 6671.695598673525,
initialBearing: 144.73561031724535,
midpoint: [18.434948822922006, -24.0948425521107]
haversineDistance: 6671.695598673525
},
{
c1: [45, 45],
c2: [45, 45],
cosineDistance: 0,
equirectangularDistance: 0,
finalBearing: 180,
haversineDistance: 0,
initialBearing: 0,
midpoint: [45.00000000000005, 45]
haversineDistance: 0
},
{
c1: [45, 45],
c2: [-45, 45],
cosineDistance: 6671.695598673525,
equirectangularDistance: 7076.401799751738,
finalBearing: 234.73561031724535,
haversineDistance: 6671.695598673525,
initialBearing: -54.73561031724535,
midpoint: [0, 54.735610317245346]
haversineDistance: 6671.695598673525
},
{
c1: [45, 45],
c2: [-45, -45],
cosineDistance: 13343.391197347048,
equirectangularDistance: 14152.803599503475,
finalBearing: 234.73561031724535,
haversineDistance: 13343.391197347048,
initialBearing: -125.26438968275465,
midpoint: [0, 0]
haversineDistance: 13343.391197347048
},
{
c1: [45, 45],
c2: [45, -45],
cosineDistance: 10007.543398010284,
equirectangularDistance: 10007.543398010286,
finalBearing: 180,
haversineDistance: 10007.543398010286,
initialBearing: 180,
midpoint: [45.00000000000005, 0]
haversineDistance: 10007.543398010286
},
{
c1: [-45, 45],
c2: [-45, 45],
cosineDistance: 0,
equirectangularDistance: 0,
finalBearing: 180,
haversineDistance: 0,
initialBearing: 0,
midpoint: [-45.00000000000005, 45]
haversineDistance: 0
},
{
c1: [-45, 45],
c2: [-45, -45],
cosineDistance: 10007.543398010284,
equirectangularDistance: 10007.543398010286,
finalBearing: 180,
haversineDistance: 10007.543398010286,
initialBearing: 180,
midpoint: [-45.00000000000005, 0]
haversineDistance: 10007.543398010286
},
{
c1: [-45, 45],
c2: [45, -45],
cosineDistance: 13343.391197347048,
equirectangularDistance: 14152.803599503475,
finalBearing: 125.26438968275465,
haversineDistance: 13343.391197347048,
initialBearing: 125.26438968275465,
midpoint: [0, 0]
haversineDistance: 13343.391197347048
},
{
c1: [-45, -45],
c2: [-45, -45],
cosineDistance: 0,
equirectangularDistance: 0,
finalBearing: 180,
haversineDistance: 0,
initialBearing: 0,
midpoint: [-45.00000000000005, -45]
haversineDistance: 0
},
{
c1: [-45, -45],
c2: [45, -45],
cosineDistance: 6671.695598673525,
equirectangularDistance: 7076.401799751738,
finalBearing: 54.735610317245346,
haversineDistance: 6671.695598673525,
initialBearing: 125.26438968275465,
midpoint: [0, -54.735610317245346]
haversineDistance: 6671.695598673525
},
{
c1: [45, -45],
c2: [45, -45],
cosineDistance: 0,
equirectangularDistance: 0,
finalBearing: 180,
haversineDistance: 0,
initialBearing: 0,
midpoint: [45.00000000000005, -45]
haversineDistance: 0
}
];
describe('cosineDistance', function() {
it('results match Chris Veness\'s reference implementation', function() {
var e, i;
for (i = 0; i < expected.length; ++i) {
e = expected[i];
expect(sphere.cosineDistance(e.c1, e.c2)).to.roughlyEqual(
e.cosineDistance, 1e-3);
}
});
});
describe('equirectangularDistance', function() {
it('results match Chris Veness\'s reference implementation', function() {
var e, i;
for (i = 0; i < expected.length; ++i) {
e = expected[i];
expect(sphere.equirectangularDistance(e.c1, e.c2)).to.roughlyEqual(
e.equirectangularDistance, 1e-9);
}
});
});
describe('finalBearing', function() {
it('results match Chris Veness\'s reference implementation', function() {
var e, i;
for (i = 0; i < expected.length; ++i) {
e = expected[i];
expect(sphere.finalBearing(e.c1, e.c2)).to.roughlyEqual(
e.finalBearing, 1e-9);
}
});
});
describe('haversineDistance', function() {
it('results match Chris Veness\'s reference implementation', function() {
@@ -214,56 +98,6 @@ describe('ol.Sphere', function() {
});
describe('initialBearing', function() {
it('results match Chris Veness\'s reference implementation', function() {
var e, i;
for (i = 0; i < expected.length; ++i) {
e = expected[i];
expect(sphere.initialBearing(e.c1, e.c2)).to.roughlyEqual(
e.initialBearing, 1e-9);
}
});
});
describe('interpolate', function() {
it('results match at the start, midpoint, and end', function() {
var e, i;
for (i = 0; i < expected.length; ++i) {
e = expected[i];
var c1 = sphere.interpolate(e.c1, e.c2, 0);
expect(c1[0]).to.roughlyEqual(e.c1[0], 1e-9);
expect(c1[1]).to.roughlyEqual(e.c1[1], 1e-9);
var midpoint = sphere.interpolate(e.c1, e.c2, 0.5);
expect(midpoint[0]).to.roughlyEqual(e.midpoint[0], 1e-9);
expect(midpoint[1]).to.roughlyEqual(e.midpoint[1], 1e-5);
var c2 = sphere.interpolate(e.c1, e.c2, 1);
expect(c2[0]).to.roughlyEqual(e.c2[0], 1e-9);
expect(c2[1]).to.roughlyEqual(e.c2[1], 1e-5);
}
});
});
describe('midpoint', function() {
it('results match Chris Veness\'s reference implementation', function() {
var e, i, midpoint;
for (i = 0; i < expected.length; ++i) {
e = expected[i];
midpoint = sphere.midpoint(e.c1, e.c2);
// Test modulo 360 to avoid unnecessary expensive modulo operations
// in our implementation.
expect(goog.math.modulo(midpoint[0], 360)).to.roughlyEqual(
goog.math.modulo(e.midpoint[0], 360), 1e-9);
expect(midpoint[1]).to.roughlyEqual(e.midpoint[1], 1e-9);
}
});
});
describe('Vincenty area', function() {
var geometry;
before(function(done) {