diff --git a/src/ol/coordinate.js b/src/ol/coordinate.js index c683fda00a..0b3bd07916 100644 --- a/src/ol/coordinate.js +++ b/src/ol/coordinate.js @@ -112,10 +112,25 @@ ol.coordinate.degreesToStringHDMS_ = function(degrees, hemispheres, opt_fraction var normalizedDegrees = ol.math.modulo(degrees + 180, 360) - 180; var x = Math.abs(3600 * normalizedDegrees); var dflPrecision = opt_fractionDigits || 0; - return Math.floor(x / 3600) + '\u00b0 ' + - ol.string.padNumber(Math.floor((x / 60) % 60), 2) + '\u2032 ' + - ol.string.padNumber((x % 60), 2, dflPrecision) + '\u2033 ' + - hemispheres.charAt(normalizedDegrees < 0 ? 1 : 0); + + var deg = Math.floor(x / 3600); + var min = Math.floor((x / 60) % 60); + var precision = Math.pow(10, dflPrecision); + var sec = Math.ceil((x * precision) % 60) / precision; + + if (60 === sec) { + sec = 0; + min += 1; + } + + if (min >= 60) { + min -= 60; + deg = deg >= 0 ? deg + 1 : deg - 1; + } + + return deg + '\u00b0 ' + ol.string.padNumber(min, 2) + '\u2032 ' + + ol.string.padNumber(sec, 2, dflPrecision) + '\u2033 ' + + hemispheres.charAt(normalizedDegrees < 0 ? 1 : 0); }; diff --git a/test/spec/ol/coordinate.test.js b/test/spec/ol/coordinate.test.js index 215e3ee5d8..0627866cd0 100644 --- a/test/spec/ol/coordinate.test.js +++ b/test/spec/ol/coordinate.test.js @@ -206,13 +206,13 @@ describe('ol.coordinate', function() { it('formats with zero fractional digits as default', function() { var coord = [7.85, 47.983333]; var got = ol.coordinate.toStringHDMS(coord); - var expected = '47° 58′ 60″ N 7° 50′ 60″ E'; + var expected = '47° 59′ 00″ N 7° 51′ 00″ E'; expect(got).to.be(expected); }); it('formats with given fractional digits, if passed', function() { - var coord = [7.85, 47.983333]; + var coord = [7.85, 47.983201]; var got = ol.coordinate.toStringHDMS(coord, 3); - var expected = '47° 58′ 59.999″ N 7° 50′ 60.000″ E'; + var expected = '47° 58′ 59.524″ N 7° 51′ 0.000″ E'; expect(got).to.be(expected); }); });