diff --git a/src/ol/parser/polyline.js b/src/ol/parser/polyline.js index 97254a1913..96178f82f4 100644 --- a/src/ol/parser/polyline.js +++ b/src/ol/parser/polyline.js @@ -72,6 +72,52 @@ ol.parser.polyline.decodeFlatCoordinates = function(encoded, opt_dimension) { }; +/** + * Encode a list of unsigned integers and return an encoded string + * + * @param {Array.} numbers A list of unsigned integers. + * @return {string} The encoded string. + */ +ol.parser.polyline.encodeUnsignedIntegers = function(numbers) { + var encoded = ''; + + var numbersLength = numbers.length; + for (var i = 0; i < numbersLength; ++i) { + encoded += ol.parser.polyline.encodeUnsignedInteger(numbers[i]); + } + + return encoded; +}; + + +/** + * Decode a list of unsigned integers from an encoded string + * + * @param {string} encoded An encoded string. + * @return {Array.} A list of unsigned integers. + */ +ol.parser.polyline.decodeUnsignedIntegers = function(encoded) { + var numbers = new Array(); + + var encodedLength = encoded.length; + for (var i = 0; i < encodedLength;) { + var result = 0; + var shift = 0; + + var b; + do { + b = encoded.charCodeAt(i++) - 63; + result |= (b & 0x1f) << shift; + shift += 5; + } while (b >= 0x20); + + numbers.push(result); + } + + return numbers; +}; + + /** * Encode one single floating point number and return an encoded string * diff --git a/test/spec/ol/parser/polyline.test.js b/test/spec/ol/parser/polyline.test.js index 3dd3c0155b..cab296a184 100644 --- a/test/spec/ol/parser/polyline.test.js +++ b/test/spec/ol/parser/polyline.test.js @@ -26,6 +26,29 @@ describe('ol.parser.polyline', function() { }); }); + + var unsignedIntegers = [0, 30, 1, 31, 32, 2, 174]; + var encodedUnsignedIntegers = '?]@^_@AmD'; + + describe('encodeUnsignedIntegers', function() { + it('returns expected value', function() { + var encodeUnsignedIntegers = ol.parser.polyline.encodeUnsignedIntegers; + + expect(encodeUnsignedIntegers( + unsignedIntegers)).toEqual(encodedUnsignedIntegers); + }); + }); + + describe('decodeUnsignedIntegers', function() { + it('returns expected value', function() { + var decodeUnsignedIntegers = ol.parser.polyline.decodeUnsignedIntegers; + + expect(decodeUnsignedIntegers( + encodedUnsignedIntegers)).toEqual(unsignedIntegers); + }); + }); + + describe('encodeFloat', function() { it('returns expected value', function() { var encodeFloat = ol.parser.polyline.encodeFloat;