diff --git a/src/ol/ellipsoid/ellipsoid.js b/src/ol/ellipsoid/ellipsoid.js index 38086eb644..ad266f644c 100644 --- a/src/ol/ellipsoid/ellipsoid.js +++ b/src/ol/ellipsoid/ellipsoid.js @@ -1,8 +1,5 @@ goog.provide('ol.Ellipsoid'); -goog.require('goog.math'); -goog.require('ol.Coordinate'); - /** @@ -43,95 +40,3 @@ ol.Ellipsoid = function(a, flattening) { 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) - }; -}; diff --git a/test/spec/ol/ellipsoid/ellipsoid.test.js b/test/spec/ol/ellipsoid/ellipsoid.test.js deleted file mode 100644 index 843d2d2205..0000000000 --- a/test/spec/ol/ellipsoid/ellipsoid.test.js +++ /dev/null @@ -1,227 +0,0 @@ -goog.provide('ol.test.Ellipsoid'); - - -describe('ol.Ellipsoid', function() { - - var expected = [ - { - c1: [0, 0], - c2: [0, 0], - vincentyDistance: 0 - }, - { - c1: [0, 0], - c2: [45, 45], - vincentyDistance: 6662472.718217184 - }, - { - c1: [0, 0], - c2: [45, -45], - vincentyDistance: 6662472.718217184 - }, - { - c1: [0, 0], - c2: [-45, -45], - vincentyDistance: 6662472.718217184 - }, - { - c1: [0, 0], - c2: [-45, 45], - vincentyDistance: 6662472.718217184 - }, - { - c1: [0, 0], - c2: [180, 90], - vincentyDistance: 10001965.729311794 - }, - { - c1: [0, 0], - c2: [180, -90], - vincentyDistance: 10001965.729311794 - }, - { - c1: [0, 0], - c2: [-180, 90], - vincentyDistance: 10001965.729311794 - }, - { - c1: [0, 0], - c2: [-180, 90], - vincentyDistance: 10001965.729311794 - }, - { - c1: [45, 45], - c2: [45, 45], - vincentyDistance: 0 - }, - { - c1: [45, 45], - c2: [45, -45], - vincentyDistance: 9969888.755957305 - }, - { - c1: [45, 45], - c2: [-45, -45], - vincentyDistance: 13324945.436434371 - }, - { - c1: [45, 45], - c2: [-45, 45], - vincentyDistance: 6690232.932559058 - }, - { - c1: [45, 45], - c2: [180, 90], - vincentyDistance: 5017021.35133314 - }, - { - c1: [45, 45], - c2: [180, -90], - vincentyDistance: 14986910.107290443 - }, - { - c1: [45, 45], - c2: [-180, 90], - vincentyDistance: 5017021.35133314 - }, - { - c1: [45, 45], - c2: [-180, 90], - vincentyDistance: 5017021.35133314 - }, - { - c1: [45, -45], - c2: [45, -45], - vincentyDistance: 0 - }, - { - c1: [45, -45], - c2: [-45, -45], - vincentyDistance: 6690232.932559058 - }, - { - c1: [45, -45], - c2: [-45, 45], - vincentyDistance: 13324945.436434371 - }, - { - c1: [45, -45], - c2: [180, 90], - vincentyDistance: 14986910.107290443 - }, - { - c1: [45, -45], - c2: [180, -90], - vincentyDistance: 5017021.35133314 - }, - { - c1: [45, -45], - c2: [-180, 90], - vincentyDistance: 14986910.107290443 - }, - { - c1: [45, -45], - c2: [-180, 90], - vincentyDistance: 14986910.107290443 - }, - { - c1: [-45, -45], - c2: [-45, -45], - vincentyDistance: 0 - }, - { - c1: [-45, -45], - c2: [-45, 45], - vincentyDistance: 9969888.755957305 - }, - { - c1: [-45, -45], - c2: [180, 90], - vincentyDistance: 14986910.107290443 - }, - { - c1: [-45, -45], - c2: [180, -90], - vincentyDistance: 5017021.35133314 - }, - { - c1: [-45, -45], - c2: [-180, 90], - vincentyDistance: 14986910.107290443 - }, - { - c1: [-45, -45], - c2: [-180, 90], - vincentyDistance: 14986910.107290443 - }, - { - c1: [-45, 45], - c2: [-45, 45], - vincentyDistance: 0 - }, - { - c1: [-45, 45], - c2: [180, 90], - vincentyDistance: 5017021.35133314 - }, - { - c1: [-45, 45], - c2: [180, -90], - vincentyDistance: 14986910.107290443 - }, - { - c1: [-45, 45], - c2: [-180, 90], - vincentyDistance: 5017021.35133314 - }, - { - c1: [-45, 45], - c2: [-180, 90], - vincentyDistance: 5017021.35133314 - }, - { - c1: [180, 90], - c2: [180, 90], - vincentyDistance: 0 - }, - { - c1: [180, -90], - c2: [180, -90], - vincentyDistance: 0 - }, - { - c1: [-180, 90], - c2: [-180, 90], - vincentyDistance: 0 - }, - { - c1: [-180, 90], - c2: [-180, 90], - vincentyDistance: 0 - }, - { - c1: [-180, 90], - c2: [-180, 90], - 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); - } - }); - - }); - -}); - - -goog.require('ol.Ellipsoid'); -goog.require('ol.ellipsoid.WGS84');