From a283977cb9970df5a2f943edf157ba54cddb9864 Mon Sep 17 00:00:00 2001 From: Frederic Junod Date: Fri, 16 May 2014 10:00:21 +0200 Subject: [PATCH] Make the scale factor of ol.format.Polyline configurable And export the class --- externs/olx.js | 15 +++ src/ol/format/polylineformat.js | 129 ++++++++++++++------- test/spec/ol/format/polylineformat.test.js | 21 ---- 3 files changed, 101 insertions(+), 64 deletions(-) diff --git a/externs/olx.js b/externs/olx.js index ac24633afa..7c87c7bfdf 100644 --- a/externs/olx.js +++ b/externs/olx.js @@ -1128,6 +1128,21 @@ olx.format.GeoJSONOptions.prototype.defaultProjection; olx.format.GeoJSONOptions.prototype.geometryName; +/** + * @typedef {{factor: (number|undefined)}} + * @todo stability experimental + */ +olx.format.PolylineOptions; + + +/** + * The factor by which the coordinates values will be scaled. + * Default is `1e5`. + */ +olx.format.PolylineOptions.prototype.factor; + + + /** * @typedef {{defaultProjection: ol.proj.ProjectionLike}} * @todo api diff --git a/src/ol/format/polylineformat.js b/src/ol/format/polylineformat.js index 8cdbe55755..ec126ec435 100644 --- a/src/ol/format/polylineformat.js +++ b/src/ol/format/polylineformat.js @@ -12,66 +12,50 @@ goog.require('ol.proj'); /** * @constructor * @extends {ol.format.TextFeature} + * @param {olx.format.PolylineOptions=} opt_options + * Optional configuration object. + * @todo api */ -ol.format.Polyline = function() { +ol.format.Polyline = function(opt_options) { + + var options = goog.isDef(opt_options) ? opt_options : {}; + goog.base(this); + + /** + * @private + * @type {number} + */ + this.factor_ = goog.isDef(options.factor) ? options.factor : 1e5; }; goog.inherits(ol.format.Polyline, ol.format.TextFeature); -/** - * Encode a list of coordinates in a flat array and return an encoded string - * - * Attention: This function will modify the passed array! - * - * @param {Array.} flatPoints A flat array of coordinates. - * @param {number=} opt_dimension The dimension of the coordinates in the array. - * @return {string} The encoded string. - */ -ol.format.Polyline.encodeFlatCoordinates = function(flatPoints, opt_dimension) { - var dimension = goog.isDef(opt_dimension) ? opt_dimension : 2; - return ol.format.Polyline.encodeDeltas(flatPoints, dimension); -}; - - -/** - * Decode a list of coordinates from an encoded string into a flat array - * - * @param {string} encoded An encoded string. - * @param {number=} opt_dimension The dimension of the coordinates in the - * encoded string. - * @return {Array.} A flat array of coordinates. - */ -ol.format.Polyline.decodeFlatCoordinates = function(encoded, opt_dimension) { - var dimension = goog.isDef(opt_dimension) ? opt_dimension : 2; - return ol.format.Polyline.decodeDeltas(encoded, dimension); -}; - - /** * Encode a list of n-dimensional points and return an encoded string * * Attention: This function will modify the passed array! * * @param {Array.} numbers A list of n-dimensional points. - * @param {number} dimension The dimension of the points in the list. + * @param {number} stride The number of dimension of the points in the list. * @param {number=} opt_factor The factor by which the numbers will be * multiplied. The remaining decimal places will get rounded away. * Default is `1e5`. * @return {string} The encoded string. + * @todo api */ -ol.format.Polyline.encodeDeltas = function(numbers, dimension, opt_factor) { +ol.format.Polyline.encodeDeltas = function(numbers, stride, opt_factor) { var factor = goog.isDef(opt_factor) ? opt_factor : 1e5; var d; - var lastNumbers = new Array(dimension); - for (d = 0; d < dimension; ++d) { + var lastNumbers = new Array(stride); + for (d = 0; d < stride; ++d) { lastNumbers[d] = 0; } var i, ii; for (i = 0, ii = numbers.length; i < ii;) { - for (d = 0; d < dimension; ++d, ++i) { + for (d = 0; d < stride; ++d, ++i) { var num = numbers[i]; var delta = num - lastNumbers[d]; lastNumbers[d] = num; @@ -88,18 +72,20 @@ ol.format.Polyline.encodeDeltas = function(numbers, dimension, opt_factor) { * Decode a list of n-dimensional points from an encoded string * * @param {string} encoded An encoded string. - * @param {number} dimension The dimension of the points in the encoded string. + * @param {number} stride The number of dimension of the points in the + * encoded string. * @param {number=} opt_factor The factor by which the resulting numbers will * be divided. Default is `1e5`. * @return {Array.} A list of n-dimensional points. + * @todo api */ -ol.format.Polyline.decodeDeltas = function(encoded, dimension, opt_factor) { +ol.format.Polyline.decodeDeltas = function(encoded, stride, opt_factor) { var factor = goog.isDef(opt_factor) ? opt_factor : 1e5; var d; /** @type {Array.} */ - var lastNumbers = new Array(dimension); - for (d = 0; d < dimension; ++d) { + var lastNumbers = new Array(stride); + for (d = 0; d < stride; ++d) { lastNumbers[d] = 0; } @@ -107,7 +93,7 @@ ol.format.Polyline.decodeDeltas = function(encoded, dimension, opt_factor) { var i, ii; for (i = 0, ii = numbers.length; i < ii;) { - for (d = 0; d < dimension; ++d, ++i) { + for (d = 0; d < stride; ++d, ++i) { lastNumbers[d] += numbers[i]; numbers[i] = lastNumbers[d]; @@ -128,10 +114,10 @@ ol.format.Polyline.decodeDeltas = function(encoded, dimension, opt_factor) { * multiplied. The remaining decimal places will get rounded away. * Default is `1e5`. * @return {string} The encoded string. + * @todo api */ ol.format.Polyline.encodeFloats = function(numbers, opt_factor) { var factor = goog.isDef(opt_factor) ? opt_factor : 1e5; - var i, ii; for (i = 0, ii = numbers.length; i < ii; ++i) { numbers[i] = Math.round(numbers[i] * factor); @@ -148,6 +134,7 @@ ol.format.Polyline.encodeFloats = function(numbers, opt_factor) { * @param {number=} opt_factor The factor by which the result will be divided. * Default is `1e5`. * @return {Array.} A list of floating point numbers. + * @todo api */ ol.format.Polyline.decodeFloats = function(encoded, opt_factor) { var factor = goog.isDef(opt_factor) ? opt_factor : 1e5; @@ -256,6 +243,17 @@ ol.format.Polyline.encodeUnsignedInteger = function(num) { }; +/** + * Read the feature from the Polyline source. + * + * @function + * @param {ArrayBuffer|Document|Node|Object|string} source Source. + * @return {ol.Feature} Feature. + * @todo api + */ +ol.format.Polyline.prototype.readFeature; + + /** * @inheritDoc */ @@ -265,6 +263,18 @@ ol.format.Polyline.prototype.readFeatureFromText = function(text) { }; +/** + * Read the feature from the source. As Polyline sources contain a single + * feature, this will return the feature in an array. + * + * @function + * @param {ArrayBuffer|Document|Node|Object|string} source Source. + * @return {Array.} Features. + * @todo api + */ +ol.format.Polyline.prototype.readFeatures; + + /** * @inheritDoc */ @@ -274,17 +284,39 @@ ol.format.Polyline.prototype.readFeaturesFromText = function(text) { }; +/** + * Read the geometry from the source. + * + * @function + * @param {ArrayBuffer|Document|Node|Object|string} source Source. + * @return {ol.geom.Geometry} Geometry. + * @todo api + */ +ol.format.Polyline.prototype.readGeometry; + + /** * @inheritDoc */ ol.format.Polyline.prototype.readGeometryFromText = function(text) { - var flatCoordinates = ol.format.Polyline.decodeFlatCoordinates(text, 2); + var flatCoordinates = ol.format.Polyline.decodeDeltas(text, 2, this.factor_); var coordinates = ol.geom.flat.inflate.coordinates( flatCoordinates, 0, flatCoordinates.length, 2); return new ol.geom.LineString(coordinates); }; +/** + * Read the projection from a Polyline source. + * + * @function + * @param {ArrayBuffer|Document|Node|Object|string} source Source. + * @return {ol.proj.Projection} Projection. + * @todo api + */ +ol.format.Polyline.prototype.readProjection; + + /** * @inheritDoc */ @@ -316,6 +348,17 @@ ol.format.Polyline.prototype.writeFeaturesText = function(features) { }; +/** + * Write a single geometry in Polyline format. + * + * @function + * @param {ol.geom.Geometry} geometry Geometry. + * @return {string} Geometry. + * @todo api + */ +ol.format.Polyline.prototype.writeGeometry; + + /** * @inheritDoc */ @@ -323,5 +366,5 @@ ol.format.Polyline.prototype.writeGeometryText = function(geometry) { goog.asserts.assertInstanceof(geometry, ol.geom.LineString); var flatCoordinates = geometry.getFlatCoordinates(); var stride = geometry.getStride(); - return ol.format.Polyline.encodeFlatCoordinates(flatCoordinates, stride); + return ol.format.Polyline.encodeDeltas(flatCoordinates, stride, this.factor_); }; diff --git a/test/spec/ol/format/polylineformat.test.js b/test/spec/ol/format/polylineformat.test.js index 8190eae7e0..ff38fb6a79 100644 --- a/test/spec/ol/format/polylineformat.test.js +++ b/test/spec/ol/format/polylineformat.test.js @@ -34,27 +34,6 @@ describe('ol.format.Polyline', function() { beforeEach(resetTestingData); - - describe('encodeFlatCoordinates', function() { - it('returns expected value', function() { - var encodeFlatCoordinates = ol.format.Polyline.encodeFlatCoordinates; - - // from the "Encoded Polyline Algorithm Format" page at Google - expect(encodeFlatCoordinates(flatPoints)).to.eql(encodedFlatPoints); - }); - }); - - describe('decodeFlatCoordinates', function() { - it('returns expected value', function() { - var decodeFlatCoordinates = ol.format.Polyline.decodeFlatCoordinates; - - // from the "Encoded Polyline Algorithm Format" page at Google - expect(decodeFlatCoordinates(encodedFlatPoints)).to.eql(flatPoints); - }); - }); - - - describe('encodeDeltas', function() { it('returns expected value', function() { var encodeDeltas = ol.format.Polyline.encodeDeltas;