diff --git a/src/ol/parser/polyline.js b/src/ol/parser/polyline.js index 03ce9077c3..72b9b9bc6f 100644 --- a/src/ol/parser/polyline.js +++ b/src/ol/parser/polyline.js @@ -1,6 +1,33 @@ goog.provide('ol.parser.polyline'); +/** + * Encode one single floating point number and return an encoded string + * + * @param {number} num Floating point number that should be encoded. + * @param {number=} opt_factor The factor by which num will be multiplied. + * The remaining decimal places will get rounded away. + * @return {string} The encoded string. + */ +ol.parser.polyline.encodeFloat = function(num, opt_factor) { + num = Math.round(num * (opt_factor || 1e5)); + return ol.parser.polyline.encodeSignedInteger(num); +}; + + +/** + * Decode one single floating point number from an encoded string + * + * @param {string} encoded An encoded string. + * @param {number=} opt_factor The factor by which the result will be divided. + * @return {number} The decoded floating point number. + */ +ol.parser.polyline.decodeFloat = function(encoded, opt_factor) { + var result = ol.parser.polyline.decodeSignedInteger(encoded); + return result / (opt_factor || 1e5); +}; + + /** * Encode one single signed integer and return an encoded string * diff --git a/test/spec/ol/parser/polyline.test.js b/test/spec/ol/parser/polyline.test.js index 2b96b75373..ac8fa35d13 100644 --- a/test/spec/ol/parser/polyline.test.js +++ b/test/spec/ol/parser/polyline.test.js @@ -2,6 +2,46 @@ goog.provide('ol.test.parser.polyline'); describe('ol.parser.polyline', function() { + describe('encodeFloat', function() { + it('returns expected value', function() { + var encodeFloat = ol.parser.polyline.encodeFloat; + + expect(encodeFloat(0.00000)).toEqual('?'); + expect(encodeFloat(-0.00001)).toEqual('@'); + expect(encodeFloat(0.00001)).toEqual('A'); + expect(encodeFloat(-0.00002)).toEqual('B'); + expect(encodeFloat(0.00002)).toEqual('C'); + expect(encodeFloat(0.00015)).toEqual(']'); + expect(encodeFloat(-0.00016)).toEqual('^'); + + expect(encodeFloat(-0.1, 10)).toEqual('@'); + expect(encodeFloat(0.1, 10)).toEqual('A'); + + expect(encodeFloat(16 * 32 / 1e5)).toEqual('__@'); + expect(encodeFloat(16 * 32 * 32 / 1e5)).toEqual('___@'); + }); + }); + + describe('decodeFloat', function() { + it('returns expected value', function() { + var decodeFloat = ol.parser.polyline.decodeFloat; + + expect(decodeFloat('?')).toEqual(0.00000); + expect(decodeFloat('@')).toEqual(-0.00001); + expect(decodeFloat('A')).toEqual(0.00001); + expect(decodeFloat('B')).toEqual(-0.00002); + expect(decodeFloat('C')).toEqual(0.00002); + expect(decodeFloat(']')).toEqual(0.00015); + expect(decodeFloat('^')).toEqual(-0.00016); + + expect(decodeFloat('@', 10)).toEqual(-0.1); + expect(decodeFloat('A', 10)).toEqual(0.1); + + expect(decodeFloat('__@')).toEqual(16 * 32 / 1e5); + expect(decodeFloat('___@')).toEqual(16 * 32 * 32 / 1e5); + }); + }); + describe('encodeSignedInteger', function() { it('returns expected value', function() { var encodeSignedInteger = ol.parser.polyline.encodeSignedInteger;