From 2850c761cf37cbcb0edcb0ce7e98cffcf842a4ef Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Wed, 25 Sep 2013 15:06:53 +0200 Subject: [PATCH 1/9] Remove use of shared vertices in geom package --- src/ol/geom/geometry.js | 30 +++------- src/ol/geom/linearring.js | 6 +- src/ol/geom/linestring.js | 86 ++++++---------------------- src/ol/geom/multilinestring.js | 22 ++----- src/ol/geom/multipoint.js | 27 ++------- src/ol/geom/multipolygon.js | 22 ++----- src/ol/geom/point.js | 43 +++----------- src/ol/geom/polygon.js | 22 +------ test/spec/ol/geom/linestring.test.js | 43 -------------- test/spec/ol/geom/point.test.js | 46 --------------- test/spec/ol/geom/polygon.test.js | 11 ---- 11 files changed, 54 insertions(+), 304 deletions(-) diff --git a/src/ol/geom/geometry.js b/src/ol/geom/geometry.js index 383c255fa1..0d148b9bda 100644 --- a/src/ol/geom/geometry.js +++ b/src/ol/geom/geometry.js @@ -2,22 +2,13 @@ goog.provide('ol.geom.Geometry'); goog.provide('ol.geom.GeometryType'); goog.require('ol.Extent'); -goog.require('ol.geom.SharedVertices'); /** * @constructor */ -ol.geom.Geometry = function() { - - /** - * @type {ol.geom.SharedVertices} - * @protected - */ - this.vertices = null; - -}; +ol.geom.Geometry = function() {}; /** @@ -28,8 +19,7 @@ ol.geom.Geometry.prototype.dimension; /** - * Create a clone of this geometry. The clone will not be represented in any - * shared structure. + * Create a clone of this geometry. * @return {ol.geom.Geometry} The cloned geometry. */ ol.geom.Geometry.prototype.clone = function() { @@ -53,15 +43,6 @@ ol.geom.Geometry.prototype.getBounds = goog.abstractMethod; ol.geom.Geometry.prototype.getCoordinates = goog.abstractMethod; -/** - * Get the shared vertices for this geometry. - * @return {ol.geom.SharedVertices} The shared vertices. - */ -ol.geom.Geometry.prototype.getSharedVertices = function() { - return this.vertices; -}; - - /** * Get the geometry type. * @return {ol.geom.GeometryType} The geometry type. @@ -69,6 +50,13 @@ ol.geom.Geometry.prototype.getSharedVertices = function() { ol.geom.Geometry.prototype.getType = goog.abstractMethod; +/** + * Transform a geometry in place. + * @param {ol.TransformFunction} transform Transform function. + */ +ol.geom.Geometry.prototype.transform = goog.abstractMethod; + + /** * Geometry types. * diff --git a/src/ol/geom/linearring.js b/src/ol/geom/linearring.js index 5fb5e5a3ef..fb7eb418eb 100644 --- a/src/ol/geom/linearring.js +++ b/src/ol/geom/linearring.js @@ -3,7 +3,6 @@ goog.provide('ol.geom.LinearRing'); goog.require('ol.CoordinateArray'); goog.require('ol.geom.GeometryType'); goog.require('ol.geom.LineString'); -goog.require('ol.geom.SharedVertices'); @@ -12,10 +11,9 @@ goog.require('ol.geom.SharedVertices'); * @extends {ol.geom.LineString} * @param {ol.CoordinateArray} coordinates Vertex array (e.g. * [[x0, y0], [x1, y1]]). - * @param {ol.geom.SharedVertices=} opt_shared Shared vertices. */ -ol.geom.LinearRing = function(coordinates, opt_shared) { - goog.base(this, coordinates, opt_shared); +ol.geom.LinearRing = function(coordinates) { + goog.base(this, coordinates); /** * We're intentionally not enforcing that rings be closed right now. This diff --git a/src/ol/geom/linestring.js b/src/ol/geom/linestring.js index 682d474a18..82c498a822 100644 --- a/src/ol/geom/linestring.js +++ b/src/ol/geom/linestring.js @@ -2,47 +2,34 @@ goog.provide('ol.geom.LineString'); goog.require('goog.asserts'); goog.require('ol.CoordinateArray'); +goog.require('ol.extent'); goog.require('ol.geom'); goog.require('ol.geom.Geometry'); goog.require('ol.geom.GeometryType'); -goog.require('ol.geom.SharedVertices'); /** * @constructor * @extends {ol.geom.Geometry} - * @param {ol.CoordinateArray} coordinates Vertex array (e.g. + * @param {ol.CoordinateArray} coordinates Array of coordinates (e.g. * [[x0, y0], [x1, y1]]). - * @param {ol.geom.SharedVertices=} opt_shared Shared vertices. */ -ol.geom.LineString = function(coordinates, opt_shared) { +ol.geom.LineString = function(coordinates) { goog.base(this); goog.asserts.assert(goog.isArray(coordinates[0])); - var vertices = opt_shared, - dimension; - - if (!goog.isDef(vertices)) { - dimension = coordinates[0].length; - vertices = new ol.geom.SharedVertices({dimension: dimension}); - } - /** - * @type {ol.geom.SharedVertices} - */ - this.vertices = vertices; - - /** - * @type {number} + * Array of coordinates. + * @type {ol.CoordinateArray} * @private */ - this.sharedId_ = vertices.add(coordinates); + this.coordinates_ = coordinates; /** * @type {number} */ - this.dimension = vertices.getDimension(); + this.dimension = coordinates[0].length; goog.asserts.assert(this.dimension >= 2); /** @@ -62,7 +49,9 @@ goog.inherits(ol.geom.LineString, ol.geom.Geometry); * @return {number} The vertex coordinate value. */ ol.geom.LineString.prototype.get = function(index, dim) { - return this.vertices.get(this.sharedId_, index, dim); + var coordinates = this.getCoordinates(); + goog.asserts.assert(coordinates.length > index); + return coordinates[index][dim]; }; @@ -71,17 +60,7 @@ ol.geom.LineString.prototype.get = function(index, dim) { * @return {ol.CoordinateArray} Coordinates array. */ ol.geom.LineString.prototype.getCoordinates = function() { - var count = this.getCount(); - var coordinates = new Array(count); - var vertex; - for (var i = 0; i < count; ++i) { - vertex = new Array(this.dimension); - for (var j = 0; j < this.dimension; ++j) { - vertex[j] = this.get(i, j); - } - coordinates[i] = vertex; - } - return coordinates; + return this.coordinates_; }; @@ -90,7 +69,7 @@ ol.geom.LineString.prototype.getCoordinates = function() { * @return {number} The vertex count. */ ol.geom.LineString.prototype.getCount = function() { - return this.vertices.getCount(this.sharedId_); + return this.getCoordinates().length; }; @@ -99,34 +78,12 @@ ol.geom.LineString.prototype.getCount = function() { */ ol.geom.LineString.prototype.getBounds = function() { if (goog.isNull(this.bounds_)) { - var dimension = this.dimension, - vertices = this.vertices, - id = this.sharedId_, - count = vertices.getCount(id), - start = vertices.getStart(id), - end = start + (count * dimension), - coordinates = vertices.coordinates, - minX, maxX, - minY, maxY, - x, y, i; - - minX = maxX = coordinates[start]; - minY = maxY = coordinates[start + 1]; - for (i = start + dimension; i < end; i += dimension) { - x = coordinates[i]; - y = coordinates[i + 1]; - if (x < minX) { - minX = x; - } else if (x > maxX) { - maxX = x; - } - if (y < minY) { - minY = y; - } else if (y > maxY) { - maxY = y; - } + var coordinates = this.getCoordinates(); + var extent = ol.extent.createEmpty(); + for (var i = 0, ii = coordinates.length; i < ii; ++i) { + ol.extent.extendCoordinate(extent, coordinates[i]); } - this.bounds_ = [minX, minY, maxX, maxY]; + this.bounds_ = extent; } return this.bounds_; }; @@ -140,15 +97,6 @@ ol.geom.LineString.prototype.getType = function() { }; -/** - * Get the identifier used to mark this line in the shared vertices structure. - * @return {number} The identifier. - */ -ol.geom.LineString.prototype.getSharedId = function() { - return this.sharedId_; -}; - - /** * Calculate the distance from a coordinate to this linestring. * diff --git a/src/ol/geom/multilinestring.js b/src/ol/geom/multilinestring.js index a884e7411b..8fbf3b34e3 100644 --- a/src/ol/geom/multilinestring.js +++ b/src/ol/geom/multilinestring.js @@ -5,7 +5,6 @@ goog.require('ol.CoordinateArray'); goog.require('ol.geom.AbstractCollection'); goog.require('ol.geom.GeometryType'); goog.require('ol.geom.LineString'); -goog.require('ol.geom.SharedVertices'); @@ -13,21 +12,11 @@ goog.require('ol.geom.SharedVertices'); * @constructor * @extends {ol.geom.AbstractCollection} * @param {Array.} coordinates Coordinates array. - * @param {ol.geom.SharedVertices=} opt_shared Shared vertices. */ -ol.geom.MultiLineString = function(coordinates, opt_shared) { +ol.geom.MultiLineString = function(coordinates) { goog.base(this); goog.asserts.assert(goog.isArray(coordinates[0][0])); - var vertices = opt_shared, - dimension; - - if (!goog.isDef(vertices)) { - // try to get dimension from first vertex in first line - dimension = coordinates[0][0].length; - vertices = new ol.geom.SharedVertices({dimension: dimension}); - } - var numParts = coordinates.length; /** @@ -35,13 +24,13 @@ ol.geom.MultiLineString = function(coordinates, opt_shared) { */ this.components = new Array(numParts); for (var i = 0; i < numParts; ++i) { - this.components[i] = new ol.geom.LineString(coordinates[i], vertices); + this.components[i] = new ol.geom.LineString(coordinates[i]); } /** * @type {number} */ - this.dimension = vertices.getDimension(); + this.dimension = coordinates[0][0].length; }; goog.inherits(ol.geom.MultiLineString, ol.geom.AbstractCollection); @@ -78,14 +67,13 @@ ol.geom.MultiLineString.prototype.distanceFromCoordinate = * Create a multi-linestring geometry from an array of linestring geometries. * * @param {Array.} geometries Array of geometries. - * @param {ol.geom.SharedVertices=} opt_shared Shared vertices. * @return {ol.geom.MultiLineString} A new geometry. */ -ol.geom.MultiLineString.fromParts = function(geometries, opt_shared) { +ol.geom.MultiLineString.fromParts = function(geometries) { var count = geometries.length; var coordinates = new Array(count); for (var i = 0; i < count; ++i) { coordinates[i] = geometries[i].getCoordinates(); } - return new ol.geom.MultiLineString(coordinates, opt_shared); + return new ol.geom.MultiLineString(coordinates); }; diff --git a/src/ol/geom/multipoint.js b/src/ol/geom/multipoint.js index ce9e0c100e..0c10481599 100644 --- a/src/ol/geom/multipoint.js +++ b/src/ol/geom/multipoint.js @@ -5,7 +5,6 @@ goog.require('ol.CoordinateArray'); goog.require('ol.geom.AbstractCollection'); goog.require('ol.geom.GeometryType'); goog.require('ol.geom.Point'); -goog.require('ol.geom.SharedVertices'); @@ -13,26 +12,11 @@ goog.require('ol.geom.SharedVertices'); * @constructor * @extends {ol.geom.AbstractCollection} * @param {ol.CoordinateArray} coordinates Coordinates array. - * @param {ol.geom.SharedVertices=} opt_shared Shared vertices. */ -ol.geom.MultiPoint = function(coordinates, opt_shared) { +ol.geom.MultiPoint = function(coordinates) { goog.base(this); goog.asserts.assert(goog.isArray(coordinates[0])); - var vertices = opt_shared, - dimension; - - if (!goog.isDef(vertices)) { - // try to get dimension from first vertex - dimension = coordinates[0].length; - vertices = new ol.geom.SharedVertices({dimension: dimension}); - } - - /** - * @type {ol.geom.SharedVertices} - */ - this.vertices = vertices; - var numParts = coordinates.length; /** @@ -40,13 +24,13 @@ ol.geom.MultiPoint = function(coordinates, opt_shared) { */ this.components = new Array(numParts); for (var i = 0; i < numParts; ++i) { - this.components[i] = new ol.geom.Point(coordinates[i], vertices); + this.components[i] = new ol.geom.Point(coordinates[i]); } /** * @type {number} */ - this.dimension = vertices.getDimension(); + this.dimension = coordinates[0].length; }; goog.inherits(ol.geom.MultiPoint, ol.geom.AbstractCollection); @@ -64,14 +48,13 @@ ol.geom.MultiPoint.prototype.getType = function() { * Create a multi-point geometry from an array of point geometries. * * @param {Array.} geometries Array of geometries. - * @param {ol.geom.SharedVertices=} opt_shared Shared vertices. * @return {ol.geom.MultiPoint} A new geometry. */ -ol.geom.MultiPoint.fromParts = function(geometries, opt_shared) { +ol.geom.MultiPoint.fromParts = function(geometries) { var count = geometries.length; var coordinates = new Array(count); for (var i = 0; i < count; ++i) { coordinates[i] = geometries[i].getCoordinates(); } - return new ol.geom.MultiPoint(coordinates, opt_shared); + return new ol.geom.MultiPoint(coordinates); }; diff --git a/src/ol/geom/multipolygon.js b/src/ol/geom/multipolygon.js index be355cfd65..48601b32e3 100644 --- a/src/ol/geom/multipolygon.js +++ b/src/ol/geom/multipolygon.js @@ -5,7 +5,6 @@ goog.require('ol.CoordinateArray'); goog.require('ol.geom.AbstractCollection'); goog.require('ol.geom.GeometryType'); goog.require('ol.geom.Polygon'); -goog.require('ol.geom.SharedVertices'); @@ -14,21 +13,11 @@ goog.require('ol.geom.SharedVertices'); * @extends {ol.geom.AbstractCollection} * @param {Array.>} coordinates Coordinates * array. - * @param {ol.geom.SharedVertices=} opt_shared Shared vertices. */ -ol.geom.MultiPolygon = function(coordinates, opt_shared) { +ol.geom.MultiPolygon = function(coordinates) { goog.base(this); goog.asserts.assert(goog.isArray(coordinates[0][0][0])); - var vertices = opt_shared, - dimension; - - if (!goog.isDef(vertices)) { - // try to get dimension from first vertex in first ring of the first poly - dimension = coordinates[0][0][0].length; - vertices = new ol.geom.SharedVertices({dimension: dimension}); - } - var numParts = coordinates.length; /** @@ -36,13 +25,13 @@ ol.geom.MultiPolygon = function(coordinates, opt_shared) { */ this.components = new Array(numParts); for (var i = 0; i < numParts; ++i) { - this.components[i] = new ol.geom.Polygon(coordinates[i], vertices); + this.components[i] = new ol.geom.Polygon(coordinates[i]); } /** * @type {number} */ - this.dimension = vertices.getDimension(); + this.dimension = coordinates[0][0][0].length; }; goog.inherits(ol.geom.MultiPolygon, ol.geom.AbstractCollection); @@ -78,14 +67,13 @@ ol.geom.MultiPolygon.prototype.containsCoordinate = function(coordinate) { * Create a multi-polygon geometry from an array of polygon geometries. * * @param {Array.} geometries Array of geometries. - * @param {ol.geom.SharedVertices=} opt_shared Shared vertices. * @return {ol.geom.MultiPolygon} A new geometry. */ -ol.geom.MultiPolygon.fromParts = function(geometries, opt_shared) { +ol.geom.MultiPolygon.fromParts = function(geometries) { var count = geometries.length; var coordinates = new Array(count); for (var i = 0; i < count; ++i) { coordinates[i] = geometries[i].getCoordinates(); } - return new ol.geom.MultiPolygon(coordinates, opt_shared); + return new ol.geom.MultiPolygon(coordinates); }; diff --git a/src/ol/geom/point.js b/src/ol/geom/point.js index b65f21fc18..3682170257 100644 --- a/src/ol/geom/point.js +++ b/src/ol/geom/point.js @@ -4,42 +4,28 @@ goog.require('goog.asserts'); goog.require('ol.Coordinate'); goog.require('ol.geom.Geometry'); goog.require('ol.geom.GeometryType'); -goog.require('ol.geom.SharedVertices'); /** * @constructor * @extends {ol.geom.Geometry} - * @param {ol.Coordinate} coordinates Coordinates array (e.g. [x, y]). - * @param {ol.geom.SharedVertices=} opt_shared Shared vertices. + * @param {ol.Coordinate} coordinates Coordinate values (e.g. [x, y]). */ -ol.geom.Point = function(coordinates, opt_shared) { +ol.geom.Point = function(coordinates) { goog.base(this); - var vertices = opt_shared, - dimension; - - if (!goog.isDef(vertices)) { - dimension = coordinates.length; - vertices = new ol.geom.SharedVertices({dimension: dimension}); - } - /** - * @type {ol.geom.SharedVertices} - */ - this.vertices = vertices; - - /** - * @type {number} + * Point coordinate values. + * @type {ol.Coordinate} * @private */ - this.sharedId_ = vertices.add([coordinates]); + this.coordinates_ = coordinates; /** * @type {number} */ - this.dimension = vertices.getDimension(); + this.dimension = coordinates.length; goog.asserts.assert(this.dimension >= 2); /** @@ -57,7 +43,7 @@ goog.inherits(ol.geom.Point, ol.geom.Geometry); * @return {number} The coordinate value. */ ol.geom.Point.prototype.get = function(dim) { - return this.vertices.get(this.sharedId_, 0, dim); + return this.getCoordinates()[dim]; }; @@ -79,11 +65,7 @@ ol.geom.Point.prototype.getBounds = function() { * @return {ol.Coordinate} Coordinates array. */ ol.geom.Point.prototype.getCoordinates = function() { - var coordinates = new Array(this.dimension); - for (var i = 0; i < this.dimension; ++i) { - coordinates[i] = this.get(i); - } - return coordinates; + return this.coordinates_; }; @@ -93,12 +75,3 @@ ol.geom.Point.prototype.getCoordinates = function() { ol.geom.Point.prototype.getType = function() { return ol.geom.GeometryType.POINT; }; - - -/** - * Get the identifier used to mark this point in the shared vertices structure. - * @return {number} The identifier. - */ -ol.geom.Point.prototype.getSharedId = function() { - return this.sharedId_; -}; diff --git a/src/ol/geom/polygon.js b/src/ol/geom/polygon.js index 2f442a56e4..995fa6dfb9 100644 --- a/src/ol/geom/polygon.js +++ b/src/ol/geom/polygon.js @@ -6,7 +6,6 @@ goog.require('ol.extent'); goog.require('ol.geom.Geometry'); goog.require('ol.geom.GeometryType'); goog.require('ol.geom.LinearRing'); -goog.require('ol.geom.SharedVertices'); @@ -21,32 +20,17 @@ goog.require('ol.geom.SharedVertices'); * @extends {ol.geom.Geometry} * @param {Array.} coordinates Array of rings. First * is outer, any remaining are inner. - * @param {ol.geom.SharedVertices=} opt_shared Shared vertices. */ -ol.geom.Polygon = function(coordinates, opt_shared) { +ol.geom.Polygon = function(coordinates) { goog.base(this); goog.asserts.assert(goog.isArray(coordinates[0][0])); - var vertices = opt_shared, - dimension; - - if (!goog.isDef(vertices)) { - // try to get dimension from first vertex in first ring - dimension = coordinates[0][0].length; - vertices = new ol.geom.SharedVertices({dimension: dimension}); - } - /** * @private * @type {ol.Coordinate} */ this.labelPoint_ = null; - /** - * @type {ol.geom.SharedVertices} - */ - this.vertices = vertices; - var numRings = coordinates.length; /** @@ -67,13 +51,13 @@ ol.geom.Polygon = function(coordinates, opt_shared) { ringCoords.reverse(); } } - this.rings[i] = new ol.geom.LinearRing(ringCoords, vertices); + this.rings[i] = new ol.geom.LinearRing(ringCoords); } /** * @type {number} */ - this.dimension = vertices.getDimension(); + this.dimension = coordinates[0][0].length; goog.asserts.assert(this.dimension >= 2); }; diff --git a/test/spec/ol/geom/linestring.test.js b/test/spec/ol/geom/linestring.test.js index 39f6ff3693..aadaccdd38 100644 --- a/test/spec/ol/geom/linestring.test.js +++ b/test/spec/ol/geom/linestring.test.js @@ -10,14 +10,6 @@ describe('ol.geom.LineString', function() { expect(line).to.be.a(ol.geom.Geometry); }); - it('accepts shared vertices', function() { - var vertices = new ol.geom.SharedVertices(); - var l1 = new ol.geom.LineString([[10, 20], [30, 40]], vertices); - var l2 = new ol.geom.LineString([[50, 60], [70, 80]], vertices); - expect(l1.getCoordinates()).to.eql([[10, 20], [30, 40]]); - expect(l2.getCoordinates()).to.eql([[50, 60], [70, 80]]); - }); - }); describe('#dimension', function() { @@ -56,42 +48,7 @@ describe('ol.geom.LineString', function() { }); - describe('#getSharedId()', function() { - - it('returns identifiers', function() { - var vertices = new ol.geom.SharedVertices(); - - var l1 = new ol.geom.LineString([[10, 20], [30, 40]], vertices); - var l2 = new ol.geom.LineString( - [[50, 60], [70, 80], [90, 100]], vertices); - - var id1 = l1.getSharedId(); - var id2 = l2.getSharedId(); - - expect(vertices.coordinates).to.eql( - [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]); - - expect(vertices.getStart(id1)).to.be(0); - expect(vertices.getCount(id1)).to.be(2); - expect(vertices.get(id1, 0, 0)).to.be(10); - expect(vertices.get(id1, 0, 1)).to.be(20); - expect(vertices.get(id1, 1, 0)).to.be(30); - expect(vertices.get(id1, 1, 1)).to.be(40); - - expect(vertices.getStart(id2)).to.be(4); - expect(vertices.getCount(id2)).to.be(3); - expect(vertices.get(id2, 0, 0)).to.be(50); - expect(vertices.get(id2, 0, 1)).to.be(60); - expect(vertices.get(id2, 1, 0)).to.be(70); - expect(vertices.get(id2, 1, 1)).to.be(80); - expect(vertices.get(id2, 2, 0)).to.be(90); - expect(vertices.get(id2, 2, 1)).to.be(100); - }); - - }); - }); goog.require('ol.geom.Geometry'); goog.require('ol.geom.LineString'); -goog.require('ol.geom.SharedVertices'); diff --git a/test/spec/ol/geom/point.test.js b/test/spec/ol/geom/point.test.js index ff3e7db02e..d72a8be839 100644 --- a/test/spec/ol/geom/point.test.js +++ b/test/spec/ol/geom/point.test.js @@ -10,16 +10,6 @@ describe('ol.geom.Point', function() { expect(point).to.be.a(ol.geom.Geometry); }); - it('accepts shared vertices', function() { - var vertices = new ol.geom.SharedVertices(); - var p1 = new ol.geom.Point([10, 20], vertices); - var p2 = new ol.geom.Point([30, 40], vertices); - var p3 = new ol.geom.Point([50, 60], vertices); - expect(p1.getCoordinates()).to.eql([10, 20]); - expect(p2.getCoordinates()).to.eql([30, 40]); - expect(p3.getCoordinates()).to.eql([50, 60]); - }); - it('throws when given with insufficient dimensions', function() { expect(function() { var point = new ol.geom.Point([1]); @@ -65,43 +55,7 @@ describe('ol.geom.Point', function() { }); - - describe('#getSharedId()', function() { - - it('returns identifiers', function() { - var vertices = new ol.geom.SharedVertices(); - - var p1 = new ol.geom.Point([10, 20], vertices); - var p2 = new ol.geom.Point([30, 40], vertices); - var p3 = new ol.geom.Point([50, 60], vertices); - - var id1 = p1.getSharedId(); - var id2 = p2.getSharedId(); - var id3 = p3.getSharedId(); - - expect(vertices.coordinates).to.eql( - [10, 20, 30, 40, 50, 60]); - - expect(vertices.getStart(id1)).to.be(0); - expect(vertices.getCount(id1)).to.be(1); - expect(vertices.get(id1, 0, 0)).to.be(10); - expect(vertices.get(id1, 0, 1)).to.be(20); - - expect(vertices.getStart(id2)).to.be(2); - expect(vertices.getCount(id2)).to.be(1); - expect(vertices.get(id2, 0, 0)).to.be(30); - expect(vertices.get(id2, 0, 1)).to.be(40); - - expect(vertices.getStart(id3)).to.be(4); - expect(vertices.getCount(id3)).to.be(1); - expect(vertices.get(id3, 0, 0)).to.be(50); - expect(vertices.get(id3, 0, 1)).to.be(60); - }); - - }); - }); goog.require('ol.geom.Geometry'); goog.require('ol.geom.Point'); -goog.require('ol.geom.SharedVertices'); diff --git a/test/spec/ol/geom/polygon.test.js b/test/spec/ol/geom/polygon.test.js index 4cac05c9e7..a13209573f 100644 --- a/test/spec/ol/geom/polygon.test.js +++ b/test/spec/ol/geom/polygon.test.js @@ -14,16 +14,6 @@ describe('ol.geom.Polygon', function() { expect(poly).to.be.a(ol.geom.Geometry); }); - it('accepts shared vertices', function() { - var vertices = new ol.geom.SharedVertices(); - var p1 = new ol.geom.Polygon([outer], vertices); - var p2 = new ol.geom.Polygon([outer, inner1], vertices); - var p3 = new ol.geom.Polygon([outer, inner2], vertices); - expect(p1.getCoordinates()).to.eql([outer]); - expect(p2.getCoordinates()).to.eql([outer, inner1]); - expect(p3.getCoordinates()).to.eql([outer, inner2]); - }); - }); describe('#rings', function() { @@ -102,4 +92,3 @@ describe('ol.geom.Polygon', function() { goog.require('ol.geom.Geometry'); goog.require('ol.geom.LinearRing'); goog.require('ol.geom.Polygon'); -goog.require('ol.geom.SharedVertices'); From e1ba1d8887604951495c57d6f13d40c2d8ace578 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Wed, 25 Sep 2013 15:11:19 +0200 Subject: [PATCH 2/9] Remove use of shared structures in feature parsers --- src/ol/parser/featureparser.js | 18 --- src/ol/parser/geojsonparser.js | 105 +++++------- src/ol/parser/gpxparser.js | 35 +--- src/ol/parser/kmlparser.js | 68 ++------ src/ol/parser/ogc/gmlparser.js | 39 ++--- src/ol/parser/topojsonparser.js | 140 +++++----------- test/spec/ol/parser/geojson.test.js | 232 +-------------------------- test/spec/ol/parser/topojson.test.js | 26 +-- 8 files changed, 116 insertions(+), 547 deletions(-) diff --git a/src/ol/parser/featureparser.js b/src/ol/parser/featureparser.js index d284865c1c..cd614b4f91 100644 --- a/src/ol/parser/featureparser.js +++ b/src/ol/parser/featureparser.js @@ -2,7 +2,6 @@ goog.provide('ol.parser.AsyncObjectFeatureParser'); goog.provide('ol.parser.AsyncStringFeatureParser'); goog.provide('ol.parser.DomFeatureParser'); goog.provide('ol.parser.ObjectFeatureParser'); -goog.provide('ol.parser.ReadFeaturesOptions'); goog.provide('ol.parser.ReadFeaturesResult'); goog.provide('ol.parser.StringFeatureParser'); @@ -18,7 +17,6 @@ ol.parser.DomFeatureParser = function() {}; /** * @param {Element|Document} node Document or element node. - * @param {ol.parser.ReadFeaturesOptions=} opt_options Feature reading options. * @return {ol.parser.ReadFeaturesResult} Features and metadata. */ ol.parser.DomFeatureParser.prototype.readFeaturesFromNode = @@ -34,7 +32,6 @@ ol.parser.ObjectFeatureParser = function() {}; /** * @param {Object} obj Object representing features. - * @param {ol.parser.ReadFeaturesOptions=} opt_options Feature reading options. * @return {ol.parser.ReadFeaturesResult} Features and metadata. */ ol.parser.ObjectFeatureParser.prototype.readFeaturesFromObject = @@ -50,7 +47,6 @@ ol.parser.StringFeatureParser = function() {}; /** * @param {string} data String data. - * @param {ol.parser.ReadFeaturesOptions=} opt_options Feature reading options. * @return {ol.parser.ReadFeaturesResult} Features and metadata. */ ol.parser.StringFeatureParser.prototype.readFeaturesFromString = @@ -68,7 +64,6 @@ ol.parser.AsyncStringFeatureParser = function() {}; * @param {string} data String data. * @param {function(ol.parser.ReadFeaturesResult)} callback Callback which is * called after parsing. - * @param {ol.parser.ReadFeaturesOptions=} opt_options Feature reading options. */ ol.parser.AsyncStringFeatureParser.prototype.readFeaturesFromStringAsync = goog.abstractMethod; @@ -85,30 +80,17 @@ ol.parser.AsyncObjectFeatureParser = function() {}; * @param {Object} obj Object representing features. * @param {function(ol.parser.ReadFeaturesResult)} callback Callback which is * called after parsing. - * @param {ol.parser.ReadFeaturesOptions=} opt_options Feature reading options. */ ol.parser.AsyncObjectFeatureParser.prototype.readFeaturesFromObjectAsync = goog.abstractMethod; -/** - * @typedef {function(ol.Feature, ol.geom.GeometryType):ol.geom.SharedVertices} - */ -ol.parser.ReadFeaturesCallback; - - /** * @typedef {{projection: ol.proj.ProjectionLike}} */ ol.parser.ReadFeaturesMetadata; -/** - * @typedef {{callback: ol.parser.ReadFeaturesCallback}} - */ -ol.parser.ReadFeaturesOptions; - - /** * @typedef {{features: Array., * metadata: ol.parser.ReadFeaturesMetadata}} diff --git a/src/ol/parser/geojsonparser.js b/src/ol/parser/geojsonparser.js index ad648cbf9a..7e448188e3 100644 --- a/src/ol/parser/geojsonparser.js +++ b/src/ol/parser/geojsonparser.js @@ -12,9 +12,7 @@ goog.require('ol.geom.MultiPoint'); goog.require('ol.geom.MultiPolygon'); goog.require('ol.geom.Point'); goog.require('ol.geom.Polygon'); -goog.require('ol.geom.SharedVertices'); goog.require('ol.parser.Parser'); -goog.require('ol.parser.ReadFeaturesOptions'); goog.require('ol.parser.ReadFeaturesResult'); goog.require('ol.parser.StringFeatureParser'); @@ -60,13 +58,11 @@ ol.parser.GeoJSON.read = function(str) { /** * Parse a GeoJSON feature collection. * @param {string} str GeoJSON feature collection. - * @param {ol.parser.ReadFeaturesOptions=} opt_options Reader options. * @return {ol.parser.ReadFeaturesResult} Features and metadata. */ -ol.parser.GeoJSON.prototype.readFeaturesFromString = - function(str, opt_options) { +ol.parser.GeoJSON.prototype.readFeaturesFromString = function(str) { var json = /** @type {GeoJSONFeatureCollection} */ (JSON.parse(str)); - return this.parseAsFeatureCollection_(json, opt_options); + return this.parseAsFeatureCollection_(json); }; @@ -74,43 +70,38 @@ ol.parser.GeoJSON.prototype.readFeaturesFromString = * Parse a GeoJSON feature collection from decoded JSON. * @param {GeoJSONFeatureCollection} object GeoJSON feature collection decoded * from JSON. - * @param {ol.parser.ReadFeaturesOptions=} opt_options Reader options. * @return {ol.parser.ReadFeaturesResult} Features and metadata. */ -ol.parser.GeoJSON.prototype.readFeaturesFromObject = - function(object, opt_options) { - return this.parseAsFeatureCollection_(object, opt_options); +ol.parser.GeoJSON.prototype.readFeaturesFromObject = function(object) { + return this.parseAsFeatureCollection_(object); }; /** - * Parse any GeoJSON object. Note that this method should not be called - * recursively due to the shared vertex creation. + * Parse any GeoJSON object. * * @param {GeoJSONObject} json GeoJSON object. - * @param {ol.parser.ReadFeaturesOptions=} opt_options Reader options. * @return {ol.Feature|Array.| * ol.geom.Geometry|Array.} Parsed geometry or array * of geometries. * @private */ -ol.parser.GeoJSON.prototype.parse_ = function(json, opt_options) { +ol.parser.GeoJSON.prototype.parse_ = function(json) { var result; if (json.type === 'FeatureCollection') { result = this.parseFeatureCollection_( - /** @type {GeoJSONFeatureCollection} */ (json), opt_options); + /** @type {GeoJSONFeatureCollection} */ (json)); } else if (json.type === 'Feature') { result = this.parseFeature_( - /** @type {GeoJSONFeature} */ (json), opt_options); + /** @type {GeoJSONFeature} */ (json)); } else if (json.type === 'GeometryCollection') { result = this.parseGeometryCollection_( - /** @type {GeoJSONGeometryCollection} */ (json), opt_options); + /** @type {GeoJSONGeometryCollection} */ (json)); } else { // we've been called with a geometry or an unknown object // create a feature to get shared vertices handling var feature = this.parseFeature_( - /** @type {GeoJSONFeature} */ ({type: 'Feature', geometry: json}), - opt_options); + /** @type {GeoJSONFeature} */ ({type: 'Feature', geometry: json})); result = feature.getGeometry(); } return result; @@ -119,14 +110,12 @@ ol.parser.GeoJSON.prototype.parse_ = function(json, opt_options) { /** * @param {GeoJSONObject} json GeoJSON object. - * @param {ol.parser.ReadFeaturesOptions=} opt_options Reader options. * @return {ol.parser.ReadFeaturesResult} Parsed object coerced into array of * features. * @private */ -ol.parser.GeoJSON.prototype.parseAsFeatureCollection_ = function(json, - opt_options) { - var obj = this.parse_(json, opt_options); +ol.parser.GeoJSON.prototype.parseAsFeatureCollection_ = function(json) { + var obj = this.parse_(json); var features = []; var feature; if (obj instanceof ol.Feature) { @@ -164,45 +153,36 @@ ol.parser.GeoJSON.prototype.parseAsFeatureCollection_ = function(json, /** * @param {GeoJSONFeature} json GeoJSON feature. - * @param {ol.parser.ReadFeaturesOptions=} opt_options Read options. * @return {ol.Feature} Parsed feature. * @private */ -ol.parser.GeoJSON.prototype.parseFeature_ = function(json, opt_options) { +ol.parser.GeoJSON.prototype.parseFeature_ = function(json) { var geomJson = json.geometry, - geometry = null, - options = opt_options || {}; + geometry = null; var feature = new ol.Feature(json.properties); if (goog.isDef(json.id)) { feature.setId(json.id); } if (geomJson) { var type = geomJson.type; - var callback = options.callback; - var sharedVertices; - if (callback) { - goog.asserts.assert(type in ol.parser.GeoJSON.GeometryType, - 'Bad geometry type: ' + type); - sharedVertices = callback(feature, ol.parser.GeoJSON.GeometryType[type]); - } switch (type) { case 'Point': - geometry = this.parsePoint_(geomJson, sharedVertices); + geometry = this.parsePoint_(geomJson); break; case 'LineString': - geometry = this.parseLineString_(geomJson, sharedVertices); + geometry = this.parseLineString_(geomJson); break; case 'Polygon': - geometry = this.parsePolygon_(geomJson, sharedVertices); + geometry = this.parsePolygon_(geomJson); break; case 'MultiPoint': - geometry = this.parseMultiPoint_(geomJson, sharedVertices); + geometry = this.parseMultiPoint_(geomJson); break; case 'MultiLineString': - geometry = this.parseMultiLineString_(geomJson, sharedVertices); + geometry = this.parseMultiLineString_(geomJson); break; case 'MultiPolygon': - geometry = this.parseMultiPolygon_(geomJson, sharedVertices); + geometry = this.parseMultiPolygon_(geomJson); break; default: throw new Error('Bad geometry type: ' + type); @@ -215,20 +195,17 @@ ol.parser.GeoJSON.prototype.parseFeature_ = function(json, opt_options) { /** * @param {GeoJSONFeatureCollection} json GeoJSON feature collection. - * @param {ol.parser.ReadFeaturesOptions=} opt_options Read options. * @return {Array.} Parsed array of features. * @private */ -ol.parser.GeoJSON.prototype.parseFeatureCollection_ = function( - json, opt_options) { +ol.parser.GeoJSON.prototype.parseFeatureCollection_ = function(json) { var features = json.features, len = features.length, result = new Array(len), i; for (i = 0; i < len; ++i) { - result[i] = this.parseFeature_( - /** @type {GeoJSONFeature} */ (features[i]), opt_options); + result[i] = this.parseFeature_(/** @type {GeoJSONFeature} */ (features[i])); } return result; }; @@ -236,20 +213,17 @@ ol.parser.GeoJSON.prototype.parseFeatureCollection_ = function( /** * @param {GeoJSONGeometryCollection} json GeoJSON geometry collection. - * @param {ol.parser.ReadFeaturesOptions=} opt_options Read options. * @return {Array.} Parsed array of geometries. * @private */ -ol.parser.GeoJSON.prototype.parseGeometryCollection_ = function(json, - opt_options) { +ol.parser.GeoJSON.prototype.parseGeometryCollection_ = function(json) { var geometries = json.geometries, len = geometries.length, result = new Array(len), i; for (i = 0; i < len; ++i) { - result[i] = this.parse_(/** @type {GeoJSONGeometry} */ (geometries[i]), - opt_options); + result[i] = this.parse_(/** @type {GeoJSONGeometry} */ (geometries[i])); } return result; }; @@ -257,68 +231,61 @@ ol.parser.GeoJSON.prototype.parseGeometryCollection_ = function(json, /** * @param {GeoJSONGeometry} json GeoJSON linestring. - * @param {ol.geom.SharedVertices=} opt_vertices Shared vertices. * @return {ol.geom.LineString} Parsed linestring. * @private */ -ol.parser.GeoJSON.prototype.parseLineString_ = function(json, opt_vertices) { - return new ol.geom.LineString(json.coordinates, opt_vertices); +ol.parser.GeoJSON.prototype.parseLineString_ = function(json) { + return new ol.geom.LineString(json.coordinates); }; /** * @param {GeoJSONGeometry} json GeoJSON multi-linestring. - * @param {ol.geom.SharedVertices=} opt_vertices Shared vertices. * @return {ol.geom.MultiLineString} Parsed multi-linestring. * @private */ -ol.parser.GeoJSON.prototype.parseMultiLineString_ = function( - json, opt_vertices) { - return new ol.geom.MultiLineString(json.coordinates, opt_vertices); +ol.parser.GeoJSON.prototype.parseMultiLineString_ = function(json) { + return new ol.geom.MultiLineString(json.coordinates); }; /** * @param {GeoJSONGeometry} json GeoJSON multi-point. - * @param {ol.geom.SharedVertices=} opt_vertices Shared vertices. * @return {ol.geom.MultiPoint} Parsed multi-point. * @private */ -ol.parser.GeoJSON.prototype.parseMultiPoint_ = function(json, opt_vertices) { - return new ol.geom.MultiPoint(json.coordinates, opt_vertices); +ol.parser.GeoJSON.prototype.parseMultiPoint_ = function(json) { + return new ol.geom.MultiPoint(json.coordinates); }; /** * @param {GeoJSONGeometry} json GeoJSON multi-polygon. - * @param {ol.geom.SharedVertices=} opt_vertices Shared vertices. * @return {ol.geom.MultiPolygon} Parsed multi-polygon. * @private */ -ol.parser.GeoJSON.prototype.parseMultiPolygon_ = function(json, opt_vertices) { - return new ol.geom.MultiPolygon(json.coordinates, opt_vertices); +ol.parser.GeoJSON.prototype.parseMultiPolygon_ = function(json) { + return new ol.geom.MultiPolygon(json.coordinates); }; /** * @param {GeoJSONGeometry} json GeoJSON point. - * @param {ol.geom.SharedVertices=} opt_vertices Shared vertices. * @return {ol.geom.Point} Parsed point. * @private */ -ol.parser.GeoJSON.prototype.parsePoint_ = function(json, opt_vertices) { - return new ol.geom.Point(json.coordinates, opt_vertices); +ol.parser.GeoJSON.prototype.parsePoint_ = function(json) { + return new ol.geom.Point(json.coordinates); }; /** * @param {GeoJSONGeometry} json GeoJSON polygon. - * @param {ol.geom.SharedVertices=} opt_vertices Shared vertices. * @return {ol.geom.Polygon} Parsed polygon. * @private */ -ol.parser.GeoJSON.prototype.parsePolygon_ = function(json, opt_vertices) { - return new ol.geom.Polygon(json.coordinates, opt_vertices); +ol.parser.GeoJSON.prototype.parsePolygon_ = function(json) { + return new ol.geom.Polygon(json.coordinates); }; diff --git a/src/ol/parser/gpxparser.js b/src/ol/parser/gpxparser.js index a8e0f61057..9648360d87 100644 --- a/src/ol/parser/gpxparser.js +++ b/src/ol/parser/gpxparser.js @@ -9,7 +9,6 @@ goog.require('ol.geom.Point'); goog.require('ol.geom.Polygon'); goog.require('ol.parser.DomFeatureParser'); goog.require('ol.parser.ObjectFeatureParser'); -goog.require('ol.parser.ReadFeaturesOptions'); goog.require('ol.parser.StringFeatureParser'); goog.require('ol.parser.XML'); @@ -58,14 +57,7 @@ ol.parser.GPX = function(opt_options) { parseFloat(node.getAttribute('lat'))]; this.readChildNodes(node, properties); var feature = new ol.Feature(properties); - var sharedVertices; - if (this.readFeaturesOptions_) { - var callback = this.readFeaturesOptions_.callback; - if (callback) { - sharedVertices = callback(feature, ol.geom.GeometryType.POINT); - } - } - var geometry = new ol.geom.Point(coordinates, sharedVertices); + var geometry = new ol.geom.Point(coordinates); feature.setGeometry(geometry); obj.features.push(feature); } @@ -82,15 +74,7 @@ ol.parser.GPX = function(opt_options) { }; this.readChildNodes(node, container); var feature = new ol.Feature(container.properties); - var sharedVertices; - if (this.readFeaturesOptions_) { - var callback = this.readFeaturesOptions_.callback; - if (callback) { - sharedVertices = callback(feature, type); - } - } - var geometry = new ol.geom.LineString(container.geometry.coordinates, - sharedVertices); + var geometry = new ol.geom.LineString(container.geometry.coordinates); feature.setGeometry(geometry); obj.features.push(feature); } @@ -255,12 +239,9 @@ ol.parser.GPX.prototype.read = function(data) { /** * Parse a GPX document provided as a string. * @param {string} str GPX document. - * @param {ol.parser.ReadFeaturesOptions=} opt_options Reader options. * @return {ol.parser.ReadFeaturesResult} Features and metadata. */ -ol.parser.GPX.prototype.readFeaturesFromString = - function(str, opt_options) { - this.readFeaturesOptions_ = opt_options; +ol.parser.GPX.prototype.readFeaturesFromString = function(str) { return this.read(str); }; @@ -268,24 +249,18 @@ ol.parser.GPX.prototype.readFeaturesFromString = /** * Parse a GPX document provided as a DOM structure. * @param {Element|Document} node Document or element node. - * @param {ol.parser.ReadFeaturesOptions=} opt_options Feature reading options. * @return {ol.parser.ReadFeaturesResult} Features and metadata. */ -ol.parser.GPX.prototype.readFeaturesFromNode = - function(node, opt_options) { - this.readFeaturesOptions_ = opt_options; +ol.parser.GPX.prototype.readFeaturesFromNode = function(node) { return this.read(node); }; /** * @param {Object} obj Object representing features. - * @param {ol.parser.ReadFeaturesOptions=} opt_options Feature reading options. * @return {ol.parser.ReadFeaturesResult} Features and metadata. */ -ol.parser.GPX.prototype.readFeaturesFromObject = - function(obj, opt_options) { - this.readFeaturesOptions_ = opt_options; +ol.parser.GPX.prototype.readFeaturesFromObject = function(obj) { return this.read(obj); }; diff --git a/src/ol/parser/kmlparser.js b/src/ol/parser/kmlparser.js index d10945df1b..00817e985e 100644 --- a/src/ol/parser/kmlparser.js +++ b/src/ol/parser/kmlparser.js @@ -20,11 +20,9 @@ goog.require('ol.geom.MultiPoint'); goog.require('ol.geom.MultiPolygon'); goog.require('ol.geom.Point'); goog.require('ol.geom.Polygon'); -goog.require('ol.geom.SharedVertices'); goog.require('ol.parser.AsyncObjectFeatureParser'); goog.require('ol.parser.AsyncStringFeatureParser'); goog.require('ol.parser.DomFeatureParser'); -goog.require('ol.parser.ReadFeaturesOptions'); goog.require('ol.parser.StringFeatureParser'); goog.require('ol.parser.XML'); goog.require('ol.style.Fill'); @@ -104,7 +102,6 @@ ol.parser.KML = function(opt_options) { }, 'Placemark': function(node, obj) { var container = {properties: {}}; - var sharedVertices, callback; var id = node.getAttribute('id'); this.readChildNodes(node, container); if (goog.isDef(container.track)) { @@ -132,15 +129,7 @@ ol.parser.KML = function(opt_options) { } var geom = track.points[i]; if (geom) { - sharedVertices = undefined; - if (this.readFeaturesOptions_) { - callback = this.readFeaturesOptions_.callback; - if (callback) { - sharedVertices = callback(feature, geom.type); - } - } - var geometry = this.createGeometry_({geometry: geom}, - sharedVertices); + var geometry = this.createGeometry_({geometry: geom}); if (goog.isDef(geometry)) { feature.setGeometry(geometry); } @@ -159,14 +148,7 @@ ol.parser.KML = function(opt_options) { feature.setId(id); } if (container.geometry) { - sharedVertices = undefined; - if (this.readFeaturesOptions_) { - callback = this.readFeaturesOptions_.callback; - if (callback) { - sharedVertices = callback(feature, container.geometry.type); - } - } - geometry = this.createGeometry_(container, sharedVertices); + geometry = this.createGeometry_(container); if (goog.isDef(geometry)) { feature.setGeometry(geometry); } @@ -850,11 +832,8 @@ goog.inherits(ol.parser.KML, ol.parser.XML); * @param {Object} obj Object representing features. * @param {function(ol.parser.ReadFeaturesResult)} callback Callback which is * called after parsing. - * @param {ol.parser.ReadFeaturesOptions=} opt_options Feature reading options. */ -ol.parser.KML.prototype.readFeaturesFromObjectAsync = - function(obj, callback, opt_options) { - this.readFeaturesOptions_ = opt_options; +ol.parser.KML.prototype.readFeaturesFromObjectAsync = function(obj, callback) { this.read(obj, callback); }; @@ -863,11 +842,8 @@ ol.parser.KML.prototype.readFeaturesFromObjectAsync = * @param {string} str String data. * @param {function(ol.parser.ReadFeaturesResult)} * callback Callback which is called after parsing. - * @param {ol.parser.ReadFeaturesOptions=} opt_options Feature reading options. */ -ol.parser.KML.prototype.readFeaturesFromStringAsync = - function(str, callback, opt_options) { - this.readFeaturesOptions_ = opt_options; +ol.parser.KML.prototype.readFeaturesFromStringAsync = function(str, callback) { this.read(str, callback); }; @@ -875,12 +851,9 @@ ol.parser.KML.prototype.readFeaturesFromStringAsync = /** * Parse a KML document provided as a string. * @param {string} str KML document. - * @param {ol.parser.ReadFeaturesOptions=} opt_options Reader options. * @return {ol.parser.ReadFeaturesResult} Features and metadata. */ -ol.parser.KML.prototype.readFeaturesFromString = - function(str, opt_options) { - this.readFeaturesOptions_ = opt_options; +ol.parser.KML.prototype.readFeaturesFromString = function(str) { return /** @type {ol.parser.ReadFeaturesResult} */ (this.read(str)); }; @@ -888,24 +861,18 @@ ol.parser.KML.prototype.readFeaturesFromString = /** * Parse a KML document provided as a DOM structure. * @param {Element|Document} node Document or element node. - * @param {ol.parser.ReadFeaturesOptions=} opt_options Feature reading options. * @return {ol.parser.ReadFeaturesResult} Features and metadata. */ -ol.parser.KML.prototype.readFeaturesFromNode = - function(node, opt_options) { - this.readFeaturesOptions_ = opt_options; +ol.parser.KML.prototype.readFeaturesFromNode = function(node) { return /** @type {ol.parser.ReadFeaturesResult} */ (this.read(node)); }; /** * @param {Object} obj Object representing features. - * @param {ol.parser.ReadFeaturesOptions=} opt_options Feature reading options. * @return {ol.parser.ReadFeaturesResult} Features and metadata. */ -ol.parser.KML.prototype.readFeaturesFromObject = - function(obj, opt_options) { - this.readFeaturesOptions_ = opt_options; +ol.parser.KML.prototype.readFeaturesFromObject = function(obj) { return /** @type {ol.parser.ReadFeaturesResult} */ (this.read(obj)); }; @@ -1028,52 +995,47 @@ ol.parser.KML.prototype.applyStyle_ = function(feature, styles, /** * @private * @param {Object} container Geometry container. - * @param {ol.geom.SharedVertices=} opt_vertices Shared vertices. * @return {ol.geom.Geometry} The geometry created. */ -ol.parser.KML.prototype.createGeometry_ = function(container, - opt_vertices) { +ol.parser.KML.prototype.createGeometry_ = function(container) { var geometry = null, coordinates, i, ii; switch (container.geometry.type) { case ol.geom.GeometryType.POINT: - geometry = new ol.geom.Point(container.geometry.coordinates, - opt_vertices); + geometry = new ol.geom.Point(container.geometry.coordinates); break; case ol.geom.GeometryType.LINESTRING: - geometry = new ol.geom.LineString(container.geometry.coordinates, - opt_vertices); + geometry = new ol.geom.LineString(container.geometry.coordinates); break; case ol.geom.GeometryType.POLYGON: - geometry = new ol.geom.Polygon(container.geometry.coordinates, - opt_vertices); + geometry = new ol.geom.Polygon(container.geometry.coordinates); break; case ol.geom.GeometryType.MULTIPOINT: coordinates = []; for (i = 0, ii = container.geometry.parts.length; i < ii; i++) { coordinates.push(container.geometry.parts[i].coordinates); } - geometry = new ol.geom.MultiPoint(coordinates, opt_vertices); + geometry = new ol.geom.MultiPoint(coordinates); break; case ol.geom.GeometryType.MULTILINESTRING: coordinates = []; for (i = 0, ii = container.geometry.parts.length; i < ii; i++) { coordinates.push(container.geometry.parts[i].coordinates); } - geometry = new ol.geom.MultiLineString(coordinates, opt_vertices); + geometry = new ol.geom.MultiLineString(coordinates); break; case ol.geom.GeometryType.MULTIPOLYGON: coordinates = []; for (i = 0, ii = container.geometry.parts.length; i < ii; i++) { coordinates.push(container.geometry.parts[i].coordinates); } - geometry = new ol.geom.MultiPolygon(coordinates, opt_vertices); + geometry = new ol.geom.MultiPolygon(coordinates); break; case ol.geom.GeometryType.GEOMETRYCOLLECTION: var geometries = []; for (i = 0, ii = container.geometry.parts.length; i < ii; i++) { geometries.push(this.createGeometry_({ geometry: container.geometry.parts[i] - }, opt_vertices)); + })); } geometry = new ol.geom.GeometryCollection(geometries); break; diff --git a/src/ol/parser/ogc/gmlparser.js b/src/ol/parser/ogc/gmlparser.js index 35bf2302ef..250e845714 100644 --- a/src/ol/parser/ogc/gmlparser.js +++ b/src/ol/parser/ogc/gmlparser.js @@ -303,15 +303,7 @@ ol.parser.ogc.GML = function(opt_options) { var feature = new ol.Feature(container.properties); var geom = container.geometry; if (geom) { - var sharedVertices = undefined; - if (this.readFeaturesOptions_) { - var callback = this.readFeaturesOptions_.callback; - if (callback) { - sharedVertices = callback(feature, geom.type); - } - } - var geometry = this.createGeometry({geometry: geom}, - sharedVertices); + var geometry = this.createGeometry({geometry: geom}); if (goog.isDef(geometry)) { feature.setGeometry(geometry); } @@ -551,57 +543,51 @@ ol.parser.ogc.GML.prototype.readNode = function(node, obj, opt_first) { /** * @param {Object} container Geometry container. - * @param {ol.geom.SharedVertices=} opt_vertices Shared vertices. * @return {ol.geom.Geometry} The geometry created. */ // TODO use a mixin since this is also used in the KML parser -ol.parser.ogc.GML.prototype.createGeometry = function(container, - opt_vertices) { +ol.parser.ogc.GML.prototype.createGeometry = function(container) { var geometry = null, coordinates, i, ii; switch (container.geometry.type) { case ol.geom.GeometryType.POINT: - geometry = new ol.geom.Point(container.geometry.coordinates, - opt_vertices); + geometry = new ol.geom.Point(container.geometry.coordinates); break; case ol.geom.GeometryType.LINEARRING: - geometry = new ol.geom.LinearRing(container.geometry.coordinates, - opt_vertices); + geometry = new ol.geom.LinearRing(container.geometry.coordinates); break; case ol.geom.GeometryType.LINESTRING: - geometry = new ol.geom.LineString(container.geometry.coordinates, - opt_vertices); + geometry = new ol.geom.LineString(container.geometry.coordinates); break; case ol.geom.GeometryType.POLYGON: - geometry = new ol.geom.Polygon(container.geometry.coordinates, - opt_vertices); + geometry = new ol.geom.Polygon(container.geometry.coordinates); break; case ol.geom.GeometryType.MULTIPOINT: coordinates = []; for (i = 0, ii = container.geometry.parts.length; i < ii; i++) { coordinates.push(container.geometry.parts[i].coordinates); } - geometry = new ol.geom.MultiPoint(coordinates, opt_vertices); + geometry = new ol.geom.MultiPoint(coordinates); break; case ol.geom.GeometryType.MULTILINESTRING: coordinates = []; for (i = 0, ii = container.geometry.parts.length; i < ii; i++) { coordinates.push(container.geometry.parts[i].coordinates); } - geometry = new ol.geom.MultiLineString(coordinates, opt_vertices); + geometry = new ol.geom.MultiLineString(coordinates); break; case ol.geom.GeometryType.MULTIPOLYGON: coordinates = []; for (i = 0, ii = container.geometry.parts.length; i < ii; i++) { coordinates.push(container.geometry.parts[i].coordinates); } - geometry = new ol.geom.MultiPolygon(coordinates, opt_vertices); + geometry = new ol.geom.MultiPolygon(coordinates); break; case ol.geom.GeometryType.GEOMETRYCOLLECTION: var geometries = []; for (i = 0, ii = container.geometry.parts.length; i < ii; i++) { geometries.push(this.createGeometry({ geometry: container.geometry.parts[i] - }, opt_vertices)); + })); } geometry = new ol.geom.GeometryCollection(geometries); break; @@ -615,12 +601,9 @@ ol.parser.ogc.GML.prototype.createGeometry = function(container, /** * Parse a GML document provided as a string. * @param {string} str GML document. - * @param {ol.parser.ReadFeaturesOptions=} opt_options Reader options. * @return {ol.parser.ReadFeaturesResult} Features and metadata. */ -ol.parser.ogc.GML.prototype.readFeaturesFromString = - function(str, opt_options) { - this.readFeaturesOptions_ = opt_options; +ol.parser.ogc.GML.prototype.readFeaturesFromString = function(str) { return this.read(str); }; diff --git a/src/ol/parser/topojsonparser.js b/src/ol/parser/topojsonparser.js index 0dcccb8165..8bcbaf57e6 100644 --- a/src/ol/parser/topojsonparser.js +++ b/src/ol/parser/topojsonparser.js @@ -3,7 +3,6 @@ goog.provide('ol.parser.TopoJSON'); goog.require('ol.Coordinate'); goog.require('ol.CoordinateArray'); goog.require('ol.Feature'); -goog.require('ol.geom.GeometryType'); goog.require('ol.geom.LineString'); goog.require('ol.geom.MultiLineString'); goog.require('ol.geom.MultiPoint'); @@ -11,7 +10,6 @@ goog.require('ol.geom.MultiPolygon'); goog.require('ol.geom.Point'); goog.require('ol.geom.Polygon'); goog.require('ol.parser.Parser'); -goog.require('ol.parser.ReadFeaturesOptions'); goog.require('ol.parser.StringFeatureParser'); @@ -23,18 +21,7 @@ goog.require('ol.parser.StringFeatureParser'); * @implements {ol.parser.StringFeatureParser} * @extends {ol.parser.Parser} */ -ol.parser.TopoJSON = function() { - - /** - * Common feature for all shared vertex creation. - * // TODO: make feature optional in shared vertex callback - * - * @type {ol.Feature} - * @private - */ - this.feature_ = new ol.Feature(); - -}; +ol.parser.TopoJSON = function() {}; goog.inherits(ol.parser.TopoJSON, ol.parser.Parser); goog.addSingletonGetter(ol.parser.TopoJSON); @@ -65,6 +52,10 @@ ol.parser.TopoJSON.prototype.concatenateArcs_ = function(indices, arcs) { } coordinates.push.apply(coordinates, arc); } + // provide fresh copies of coordinate arrays + for (var j = 0, jj = coordinates.length; j < jj; ++j) { + coordinates[j] = coordinates[j].slice(); + } return coordinates; }; @@ -84,17 +75,17 @@ ol.parser.TopoJSON.prototype.read = function(str) { * Create features from a TopoJSON topology string. * * @param {string} str TopoJSON topology string. - * @param {ol.parser.ReadFeaturesOptions=} opt_options Reader options. * @return {ol.parser.ReadFeaturesResult} Features and metadata. */ -ol.parser.TopoJSON.prototype.readFeaturesFromString = - function(str, opt_options) { +ol.parser.TopoJSON.prototype.readFeaturesFromString = function(str) { var topology = /** @type {TopoJSONTopology} */ (JSON.parse(str)); if (topology.type !== 'Topology') { throw new Error('Not a "Topology" type object'); } - return {features: this.readFeaturesFromTopology_(topology, opt_options), - metadata: {projection: 'EPSG:4326'}}; + return { + features: this.readFeaturesFromTopology_(topology), + metadata: {projection: 'EPSG:4326'} + }; }; @@ -102,16 +93,16 @@ ol.parser.TopoJSON.prototype.readFeaturesFromString = * Create features from a TopoJSON topology object. * * @param {TopoJSONTopology} topology TopoJSON topology object. - * @param {ol.parser.ReadFeaturesOptions=} opt_options Reader options. * @return {ol.parser.ReadFeaturesResult} Features and metadata. */ -ol.parser.TopoJSON.prototype.readFeaturesFromObject = - function(topology, opt_options) { +ol.parser.TopoJSON.prototype.readFeaturesFromObject = function(topology) { if (topology.type !== 'Topology') { throw new Error('Not a "Topology" type object'); } - return {features: this.readFeaturesFromTopology_(topology, opt_options), - metadata: {projection: 'EPSG:4326'}}; + return { + features: this.readFeaturesFromTopology_(topology), + metadata: {projection: 'EPSG:4326'} + }; }; @@ -122,32 +113,30 @@ ol.parser.TopoJSON.prototype.readFeaturesFromObject = * @param {Array.} arcs Array of arcs. * @param {Array.} scale Scale for each dimension. * @param {Array.} translate Translation for each dimension. - * @param {ol.parser.ReadFeaturesOptions=} opt_options Reader options. * @return {ol.Feature} Feature. * @private */ ol.parser.TopoJSON.prototype.readFeatureFromGeometry_ = function(object, arcs, - scale, translate, opt_options) { + scale, translate) { var geometry; var type = object.type; if (type === 'Point') { geometry = this.readPoint_(/** @type {TopoJSONPoint} */ (object), scale, - translate, opt_options); + translate); } else if (type === 'LineString') { geometry = this.readLineString_(/** @type {TopoJSONLineString} */ (object), - arcs, opt_options); + arcs); } else if (type === 'Polygon') { - geometry = this.readPolygon_(/** @type {TopoJSONPolygon} */ (object), arcs, - opt_options); + geometry = this.readPolygon_(/** @type {TopoJSONPolygon} */ (object), arcs); } else if (type === 'MultiPoint') { geometry = this.readMultiPoint_(/** @type {TopoJSONMultiPoint} */ (object), - scale, translate, opt_options); + scale, translate); } else if (type === 'MultiLineString') { geometry = this.readMultiLineString_( - /** @type {TopoJSONMultiLineString} */(object), arcs, opt_options); + /** @type {TopoJSONMultiLineString} */(object), arcs); } else if (type === 'MultiPolygon') { geometry = this.readMultiPolygon_( - /** @type {TopoJSONMultiPolygon} */ (object), arcs, opt_options); + /** @type {TopoJSONMultiPolygon} */ (object), arcs); } else { throw new Error('Unsupported geometry type: ' + type); } @@ -168,18 +157,17 @@ ol.parser.TopoJSON.prototype.readFeatureFromGeometry_ = function(object, arcs, * @param {Array.} arcs Array of arcs. * @param {Array.} scale Scale for each dimension. * @param {Array.} translate Translation for each dimension. - * @param {ol.parser.ReadFeaturesOptions=} opt_options Reader options. * @return {Array.} Array of features. * @private */ ol.parser.TopoJSON.prototype.readFeaturesFromGeometryCollection_ = function( - collection, arcs, scale, translate, opt_options) { + collection, arcs, scale, translate) { var geometries = collection.geometries; var num = geometries.length; var features = new Array(num); for (var i = 0; i < num; ++i) { features[i] = this.readFeatureFromGeometry_(geometries[i], arcs, scale, - translate, opt_options); + translate); } return features; }; @@ -187,12 +175,10 @@ ol.parser.TopoJSON.prototype.readFeaturesFromGeometryCollection_ = function( /** * @param {TopoJSONTopology} topology TopoJSON object. - * @param {ol.parser.ReadFeaturesOptions=} opt_options Reader options. * @return {Array.} Parsed features. * @private */ -ol.parser.TopoJSON.prototype.readFeaturesFromTopology_ = function( - topology, opt_options) { +ol.parser.TopoJSON.prototype.readFeaturesFromTopology_ = function(topology) { var transform = topology.transform; var scale = transform.scale; var translate = transform.translate; @@ -204,11 +190,11 @@ ol.parser.TopoJSON.prototype.readFeaturesFromTopology_ = function( if (objects[key].type === 'GeometryCollection') { features.push.apply(features, this.readFeaturesFromGeometryCollection_( /** @type {TopoJSONGeometryCollection} */ (objects[key]), - arcs, scale, translate, opt_options)); + arcs, scale, translate)); } else { features.push(this.readFeatureFromGeometry_( /** @type {TopoJSONGeometry} */ (objects[key]), - arcs, scale, translate, opt_options)); + arcs, scale, translate)); } } return features; @@ -220,20 +206,12 @@ ol.parser.TopoJSON.prototype.readFeaturesFromTopology_ = function( * * @param {TopoJSONLineString} object TopoJSON object. * @param {Array.} arcs Array of arcs. - * @param {ol.parser.ReadFeaturesOptions=} opt_options Reader options. * @return {ol.geom.LineString} Geometry. * @private */ -ol.parser.TopoJSON.prototype.readLineString_ = function(object, arcs, - opt_options) { +ol.parser.TopoJSON.prototype.readLineString_ = function(object, arcs) { var coordinates = this.concatenateArcs_(object.arcs, arcs); - // TODO: make feature optional in callback - var callback = opt_options && opt_options.callback; - var sharedVertices; - if (callback) { - sharedVertices = callback(this.feature_, ol.geom.GeometryType.LINESTRING); - } - return new ol.geom.LineString(coordinates, sharedVertices); + return new ol.geom.LineString(coordinates); }; @@ -242,26 +220,17 @@ ol.parser.TopoJSON.prototype.readLineString_ = function(object, arcs, * * @param {TopoJSONMultiLineString} object TopoJSON object. * @param {Array.} arcs Array of arcs. - * @param {ol.parser.ReadFeaturesOptions=} opt_options Reader options. * @return {ol.geom.MultiLineString} Geometry. * @private */ -ol.parser.TopoJSON.prototype.readMultiLineString_ = function(object, arcs, - opt_options) { +ol.parser.TopoJSON.prototype.readMultiLineString_ = function(object, arcs) { var array = object.arcs; // I'm out of good names var num = array.length; var coordinates = new Array(num); for (var i = 0; i < num; ++i) { coordinates[i] = this.concatenateArcs_(array[i], arcs); } - // TODO: make feature optional in callback - var callback = opt_options && opt_options.callback; - var sharedVertices; - if (callback) { - sharedVertices = callback(this.feature_, - ol.geom.GeometryType.MULTILINESTRING); - } - return new ol.geom.MultiLineString(coordinates, sharedVertices); + return new ol.geom.MultiLineString(coordinates); }; @@ -271,23 +240,16 @@ ol.parser.TopoJSON.prototype.readMultiLineString_ = function(object, arcs, * @param {TopoJSONMultiPoint} object TopoJSON object. * @param {Array.} scale Scale for each dimension. * @param {Array.} translate Translation for each dimension. - * @param {ol.parser.ReadFeaturesOptions=} opt_options Reader options. * @return {ol.geom.MultiPoint} Geometry. * @private */ ol.parser.TopoJSON.prototype.readMultiPoint_ = function(object, scale, - translate, opt_options) { + translate) { var coordinates = object.coordinates; for (var i = 0, ii = coordinates.length; i < ii; ++i) { this.transformVertex_(coordinates[i], scale, translate); } - // TODO: make feature optional in callback - var callback = opt_options && opt_options.callback; - var sharedVertices; - if (callback) { - sharedVertices = callback(this.feature_, ol.geom.GeometryType.MULTIPOINT); - } - return new ol.geom.MultiPoint(coordinates, sharedVertices); + return new ol.geom.MultiPoint(coordinates); }; @@ -296,12 +258,10 @@ ol.parser.TopoJSON.prototype.readMultiPoint_ = function(object, scale, * * @param {TopoJSONMultiPolygon} object TopoJSON object. * @param {Array.} arcs Array of arcs. - * @param {ol.parser.ReadFeaturesOptions=} opt_options Reader options. * @return {ol.geom.MultiPolygon} Geometry. * @private */ -ol.parser.TopoJSON.prototype.readMultiPolygon_ = function(object, arcs, - opt_options) { +ol.parser.TopoJSON.prototype.readMultiPolygon_ = function(object, arcs) { var array = object.arcs; var numPolys = array.length; var coordinates = new Array(numPolys); @@ -317,13 +277,7 @@ ol.parser.TopoJSON.prototype.readMultiPolygon_ = function(object, arcs, } coordinates[i] = ringCoords; } - // TODO: make feature optional in callback - var callback = opt_options && opt_options.callback; - var sharedVertices; - if (callback) { - sharedVertices = callback(this.feature_, ol.geom.GeometryType.MULTIPOLYGON); - } - return new ol.geom.MultiPolygon(coordinates, sharedVertices); + return new ol.geom.MultiPolygon(coordinates); }; @@ -333,21 +287,13 @@ ol.parser.TopoJSON.prototype.readMultiPolygon_ = function(object, arcs, * @param {TopoJSONPoint} object TopoJSON object. * @param {Array.} scale Scale for each dimension. * @param {Array.} translate Translation for each dimension. - * @param {ol.parser.ReadFeaturesOptions=} opt_options Reader options. * @return {ol.geom.Point} Geometry. * @private */ -ol.parser.TopoJSON.prototype.readPoint_ = function(object, scale, translate, - opt_options) { +ol.parser.TopoJSON.prototype.readPoint_ = function(object, scale, translate) { var coordinates = object.coordinates; this.transformVertex_(coordinates, scale, translate); - // TODO: make feature optional in callback - var callback = opt_options && opt_options.callback; - var sharedVertices; - if (callback) { - sharedVertices = callback(this.feature_, ol.geom.GeometryType.POINT); - } - return new ol.geom.Point(coordinates, sharedVertices); + return new ol.geom.Point(coordinates); }; @@ -356,25 +302,17 @@ ol.parser.TopoJSON.prototype.readPoint_ = function(object, scale, translate, * * @param {TopoJSONPolygon} object TopoJSON object. * @param {Array.} arcs Array of arcs. - * @param {ol.parser.ReadFeaturesOptions=} opt_options Reader options. * @return {ol.geom.Polygon} Geometry. * @private */ -ol.parser.TopoJSON.prototype.readPolygon_ = function(object, arcs, - opt_options) { +ol.parser.TopoJSON.prototype.readPolygon_ = function(object, arcs) { var array = object.arcs; // I'm out of good names var num = array.length; var coordinates = new Array(num); for (var i = 0; i < num; ++i) { coordinates[i] = this.concatenateArcs_(array[i], arcs); } - // TODO: make feature optional in callback - var callback = opt_options && opt_options.callback; - var sharedVertices; - if (callback) { - sharedVertices = callback(this.feature_, ol.geom.GeometryType.POLYGON); - } - return new ol.geom.Polygon(coordinates, sharedVertices); + return new ol.geom.Polygon(coordinates); }; diff --git a/test/spec/ol/parser/geojson.test.js b/test/spec/ol/parser/geojson.test.js index ebba2a1506..c8c7923c32 100644 --- a/test/spec/ol/parser/geojson.test.js +++ b/test/spec/ol/parser/geojson.test.js @@ -218,74 +218,11 @@ describe('ol.parser.GeoJSON', function() { }); }); - it('parses countries.geojson with shared vertices', function() { - afterLoadText('spec/ol/parser/geojson/countries.geojson', function(text) { - var pointVertices = new ol.geom.SharedVertices(); - var lineVertices = new ol.geom.SharedVertices(); - var polygonVertices = new ol.geom.SharedVertices(); - - var lookup = { - 'point': pointVertices, - 'linestring': lineVertices, - 'polygon': polygonVertices, - 'multipoint': pointVertices, - 'multilinstring': lineVertices, - 'multipolygon': polygonVertices - }; - - var callback = function(feature, type) { - return lookup[type]; - }; - - var result = parser.readFeaturesFromString(text, - {callback: callback}).features; - expect(result.length).to.be(179); - - expect(pointVertices.coordinates.length).to.be(0); - expect(lineVertices.coordinates.length).to.be(0); - expect(polygonVertices.coordinates.length).to.be(21344); - - var first = result[0]; - expect(first).to.be.a(ol.Feature); - expect(first.get('name')).to.be('Afghanistan'); - var firstGeom = first.getGeometry(); - expect(firstGeom).to.be.a(ol.geom.Polygon); - expect(ol.extent.equals(firstGeom.getBounds(), - [60.52843, 29.318572, 75.158028, 38.486282])) - .to.be(true); - - var last = result[178]; - expect(last).to.be.a(ol.Feature); - expect(last.get('name')).to.be('Zimbabwe'); - var lastGeom = last.getGeometry(); - expect(lastGeom).to.be.a(ol.geom.Polygon); - expect(ol.extent.equals(lastGeom.getBounds(), - [25.264226, -22.271612, 32.849861, -15.507787])) - .to.be(true); - }); - }); - }); describe('#parseAsFeatureCollection_()', function() { it('generates an array of features for FeatureCollection', function() { - var pointVertices = new ol.geom.SharedVertices(); - var lineVertices = new ol.geom.SharedVertices(); - var polygonVertices = new ol.geom.SharedVertices(); - - var lookup = { - 'point': pointVertices, - 'linestring': lineVertices, - 'polygon': polygonVertices, - 'multipoint': pointVertices, - 'multilinstring': lineVertices, - 'multipolygon': polygonVertices - }; - - var callback = function(feature, type) { - return lookup[type]; - }; var parser = new ol.parser.GeoJSON(); var json = { @@ -310,8 +247,7 @@ describe('ol.parser.GeoJSON', function() { } }] }; - var result = parser.parseAsFeatureCollection_(json, - {callback: callback}); + var result = parser.parseAsFeatureCollection_(json); var features = result.features; expect(features.length).to.be(2); @@ -326,30 +262,10 @@ describe('ol.parser.GeoJSON', function() { expect(second.get('bam')).to.be('baz'); expect(second.getGeometry()).to.be.a(ol.geom.LineString); - expect(pointVertices.coordinates.length).to.be(2); - expect(lineVertices.coordinates.length).to.be(4); - expect(polygonVertices.coordinates.length).to.be(0); - expect(result.metadata.projection).to.be('EPSG:4326'); }); it('reads named crs from top-level object', function() { - var pointVertices = new ol.geom.SharedVertices(); - var lineVertices = new ol.geom.SharedVertices(); - var polygonVertices = new ol.geom.SharedVertices(); - - var lookup = { - 'point': pointVertices, - 'linestring': lineVertices, - 'polygon': polygonVertices, - 'multipoint': pointVertices, - 'multilinstring': lineVertices, - 'multipolygon': polygonVertices - }; - - var callback = function(feature, type) { - return lookup[type]; - }; var parser = new ol.parser.GeoJSON(); var json = { @@ -380,8 +296,7 @@ describe('ol.parser.GeoJSON', function() { } }] }; - var result = parser.parseAsFeatureCollection_(json, - {callback: callback}); + var result = parser.parseAsFeatureCollection_(json); var features = result.features; expect(features.length).to.be(2); @@ -396,30 +311,10 @@ describe('ol.parser.GeoJSON', function() { expect(second.get('bam')).to.be('baz'); expect(second.getGeometry()).to.be.a(ol.geom.LineString); - expect(pointVertices.coordinates.length).to.be(2); - expect(lineVertices.coordinates.length).to.be(4); - expect(polygonVertices.coordinates.length).to.be(0); - expect(result.metadata.projection).to.be('EPSG:1234'); }); it('accepts null crs', function() { - var pointVertices = new ol.geom.SharedVertices(); - var lineVertices = new ol.geom.SharedVertices(); - var polygonVertices = new ol.geom.SharedVertices(); - - var lookup = { - 'point': pointVertices, - 'linestring': lineVertices, - 'polygon': polygonVertices, - 'multipoint': pointVertices, - 'multilinstring': lineVertices, - 'multipolygon': polygonVertices - }; - - var callback = function(feature, type) { - return lookup[type]; - }; var parser = new ol.parser.GeoJSON(); var json = { @@ -445,8 +340,7 @@ describe('ol.parser.GeoJSON', function() { } }] }; - var result = parser.parseAsFeatureCollection_(json, - {callback: callback}); + var result = parser.parseAsFeatureCollection_(json); var features = result.features; expect(features.length).to.be(2); @@ -461,30 +355,10 @@ describe('ol.parser.GeoJSON', function() { expect(second.get('bam')).to.be('baz'); expect(second.getGeometry()).to.be.a(ol.geom.LineString); - expect(pointVertices.coordinates.length).to.be(2); - expect(lineVertices.coordinates.length).to.be(4); - expect(polygonVertices.coordinates.length).to.be(0); - expect(result.metadata.projection).to.be('EPSG:4326'); }); it('generates an array of features for Feature', function() { - var pointVertices = new ol.geom.SharedVertices(); - var lineVertices = new ol.geom.SharedVertices(); - var polygonVertices = new ol.geom.SharedVertices(); - - var lookup = { - 'point': pointVertices, - 'linestring': lineVertices, - 'polygon': polygonVertices, - 'multipoint': pointVertices, - 'multilinstring': lineVertices, - 'multipolygon': polygonVertices - }; - - var callback = function(feature, type) { - return lookup[type]; - }; var parser = new ol.parser.GeoJSON(); var json = { @@ -497,8 +371,7 @@ describe('ol.parser.GeoJSON', function() { coordinates: [[1, 2], [3, 4]] } }; - var result = parser.parseAsFeatureCollection_(json, - {callback: callback}); + var result = parser.parseAsFeatureCollection_(json); var features = result.features; expect(features.length).to.be(1); @@ -508,30 +381,10 @@ describe('ol.parser.GeoJSON', function() { expect(first.get('bam')).to.be('baz'); expect(first.getGeometry()).to.be.a(ol.geom.LineString); - expect(pointVertices.coordinates.length).to.be(0); - expect(lineVertices.coordinates.length).to.be(4); - expect(polygonVertices.coordinates.length).to.be(0); - expect(result.metadata.projection).to.be('EPSG:4326'); }); it('generates an array of features for GeometryCollection', function() { - var pointVertices = new ol.geom.SharedVertices(); - var lineVertices = new ol.geom.SharedVertices(); - var polygonVertices = new ol.geom.SharedVertices(); - - var lookup = { - 'point': pointVertices, - 'linestring': lineVertices, - 'polygon': polygonVertices, - 'multipoint': pointVertices, - 'multilinstring': lineVertices, - 'multipolygon': polygonVertices - }; - - var callback = function(feature, type) { - return lookup[type]; - }; var parser = new ol.parser.GeoJSON(); var json = { @@ -547,8 +400,7 @@ describe('ol.parser.GeoJSON', function() { coordinates: [[[7, 8], [9, 10], [11, 12], [7, 8]]] }] }; - var result = parser.parseAsFeatureCollection_(json, - {callback: callback}); + var result = parser.parseAsFeatureCollection_(json); var features = result.features; expect(features.length).to.be(3); @@ -557,124 +409,57 @@ describe('ol.parser.GeoJSON', function() { expect(features[1].getGeometry()).to.be.a(ol.geom.LineString); expect(features[2].getGeometry()).to.be.a(ol.geom.Polygon); - expect(pointVertices.coordinates.length).to.be(2); - expect(lineVertices.coordinates.length).to.be(4); - expect(polygonVertices.coordinates.length).to.be(8); - expect(result.metadata.projection).to.be('EPSG:4326'); }); it('generates an array of features for Point', function() { - var pointVertices = new ol.geom.SharedVertices(); - var lineVertices = new ol.geom.SharedVertices(); - var polygonVertices = new ol.geom.SharedVertices(); - - var lookup = { - 'point': pointVertices, - 'linestring': lineVertices, - 'polygon': polygonVertices, - 'multipoint': pointVertices, - 'multilinstring': lineVertices, - 'multipolygon': polygonVertices - }; - - var callback = function(feature, type) { - return lookup[type]; - }; var parser = new ol.parser.GeoJSON(); var json = { type: 'Point', coordinates: [1, 2] }; - var result = parser.parseAsFeatureCollection_(json, - {callback: callback}); + var result = parser.parseAsFeatureCollection_(json); var features = result.features; expect(features.length).to.be(1); expect(features[0].getGeometry()).to.be.a(ol.geom.Point); - expect(pointVertices.coordinates.length).to.be(2); - expect(lineVertices.coordinates.length).to.be(0); - expect(polygonVertices.coordinates.length).to.be(0); - expect(result.metadata.projection).to.be('EPSG:4326'); }); it('generates an array of features for LineString', function() { - var pointVertices = new ol.geom.SharedVertices(); - var lineVertices = new ol.geom.SharedVertices(); - var polygonVertices = new ol.geom.SharedVertices(); - - var lookup = { - 'point': pointVertices, - 'linestring': lineVertices, - 'polygon': polygonVertices, - 'multipoint': pointVertices, - 'multilinstring': lineVertices, - 'multipolygon': polygonVertices - }; - - var callback = function(feature, type) { - return lookup[type]; - }; var parser = new ol.parser.GeoJSON(); var json = { type: 'LineString', coordinates: [[3, 4], [5, 6]] }; - var result = parser.parseAsFeatureCollection_(json, - {callback: callback}); + var result = parser.parseAsFeatureCollection_(json); var features = result.features; expect(features.length).to.be(1); expect(features[0].getGeometry()).to.be.a(ol.geom.LineString); - expect(pointVertices.coordinates.length).to.be(0); - expect(lineVertices.coordinates.length).to.be(4); - expect(polygonVertices.coordinates.length).to.be(0); - expect(result.metadata.projection).to.be('EPSG:4326'); }); it('generates an array of features for Polygon', function() { - var pointVertices = new ol.geom.SharedVertices(); - var lineVertices = new ol.geom.SharedVertices(); - var polygonVertices = new ol.geom.SharedVertices(); - - var lookup = { - 'point': pointVertices, - 'linestring': lineVertices, - 'polygon': polygonVertices, - 'multipoint': pointVertices, - 'multilinstring': lineVertices, - 'multipolygon': polygonVertices - }; - - var callback = function(feature, type) { - return lookup[type]; - }; var parser = new ol.parser.GeoJSON(); var json = { type: 'Polygon', coordinates: [[[7, 8], [9, 10], [11, 12], [7, 8]]] }; - var result = parser.parseAsFeatureCollection_(json, - {callback: callback}); + var result = parser.parseAsFeatureCollection_(json); var features = result.features; expect(features.length).to.be(1); expect(features[0].getGeometry()).to.be.a(ol.geom.Polygon); - expect(pointVertices.coordinates.length).to.be(0); - expect(lineVertices.coordinates.length).to.be(0); - expect(polygonVertices.coordinates.length).to.be(8); - expect(result.metadata.projection).to.be('EPSG:4326'); }); @@ -690,5 +475,4 @@ goog.require('ol.geom.LinearRing'); goog.require('ol.geom.LineString'); goog.require('ol.geom.Point'); goog.require('ol.geom.Polygon'); -goog.require('ol.geom.SharedVertices'); goog.require('ol.parser.GeoJSON'); diff --git a/test/spec/ol/parser/topojson.test.js b/test/spec/ol/parser/topojson.test.js index 9cda1170d9..6e83e3014c 100644 --- a/test/spec/ol/parser/topojson.test.js +++ b/test/spec/ol/parser/topojson.test.js @@ -56,33 +56,12 @@ describe('ol.parser.TopoJSON', function() { describe('#readFeaturesFromString()', function() { - it('parses world-110m.geojson with shared vertices', function(done) { + it('parses world-110m.geojson', function(done) { afterLoadText('spec/ol/parser/topojson/world-110m.json', function(text) { - var pointVertices = new ol.geom.SharedVertices(); - var lineVertices = new ol.geom.SharedVertices(); - var polygonVertices = new ol.geom.SharedVertices(); - - var lookup = { - 'point': pointVertices, - 'linestring': lineVertices, - 'polygon': polygonVertices, - 'multipoint': pointVertices, - 'multilinstring': lineVertices, - 'multipolygon': polygonVertices - }; - - var callback = function(feature, type) { - return lookup[type]; - }; - - var result = parser.readFeaturesFromString(text, {callback: callback}); + var result = parser.readFeaturesFromString(text); expect(result.features.length).to.be(178); - expect(pointVertices.coordinates.length).to.be(0); - expect(lineVertices.coordinates.length).to.be(0); - expect(polygonVertices.coordinates.length).to.be(31400); - var first = result.features[0]; expect(first).to.be.a(ol.Feature); var firstGeom = first.getGeometry(); @@ -110,6 +89,5 @@ describe('ol.parser.TopoJSON', function() { goog.require('ol.Feature'); goog.require('ol.geom.MultiPolygon'); goog.require('ol.geom.Polygon'); -goog.require('ol.geom.SharedVertices'); goog.require('ol.parser.Parser'); goog.require('ol.parser.TopoJSON'); From 33457c48de75212cdc2955528e8d4df2cebfa76e Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Wed, 25 Sep 2013 15:59:21 +0200 Subject: [PATCH 3/9] Add transform method to geometries In the typical sequence of parse-transform-render the most efficient place to transform coordinate values is deep within the parser immediately after values have been read (this would avoid a second pass over whatever structure is used to back geometries). To accomplish this transform during parsing, we could add back parser read options to pass the transform function around. Until then, a transform method on geometries is straightforward to implement. This means we do a second pass through coordinate structures to transform, but this is typically done only once immediately after parsing. --- src/ol/geom/abstractcollection.js | 12 ++++++ src/ol/geom/geometry.js | 1 + src/ol/geom/linestring.js | 15 +++++++ src/ol/geom/point.js | 10 +++++ src/ol/geom/polygon.js | 11 +++++ test/spec/ol/geom/linestring.test.js | 32 +++++++++++++++ test/spec/ol/geom/multipoint.test.js | 29 ++++++++++++++ test/spec/ol/geom/point.test.js | 22 ++++++++++ test/spec/ol/geom/polygon.test.js | 60 ++++++++++++++++++++++++++++ 9 files changed, 192 insertions(+) diff --git a/src/ol/geom/abstractcollection.js b/src/ol/geom/abstractcollection.js index eabe5972fd..933f55e946 100644 --- a/src/ol/geom/abstractcollection.js +++ b/src/ol/geom/abstractcollection.js @@ -67,3 +67,15 @@ ol.geom.AbstractCollection.prototype.getCoordinates = function() { * @inheritDoc */ ol.geom.AbstractCollection.prototype.getType = goog.abstractMethod; + + +/** + * @inheritDoc + */ +ol.geom.AbstractCollection.prototype.transform = function(transform) { + var components = this.components; + for (var i = 0, ii = components.length; i < ii; ++i) { + components[i].transform(transform); + } + this.bounds = null; +}; diff --git a/src/ol/geom/geometry.js b/src/ol/geom/geometry.js index 0d148b9bda..4bcc8a1153 100644 --- a/src/ol/geom/geometry.js +++ b/src/ol/geom/geometry.js @@ -2,6 +2,7 @@ goog.provide('ol.geom.Geometry'); goog.provide('ol.geom.GeometryType'); goog.require('ol.Extent'); +goog.require('ol.TransformFunction'); diff --git a/src/ol/geom/linestring.js b/src/ol/geom/linestring.js index 82c498a822..25eec36673 100644 --- a/src/ol/geom/linestring.js +++ b/src/ol/geom/linestring.js @@ -112,3 +112,18 @@ ol.geom.LineString.prototype.distanceFromCoordinate = function(coordinate) { } return Math.sqrt(dist2); }; + + +/** + * @inheritDoc + */ +ol.geom.LineString.prototype.transform = function(transform) { + var coordinates = this.getCoordinates(); + var dimension = this.dimension; + var coord; + for (var i = 0, ii = coordinates.length; i < ii; ++i) { + coord = coordinates[i]; + transform(coord, coord, dimension); + } + this.bounds_ = null; +}; diff --git a/src/ol/geom/point.js b/src/ol/geom/point.js index 3682170257..e06ff70a4f 100644 --- a/src/ol/geom/point.js +++ b/src/ol/geom/point.js @@ -75,3 +75,13 @@ ol.geom.Point.prototype.getCoordinates = function() { ol.geom.Point.prototype.getType = function() { return ol.geom.GeometryType.POINT; }; + + +/** + * @inheritDoc + */ +ol.geom.Point.prototype.transform = function(transform) { + var coordinates = this.getCoordinates(); + transform(coordinates, coordinates, this.dimension); + this.bounds_ = null; +}; diff --git a/src/ol/geom/polygon.js b/src/ol/geom/polygon.js index 995fa6dfb9..a0953e1417 100644 --- a/src/ol/geom/polygon.js +++ b/src/ol/geom/polygon.js @@ -163,3 +163,14 @@ ol.geom.Polygon.prototype.getInteriorPoint = function() { return this.labelPoint_; }; + + +/** + * @inheritDoc + */ +ol.geom.Polygon.prototype.transform = function(transform) { + var rings = this.rings; + for (var i = 0, ii = rings.length; i < ii; ++i) { + rings[i].transform(transform); + } +}; diff --git a/test/spec/ol/geom/linestring.test.js b/test/spec/ol/geom/linestring.test.js index aadaccdd38..11f59ff13f 100644 --- a/test/spec/ol/geom/linestring.test.js +++ b/test/spec/ol/geom/linestring.test.js @@ -48,7 +48,39 @@ describe('ol.geom.LineString', function() { }); + describe('#transform()', function() { + + var forward = ol.proj.getTransform('EPSG:4326', 'EPSG:3857'); + var inverse = ol.proj.getTransform('EPSG:3857', 'EPSG:4326'); + + it('forward transforms a linestring in place', function() { + var line = new ol.geom.LineString([[10, 20], [20, 30], [30, 40]]); + line.transform(forward); + expect(line.get(0, 0)).to.roughlyEqual(1113195, 1); + expect(line.get(0, 1)).to.roughlyEqual(2273031, 1); + expect(line.get(1, 0)).to.roughlyEqual(2226390, 1); + expect(line.get(1, 1)).to.roughlyEqual(3503550, 1); + expect(line.get(2, 0)).to.roughlyEqual(3339585, 1); + expect(line.get(2, 1)).to.roughlyEqual(4865942, 1); + }); + + it('inverse transforms a linestring in place', function() { + var line = new ol.geom.LineString([ + [1113195, 2273031], [2226390, 3503550], [3339585, 4865942] + ]); + line.transform(inverse); + expect(line.get(0, 0)).to.roughlyEqual(10, 0.001); + expect(line.get(0, 1)).to.roughlyEqual(20, 0.001); + expect(line.get(1, 0)).to.roughlyEqual(20, 0.001); + expect(line.get(1, 1)).to.roughlyEqual(30, 0.001); + expect(line.get(2, 0)).to.roughlyEqual(30, 0.001); + expect(line.get(2, 1)).to.roughlyEqual(40, 0.001); + }); + + }); + }); goog.require('ol.geom.Geometry'); goog.require('ol.geom.LineString'); +goog.require('ol.proj'); diff --git a/test/spec/ol/geom/multipoint.test.js b/test/spec/ol/geom/multipoint.test.js index a79a75b59a..dd54c094c0 100644 --- a/test/spec/ol/geom/multipoint.test.js +++ b/test/spec/ol/geom/multipoint.test.js @@ -68,8 +68,37 @@ describe('ol.geom.MultiPoint', function() { }); + describe('#transform', function() { + + var forward = ol.proj.getTransform('EPSG:4326', 'EPSG:3857'); + var inverse = ol.proj.getTransform('EPSG:3857', 'EPSG:4326'); + + it('forward transforms a multi-point', function() { + var multi = new ol.geom.MultiPoint([[10, 20], [30, 40]]); + multi.transform(forward); + + expect(multi.components[0].get(0)).to.roughlyEqual(1113195, 1); + expect(multi.components[0].get(1)).to.roughlyEqual(2273031, 1); + expect(multi.components[1].get(0)).to.roughlyEqual(3339584, 1); + expect(multi.components[1].get(1)).to.roughlyEqual(4865942, 1); + }); + + it('inverse transforms a multi-point', function() { + var multi = new ol.geom.MultiPoint( + [[1113195, 2273031], [3339584, 4865942]]); + multi.transform(inverse); + + expect(multi.components[0].get(0)).to.roughlyEqual(10, 0.001); + expect(multi.components[0].get(1)).to.roughlyEqual(20, 0.001); + expect(multi.components[1].get(0)).to.roughlyEqual(30, 0.001); + expect(multi.components[1].get(1)).to.roughlyEqual(40, 0.001); + }); + + }); + }); goog.require('ol.geom.Geometry'); goog.require('ol.geom.MultiPoint'); goog.require('ol.geom.Point'); +goog.require('ol.proj'); diff --git a/test/spec/ol/geom/point.test.js b/test/spec/ol/geom/point.test.js index d72a8be839..32992e7809 100644 --- a/test/spec/ol/geom/point.test.js +++ b/test/spec/ol/geom/point.test.js @@ -55,7 +55,29 @@ describe('ol.geom.Point', function() { }); + describe('#transform()', function() { + + var forward = ol.proj.getTransform('EPSG:4326', 'EPSG:3857'); + var inverse = ol.proj.getTransform('EPSG:3857', 'EPSG:4326'); + + it('forward transforms a point in place', function() { + var point = new ol.geom.Point([10, 20]); + point.transform(forward); + expect(point.get(0)).to.roughlyEqual(1113195, 1); + expect(point.get(1)).to.roughlyEqual(2273031, 1); + }); + + it('inverse transforms a point in place', function() { + var point = new ol.geom.Point([1113195, 2273031]); + point.transform(inverse); + expect(point.get(0)).to.roughlyEqual(10, 0.001); + expect(point.get(1)).to.roughlyEqual(20, 0.001); + }); + + }); + }); goog.require('ol.geom.Geometry'); goog.require('ol.geom.Point'); +goog.require('ol.proj'); diff --git a/test/spec/ol/geom/polygon.test.js b/test/spec/ol/geom/polygon.test.js index a13209573f..30209d4277 100644 --- a/test/spec/ol/geom/polygon.test.js +++ b/test/spec/ol/geom/polygon.test.js @@ -87,8 +87,68 @@ describe('ol.geom.Polygon', function() { }); + describe('#transform()', function() { + + var forward = ol.proj.getTransform('EPSG:4326', 'EPSG:3857'); + var inverse = ol.proj.getTransform('EPSG:3857', 'EPSG:4326'); + + var gg, sm; + beforeEach(function() { + gg = [ + [[0, 0], [0, 10], [10, 10], [10, 0], [0, 0]], + [[1, 1], [2, 1], [2, 2], [1, 2], [1, 1]], + [[8, 8], [9, 8], [9, 9], [8, 9], [8, 8]] + ]; + + sm = [[ + [0, 0], [0, 1118890], [1113195, 1118890], [1113195, 0], [0, 0] + ], [ + [111319, 111325], [222639, 111325], [222639, 222684], + [111319, 222684], [111319, 111325] + ], [ + [890556, 893464], [1001875, 893464], [1001875, 1006021], + [890556, 1006021], [890556, 893464] + ]]; + + }); + + it('forward transforms a polygon in place', function() { + + var poly = new ol.geom.Polygon(gg); + poly.transform(forward); + var coordinates = poly.getCoordinates(); + var ring; + for (var i = 0, ii = coordinates.length; i < ii; ++i) { + var ring = coordinates[i]; + for (var j = 0, jj = ring.length; j < jj; ++j) { + expect(ring[j][0]).to.roughlyEqual(sm[i][j][0], 1); + expect(ring[j][1]).to.roughlyEqual(sm[i][j][1], 1); + } + } + + }); + + it('inverse transforms a polygon in place', function() { + + var poly = new ol.geom.Polygon(sm); + poly.transform(inverse); + var coordinates = poly.getCoordinates(); + var ring; + for (var i = 0, ii = coordinates.length; i < ii; ++i) { + var ring = coordinates[i]; + for (var j = 0, jj = ring.length; j < jj; ++j) { + expect(ring[j][0]).to.roughlyEqual(gg[i][j][0], 0.001); + expect(ring[j][1]).to.roughlyEqual(gg[i][j][1], 0.001); + } + } + + }); + + }); + }); goog.require('ol.geom.Geometry'); goog.require('ol.geom.LinearRing'); goog.require('ol.geom.Polygon'); +goog.require('ol.proj'); From 0b5058f72e936438eaa8b53192269fe7f8923539 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Wed, 25 Sep 2013 16:05:40 +0200 Subject: [PATCH 4/9] Remove shared vertex handling from vector layer --- src/ol/layer/vectorlayer.js | 92 +++++-------------------------------- 1 file changed, 12 insertions(+), 80 deletions(-) diff --git a/src/ol/layer/vectorlayer.js b/src/ol/layer/vectorlayer.js index f88beaf076..0d1147f1c7 100644 --- a/src/ol/layer/vectorlayer.js +++ b/src/ol/layer/vectorlayer.js @@ -13,7 +13,6 @@ goog.require('ol.expr.LogicalOp'); goog.require('ol.expr.functions'); goog.require('ol.extent'); goog.require('ol.geom.GeometryType'); -goog.require('ol.geom.SharedVertices'); goog.require('ol.layer.Layer'); goog.require('ol.proj'); goog.require('ol.source.Vector'); @@ -286,27 +285,6 @@ ol.layer.Vector = function(options) { this.transformFeatureInfo_ = goog.isDef(options.transformFeatureInfo) ? options.transformFeatureInfo : ol.layer.Vector.uidTransformFeatureInfo; - /** - * TODO: this means we need to know dimension at construction - * @type {ol.geom.SharedVertices} - * @private - */ - this.pointVertices_ = new ol.geom.SharedVertices(); - - /** - * TODO: this means we need to know dimension at construction - * @type {ol.geom.SharedVertices} - * @private - */ - this.lineVertices_ = new ol.geom.SharedVertices(); - - /** - * TODO: this means we need to know dimension at construction - * @type {ol.geom.SharedVertices} - * @private - */ - this.polygonVertices_ = new ol.geom.SharedVertices(); - /** * True if this is a temporary layer. * @type {boolean} @@ -399,30 +377,6 @@ ol.layer.Vector.prototype.getFeaturesObjectForExtent = function(extent, }; -/** - * @return {ol.geom.SharedVertices} Shared line vertices. - */ -ol.layer.Vector.prototype.getLineVertices = function() { - return this.lineVertices_; -}; - - -/** - * @return {ol.geom.SharedVertices} Shared point vertices. - */ -ol.layer.Vector.prototype.getPointVertices = function() { - return this.pointVertices_; -}; - - -/** - * @return {ol.geom.SharedVertices} Shared polygon vertices. - */ -ol.layer.Vector.prototype.getPolygonVertices = function() { - return this.polygonVertices_; -}; - - /** * @param {Object.} features Features. * @param {number} resolution Map resolution. @@ -497,17 +451,6 @@ ol.layer.Vector.prototype.getFeatureWithUid = function(uid) { * view in one projection. */ ol.layer.Vector.prototype.parseFeatures = function(data, parser, projection) { - var lookup = {}; - lookup[ol.geom.GeometryType.POINT] = this.pointVertices_; - lookup[ol.geom.GeometryType.LINESTRING] = this.lineVertices_; - lookup[ol.geom.GeometryType.POLYGON] = this.polygonVertices_; - lookup[ol.geom.GeometryType.MULTIPOINT] = this.pointVertices_; - lookup[ol.geom.GeometryType.MULTILINESTRING] = this.lineVertices_; - lookup[ol.geom.GeometryType.MULTIPOLYGON] = this.polygonVertices_; - - var callback = function(feature, type) { - return lookup[type]; - }; var addFeatures = function(data) { var features = data.features; @@ -516,46 +459,35 @@ ol.layer.Vector.prototype.parseFeatures = function(data, parser, projection) { sourceProjection = data.metadata.projection; } var transform = ol.proj.getTransform(sourceProjection, projection); - - transform( - this.pointVertices_.coordinates, - this.pointVertices_.coordinates, - this.pointVertices_.getDimension()); - - transform( - this.lineVertices_.coordinates, - this.lineVertices_.coordinates, - this.lineVertices_.getDimension()); - - transform( - this.polygonVertices_.coordinates, - this.polygonVertices_.coordinates, - this.polygonVertices_.getDimension()); - + var geometry = null; + for (var i = 0, ii = features.length; i < ii; ++i) { + geometry = features[i].getGeometry(); + if (!goog.isNull(geometry)) { + geometry.transform(transform); + } + } this.addFeatures(features); }; - var options = {callback: callback}, result; + var result; if (goog.isString(data)) { if (goog.isFunction(parser.readFeaturesFromStringAsync)) { - parser.readFeaturesFromStringAsync(data, goog.bind(addFeatures, this), - options); + parser.readFeaturesFromStringAsync(data, goog.bind(addFeatures, this)); } else { goog.asserts.assert( goog.isFunction(parser.readFeaturesFromString), 'Expected parser with a readFeaturesFromString method.'); - result = parser.readFeaturesFromString(data, options); + result = parser.readFeaturesFromString(data); addFeatures.call(this, result); } } else if (goog.isObject(data)) { if (goog.isFunction(parser.readFeaturesFromObjectAsync)) { - parser.readFeaturesFromObjectAsync(data, goog.bind(addFeatures, this), - options); + parser.readFeaturesFromObjectAsync(data, goog.bind(addFeatures, this)); } else { goog.asserts.assert( goog.isFunction(parser.readFeaturesFromObject), 'Expected parser with a readFeaturesFromObject method.'); - result = parser.readFeaturesFromObject(data, options); + result = parser.readFeaturesFromObject(data); addFeatures.call(this, result); } } else { From 3aff5e19f13366c8e2c39addcf0602f53fa5c4f0 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Wed, 25 Sep 2013 16:08:10 +0200 Subject: [PATCH 5/9] Remove shared vertices --- src/ol/geom/sharedvertices.js | 157 ---------------- test/spec/ol/geom/sharedvertices.test.js | 221 ----------------------- 2 files changed, 378 deletions(-) delete mode 100644 src/ol/geom/sharedvertices.js delete mode 100644 test/spec/ol/geom/sharedvertices.test.js diff --git a/src/ol/geom/sharedvertices.js b/src/ol/geom/sharedvertices.js deleted file mode 100644 index e6c432997b..0000000000 --- a/src/ol/geom/sharedvertices.js +++ /dev/null @@ -1,157 +0,0 @@ -goog.provide('ol.geom.SharedVertices'); - -goog.require('goog.asserts'); -goog.require('ol.Coordinate'); -goog.require('ol.CoordinateArray'); - - -/** - * @typedef {{dimension: (number), - * offset: (ol.Coordinate|undefined)}} - */ -ol.geom.SharedVerticesOptions; - - - -/** - * Provides methods for dealing with shared, flattened arrays of vertices. - * - * @constructor - * @param {ol.geom.SharedVerticesOptions=} opt_options Shared vertices options. - */ -ol.geom.SharedVertices = function(opt_options) { - var options = opt_options ? opt_options : {}; - - /** - * @type {Array.} - */ - this.coordinates = []; - - /** - * @type {Array.} - * @private - */ - this.starts_ = []; - - /** - * @type {Array.} - * @private - */ - this.counts_ = []; - - /** - * Number of dimensions per vertex. Default is 2. - * @type {number} - * @private - */ - this.dimension_ = options.dimension || 2; - - /** - * Vertex offset. - * @type {Array.} - * @private - */ - this.offset_ = options.offset || null; - goog.asserts.assert(goog.isNull(this.offset_) || - this.offset_.length === this.dimension_); - -}; - - -/** - * Adds a vertex array to the shared coordinate array. - * @param {ol.CoordinateArray} vertices Array of vertices. - * @return {number} Index used to reference the added vertex array. - */ -ol.geom.SharedVertices.prototype.add = function(vertices) { - var start = this.coordinates.length; - var offset = this.offset_; - var dimension = this.dimension_; - var count = vertices.length; - var vertex, index; - for (var i = 0; i < count; ++i) { - vertex = vertices[i]; - index = start + (i * dimension); - for (var j = 0; j < dimension; ++j) { - this.coordinates[index + j] = vertex[j] - (offset ? offset[j] : 0); - } - } - var length = this.starts_.push(start); - this.counts_.push(count); - return length - 1; -}; - - -/** - * @param {number} id The vertex array identifier (returned by add). - * @param {number} index The vertex index. - * @param {number} dim The coordinate dimension. - * @return {number} The coordinate value. - */ -ol.geom.SharedVertices.prototype.get = function(id, index, dim) { - goog.asserts.assert(id < this.starts_.length); - goog.asserts.assert(dim <= this.dimension_); - goog.asserts.assert(index < this.counts_[id]); - var start = this.starts_[id]; - var value = this.coordinates[start + (index * this.dimension_) + dim]; - if (this.offset_) { - value += this.offset_[dim]; - } - return value; -}; - - -/** - * @param {number} id The vertex array identifier (returned by add). - * @return {number} The number of vertices in the referenced array. - */ -ol.geom.SharedVertices.prototype.getCount = function(id) { - goog.asserts.assert(id < this.counts_.length); - return this.counts_[id]; -}; - - -/** - * Get the array of counts. The index returned by the add method can be used - * to look up the number of vertices. - * - * @return {Array.} The counts array. - */ -ol.geom.SharedVertices.prototype.getCounts = function() { - return this.counts_; -}; - - -/** - * @return {number} The dimension of each vertex in the array. - */ -ol.geom.SharedVertices.prototype.getDimension = function() { - return this.dimension_; -}; - - -/** - * @return {Array.} The offset array for vertex coordinates (or null). - */ -ol.geom.SharedVertices.prototype.getOffset = function() { - return this.offset_; -}; - - -/** - * @param {number} id The vertex array identifier (returned by add). - * @return {number} The start index in the shared vertices array. - */ -ol.geom.SharedVertices.prototype.getStart = function(id) { - goog.asserts.assert(id < this.starts_.length); - return this.starts_[id]; -}; - - -/** - * Get the array of start indexes. - * @return {Array.} The starts array. - */ -ol.geom.SharedVertices.prototype.getStarts = function() { - return this.starts_; -}; diff --git a/test/spec/ol/geom/sharedvertices.test.js b/test/spec/ol/geom/sharedvertices.test.js deleted file mode 100644 index 3c3adce456..0000000000 --- a/test/spec/ol/geom/sharedvertices.test.js +++ /dev/null @@ -1,221 +0,0 @@ -goog.provide('ol.test.geom.SharedVertices'); - -describe('ol.geom.SharedVertices', function() { - - describe('constructor', function() { - it('creates an instance', function() { - var vertices = new ol.geom.SharedVertices(); - expect(vertices).to.be.a(ol.geom.SharedVertices); - }); - - it('accepts options', function() { - var vertices = new ol.geom.SharedVertices({ - dimension: 4, - offset: [1, 2, 3, 4] - }); - - expect(vertices.getDimension()).to.be(4); - expect(vertices.getOffset()).to.eql([1, 2, 3, 4]); - }); - }); - - describe('offset option', function() { - it('offsets the internally stored vertex coordinates', function() { - var vertices = new ol.geom.SharedVertices({offset: [3, -1]}); - vertices.add([[3, -1], [0, 0]]); - vertices.add([[10, 20]]); - expect(vertices.coordinates).to.eql([0, 0, -3, 1, 7, 21]); - }); - }); - - describe('#add()', function() { - it('adds vertex arrays to the shared coordinates', function() { - var vertices = new ol.geom.SharedVertices(); - expect(vertices.coordinates.length).to.be(0); - - vertices.add([[1, 2], [3, 4]]); - expect(vertices.coordinates).to.eql([1, 2, 3, 4]); - - vertices.add([[5, 6]]); - expect(vertices.coordinates).to.eql([1, 2, 3, 4, 5, 6]); - }); - - it('ignores extra dimensions', function() { - var vertices = new ol.geom.SharedVertices({dimension: 2}); - expect(vertices.coordinates.length).to.be(0); - - vertices.add([[1, 2], [3, 4, 5], [6, 7]]); - expect(vertices.coordinates).to.eql([1, 2, 3, 4, 6, 7]); - - vertices.add([[8, 9, 10]]); - expect(vertices.coordinates).to.eql([1, 2, 3, 4, 6, 7, 8, 9]); - }); - - it('pads with NaN when dimension not provided', function() { - var vertices = new ol.geom.SharedVertices({dimension: 3}); - expect(vertices.coordinates.length).to.be(0); - - vertices.add([[1, 2], [3, 4, 5], [6, 7]]); - expect(vertices.coordinates).to.eql([1, 2, NaN, 3, 4, 5, 6, 7, NaN]); - }); - - it('returns an identifier for coordinate access', function() { - var vertices = new ol.geom.SharedVertices(); - var id = vertices.add([[1, 2], [3, 4]]); - expect(typeof id).to.be('number'); - }); - - it('returns the index of the added vertices', function() { - var vertices = new ol.geom.SharedVertices(); - - var first = vertices.add([[1, 2]]); - var second = vertices.add([[3, 4], [5, 6]]); - var third = vertices.add([[7, 8], [9, 10], [11, 12]]); - - expect(vertices.coordinates).to.eql( - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]); - - expect(first).to.be(0); - expect(second).to.be(1); - expect(third).to.be(2); - }); - - }); - - describe('#get()', function() { - it('provides access to vertex coordinates', function() { - var vertices = new ol.geom.SharedVertices(); - var first = vertices.add([[1, 2], [3, 4]]); - var second = vertices.add([[5, 6]]); - - expect(vertices.get(first, 0, 0)).to.be(1); - expect(vertices.get(first, 0, 1)).to.be(2); - expect(vertices.get(first, 1, 0)).to.be(3); - expect(vertices.get(first, 1, 1)).to.be(4); - expect(vertices.get(second, 0, 0)).to.be(5); - expect(vertices.get(second, 0, 1)).to.be(6); - }); - - it('works for non-2d vertices', function() { - var vertices = new ol.geom.SharedVertices({dimension: 3}); - var id = vertices.add([[1, 2, 3], [4, 5, 6]]); - - expect(vertices.get(id, 0, 0)).to.be(1); - expect(vertices.get(id, 0, 1)).to.be(2); - expect(vertices.get(id, 0, 2)).to.be(3); - expect(vertices.get(id, 1, 0)).to.be(4); - expect(vertices.get(id, 1, 1)).to.be(5); - expect(vertices.get(id, 1, 2)).to.be(6); - }); - - it('works when an offset is provided', function() { - var vertices = new ol.geom.SharedVertices({offset: [3, 3]}); - var id = vertices.add([[1, 2], [3, 4], [5, 6]]); - - expect(vertices.get(id, 0, 0)).to.be(1); - expect(vertices.get(id, 0, 1)).to.be(2); - expect(vertices.get(id, 1, 0)).to.be(3); - expect(vertices.get(id, 1, 1)).to.be(4); - expect(vertices.get(id, 2, 0)).to.be(5); - expect(vertices.get(id, 2, 1)).to.be(6); - }); - - }); - - describe('#getCount()', function() { - it('returns the length of an identified vertex array', function() { - var vertices = new ol.geom.SharedVertices(); - var first = vertices.add([[2, 3], [3, 4], [4, 5]]); - var second = vertices.add([[5, 6], [6, 6]]); - - expect(vertices.getCount(first)).to.be(3); - expect(vertices.getCount(second)).to.be(2); - }); - }); - - describe('#getCounts()', function() { - it('returns the counts array', function() { - var vertices = new ol.geom.SharedVertices(); - vertices.add([[2, 3], [3, 4], [4, 5]]); - vertices.add([[5, 6], [6, 6]]); - vertices.add([[7, 8]]); - - expect(vertices.getCounts()).to.eql([3, 2, 1]); - }); - }); - - describe('#getDimension()', function() { - it('returns 2 by default', function() { - var vertices = new ol.geom.SharedVertices(); - expect(vertices.getDimension()).to.be(2); - }); - - it('returns the dimension provided to the constructor', function() { - var vertices = new ol.geom.SharedVertices({dimension: 10}); - expect(vertices.getDimension()).to.be(10); - }); - }); - - describe('#getOffset()', function() { - it('returns null by default', function() { - var vertices = new ol.geom.SharedVertices(); - expect(vertices.getOffset()).to.be(null); - }); - - it('returns the offset provided to the constructor', function() { - var vertices = new ol.geom.SharedVertices({offset: [1, 2]}); - expect(vertices.getOffset()).to.eql([1, 2]); - }); - }); - - describe('#getStart()', function() { - it('returns the start index of an identified vertex array', function() { - var vertices = new ol.geom.SharedVertices(); - var first = vertices.add([[2, 3], [4, 5], [6, 7]]); - var second = vertices.add([[8, 9], [10, 11]]); - var third = vertices.add([[12, 13]]); - - expect(vertices.coordinates).to.eql( - [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]); - // 0 1 2 3 4 5 6 7 8 9 10 11 - - expect(vertices.getStart(first)).to.be(0); - expect(vertices.getStart(second)).to.be(6); - expect(vertices.getStart(third)).to.be(10); - }); - }); - - describe('#getStarts()', function() { - it('returns the counts array', function() { - var vertices = new ol.geom.SharedVertices(); - vertices.add([[2, 3], [3, 4], [4, 5]]); - vertices.add([[5, 6], [6, 6]]); - vertices.add([[7, 8]]); - - expect(vertices.getStarts()).to.eql([0, 6, 10]); - }); - }); - - describe('#coordinates', function() { - it('is a flat array of all coordinate values', function() { - var vertices = new ol.geom.SharedVertices(); - vertices.add([[1, 2], [3, 4]]); - vertices.add([[5, 6]]); - vertices.add([[7, 8], [9, 10], [11, 12]]); - expect(vertices.coordinates).to.eql( - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]); - }); - - it('is not reassigned', function() { - var vertices = new ol.geom.SharedVertices(); - vertices.add([[1, 2], [3, 4]]); - var coordinates = vertices.coordinates; - - vertices.add([[5, 6]]); - expect(vertices.coordinates).to.be(coordinates); - }); - }); - -}); - -goog.require('ol.geom.SharedVertices'); From 3e8ca138827b22f2051429f8de6f7da6cd614480 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Wed, 25 Sep 2013 16:11:11 +0200 Subject: [PATCH 6/9] Missing stylesheet in TopoJSON example --- examples/topojson.html | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/topojson.html b/examples/topojson.html index 9bf116555d..0afee83db1 100644 --- a/examples/topojson.html +++ b/examples/topojson.html @@ -4,6 +4,7 @@ + From 563918d58d6cd301d0f94862d6e15913edc76f4d Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Wed, 25 Sep 2013 16:14:54 +0200 Subject: [PATCH 7/9] Clone should not share bounds --- src/ol/geom/geometry.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/ol/geom/geometry.js b/src/ol/geom/geometry.js index 4bcc8a1153..f23b9eb782 100644 --- a/src/ol/geom/geometry.js +++ b/src/ol/geom/geometry.js @@ -25,7 +25,6 @@ ol.geom.Geometry.prototype.dimension; */ ol.geom.Geometry.prototype.clone = function() { var clone = new this.constructor(this.getCoordinates()); - clone.bounds_ = this.bounds_; clone.dimension = this.dimension; return clone; }; From 1aa83e133b026cac2e47fba3284048285509b80e Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Wed, 25 Sep 2013 16:51:34 +0200 Subject: [PATCH 8/9] Remove dimension property from geometries This was only necessary when using the shared vertices structure. --- src/ol/geom/abstractcollection.js | 5 ---- src/ol/geom/geometry.js | 11 +------- src/ol/geom/geometrycollection.js | 14 ----------- src/ol/geom/linestring.js | 9 +------ src/ol/geom/multilinestring.js | 5 ---- src/ol/geom/multipoint.js | 5 ---- src/ol/geom/multipolygon.js | 5 ---- src/ol/geom/point.js | 8 +----- src/ol/geom/polygon.js | 6 ----- .../renderer/canvas/canvasvectorrenderer.js | 6 ++--- test/spec/ol/geom/geometrycollection.test.js | 19 -------------- test/spec/ol/geom/linearring.test.js | 14 ----------- test/spec/ol/geom/linestring.test.js | 14 ----------- test/spec/ol/geom/multilinestring.test.js | 25 ------------------- test/spec/ol/geom/multipoint.test.js | 21 ---------------- test/spec/ol/geom/multipolygon.test.js | 16 ------------ test/spec/ol/geom/point.test.js | 21 ---------------- test/spec/ol/geom/polygon.test.js | 14 ----------- test/spec/ol/parser/kml.test.js | 3 --- 19 files changed, 5 insertions(+), 216 deletions(-) diff --git a/src/ol/geom/abstractcollection.js b/src/ol/geom/abstractcollection.js index 933f55e946..590b3cd15a 100644 --- a/src/ol/geom/abstractcollection.js +++ b/src/ol/geom/abstractcollection.js @@ -14,11 +14,6 @@ goog.require('ol.geom.Geometry'); ol.geom.AbstractCollection = function() { goog.base(this); - /** - * @type {number} - */ - this.dimension; - /** * @type {Array.} */ diff --git a/src/ol/geom/geometry.js b/src/ol/geom/geometry.js index f23b9eb782..189f347421 100644 --- a/src/ol/geom/geometry.js +++ b/src/ol/geom/geometry.js @@ -12,21 +12,12 @@ goog.require('ol.TransformFunction'); ol.geom.Geometry = function() {}; -/** - * The dimension of this geometry (2 or 3). - * @type {number} - */ -ol.geom.Geometry.prototype.dimension; - - /** * Create a clone of this geometry. * @return {ol.geom.Geometry} The cloned geometry. */ ol.geom.Geometry.prototype.clone = function() { - var clone = new this.constructor(this.getCoordinates()); - clone.dimension = this.dimension; - return clone; + return new this.constructor(this.getCoordinates()); }; diff --git a/src/ol/geom/geometrycollection.js b/src/ol/geom/geometrycollection.js index 71e96e7cfb..4cdee57aed 100644 --- a/src/ol/geom/geometrycollection.js +++ b/src/ol/geom/geometrycollection.js @@ -23,20 +23,6 @@ ol.geom.GeometryCollection = function(geometries) { */ this.components = geometries; - var dimension = 0; - for (var i = 0, ii = geometries.length; i < ii; ++i) { - if (goog.isDef(dimension)) { - dimension = geometries[i].dimension; - } else { - goog.asserts.assert(dimension == geometries[i].dimension); - } - } - - /** - * @type {number} - */ - this.dimension = dimension; - }; goog.inherits(ol.geom.GeometryCollection, ol.geom.AbstractCollection); diff --git a/src/ol/geom/linestring.js b/src/ol/geom/linestring.js index 25eec36673..b992d5c490 100644 --- a/src/ol/geom/linestring.js +++ b/src/ol/geom/linestring.js @@ -26,12 +26,6 @@ ol.geom.LineString = function(coordinates) { */ this.coordinates_ = coordinates; - /** - * @type {number} - */ - this.dimension = coordinates[0].length; - goog.asserts.assert(this.dimension >= 2); - /** * @type {ol.Extent} * @private @@ -119,11 +113,10 @@ ol.geom.LineString.prototype.distanceFromCoordinate = function(coordinate) { */ ol.geom.LineString.prototype.transform = function(transform) { var coordinates = this.getCoordinates(); - var dimension = this.dimension; var coord; for (var i = 0, ii = coordinates.length; i < ii; ++i) { coord = coordinates[i]; - transform(coord, coord, dimension); + transform(coord, coord, coord.length); } this.bounds_ = null; }; diff --git a/src/ol/geom/multilinestring.js b/src/ol/geom/multilinestring.js index 8fbf3b34e3..756f1fb0cf 100644 --- a/src/ol/geom/multilinestring.js +++ b/src/ol/geom/multilinestring.js @@ -27,11 +27,6 @@ ol.geom.MultiLineString = function(coordinates) { this.components[i] = new ol.geom.LineString(coordinates[i]); } - /** - * @type {number} - */ - this.dimension = coordinates[0][0].length; - }; goog.inherits(ol.geom.MultiLineString, ol.geom.AbstractCollection); diff --git a/src/ol/geom/multipoint.js b/src/ol/geom/multipoint.js index 0c10481599..fe8f75d971 100644 --- a/src/ol/geom/multipoint.js +++ b/src/ol/geom/multipoint.js @@ -27,11 +27,6 @@ ol.geom.MultiPoint = function(coordinates) { this.components[i] = new ol.geom.Point(coordinates[i]); } - /** - * @type {number} - */ - this.dimension = coordinates[0].length; - }; goog.inherits(ol.geom.MultiPoint, ol.geom.AbstractCollection); diff --git a/src/ol/geom/multipolygon.js b/src/ol/geom/multipolygon.js index 48601b32e3..45c5e20cf4 100644 --- a/src/ol/geom/multipolygon.js +++ b/src/ol/geom/multipolygon.js @@ -28,11 +28,6 @@ ol.geom.MultiPolygon = function(coordinates) { this.components[i] = new ol.geom.Polygon(coordinates[i]); } - /** - * @type {number} - */ - this.dimension = coordinates[0][0][0].length; - }; goog.inherits(ol.geom.MultiPolygon, ol.geom.AbstractCollection); diff --git a/src/ol/geom/point.js b/src/ol/geom/point.js index e06ff70a4f..2b349c84c2 100644 --- a/src/ol/geom/point.js +++ b/src/ol/geom/point.js @@ -22,12 +22,6 @@ ol.geom.Point = function(coordinates) { */ this.coordinates_ = coordinates; - /** - * @type {number} - */ - this.dimension = coordinates.length; - goog.asserts.assert(this.dimension >= 2); - /** * @type {ol.Extent} * @private @@ -82,6 +76,6 @@ ol.geom.Point.prototype.getType = function() { */ ol.geom.Point.prototype.transform = function(transform) { var coordinates = this.getCoordinates(); - transform(coordinates, coordinates, this.dimension); + transform(coordinates, coordinates, coordinates.length); this.bounds_ = null; }; diff --git a/src/ol/geom/polygon.js b/src/ol/geom/polygon.js index a0953e1417..b1ec7d68a2 100644 --- a/src/ol/geom/polygon.js +++ b/src/ol/geom/polygon.js @@ -54,12 +54,6 @@ ol.geom.Polygon = function(coordinates) { this.rings[i] = new ol.geom.LinearRing(ringCoords); } - /** - * @type {number} - */ - this.dimension = coordinates[0][0].length; - goog.asserts.assert(this.dimension >= 2); - }; goog.inherits(ol.geom.Polygon, ol.geom.Geometry); diff --git a/src/ol/renderer/canvas/canvasvectorrenderer.js b/src/ol/renderer/canvas/canvasvectorrenderer.js index 1e4543f446..14252a439d 100644 --- a/src/ol/renderer/canvas/canvasvectorrenderer.js +++ b/src/ol/renderer/canvas/canvasvectorrenderer.js @@ -165,7 +165,7 @@ ol.renderer.canvas.VectorRenderer.prototype.renderLineStringFeatures_ = function(features, symbolizer) { var context = this.context_, - i, ii, feature, id, currentSize, geometry, components, j, jj, line, dim, + i, ii, feature, id, currentSize, geometry, components, j, jj, line, k, kk, vec, strokeSize; context.globalAlpha = symbolizer.opacity; @@ -197,7 +197,6 @@ ol.renderer.canvas.VectorRenderer.prototype.renderLineStringFeatures_ = } for (j = 0, jj = components.length; j < jj; ++j) { line = components[j]; - dim = line.dimension; for (k = 0, kk = line.getCount(); k < kk; ++k) { vec = [line.get(k, 0), line.get(k, 1), 0]; goog.vec.Mat4.multVec3(this.transform_, vec, vec); @@ -347,7 +346,7 @@ ol.renderer.canvas.VectorRenderer.prototype.renderPolygonFeatures_ = fillOpacity = symbolizer.fillOpacity, globalAlpha, i, ii, geometry, components, j, jj, poly, - rings, numRings, ring, dim, k, kk, vec, feature; + rings, numRings, ring, k, kk, vec, feature; if (strokeColor) { context.strokeStyle = strokeColor; @@ -384,7 +383,6 @@ ol.renderer.canvas.VectorRenderer.prototype.renderPolygonFeatures_ = } for (j = 0, jj = components.length; j < jj; ++j) { poly = components[j]; - dim = poly.dimension; rings = poly.rings; numRings = rings.length; if (numRings > 0) { diff --git a/test/spec/ol/geom/geometrycollection.test.js b/test/spec/ol/geom/geometrycollection.test.js index 014fd39b8a..010e5b2b5e 100644 --- a/test/spec/ol/geom/geometrycollection.test.js +++ b/test/spec/ol/geom/geometrycollection.test.js @@ -36,25 +36,6 @@ describe('ol.geom.GeometryCollection', function() { }); - describe('#dimension', function() { - - it('can be 2', function() { - var point = new ol.geom.Point([10, 20]); - var line = new ol.geom.LineString([[10, 20], [30, 40]]); - var poly = new ol.geom.Polygon([outer, inner1, inner2]); - var multi = new ol.geom.GeometryCollection([point, line, poly]); - expect(multi.dimension).to.be(2); - }); - - it('can be 3', function() { - var multi = new ol.geom.GeometryCollection([ - new ol.geom.Point([30, 40, 50]) - ]); - expect(multi.dimension).to.be(3); - }); - - }); - describe('#clone()', function() { it('has a working clone method', function() { diff --git a/test/spec/ol/geom/linearring.test.js b/test/spec/ol/geom/linearring.test.js index 341e688ae6..42fba0a33f 100644 --- a/test/spec/ol/geom/linearring.test.js +++ b/test/spec/ol/geom/linearring.test.js @@ -11,20 +11,6 @@ describe('ol.geom.LinearRing', function() { }); - describe('#dimension', function() { - - it('can be 2', function() { - var ring = new ol.geom.LinearRing([[10, 20], [30, 40]]); - expect(ring.dimension).to.be(2); - }); - - it('can be 3', function() { - var ring = new ol.geom.LinearRing([[10, 20, 30], [40, 50, 60]]); - expect(ring.dimension).to.be(3); - }); - - }); - describe('#getCoordinates()', function() { it('is an array', function() { diff --git a/test/spec/ol/geom/linestring.test.js b/test/spec/ol/geom/linestring.test.js index 11f59ff13f..5cf4f65885 100644 --- a/test/spec/ol/geom/linestring.test.js +++ b/test/spec/ol/geom/linestring.test.js @@ -12,20 +12,6 @@ describe('ol.geom.LineString', function() { }); - describe('#dimension', function() { - - it('can be 2', function() { - var line = new ol.geom.LineString([[10, 20], [30, 40]]); - expect(line.dimension).to.be(2); - }); - - it('can be 3', function() { - var line = new ol.geom.LineString([[10, 20, 30], [40, 50, 60]]); - expect(line.dimension).to.be(3); - }); - - }); - describe('#getBounds()', function() { it('returns the bounding extent', function() { diff --git a/test/spec/ol/geom/multilinestring.test.js b/test/spec/ol/geom/multilinestring.test.js index 571b038175..b619813149 100644 --- a/test/spec/ol/geom/multilinestring.test.js +++ b/test/spec/ol/geom/multilinestring.test.js @@ -12,13 +12,6 @@ describe('ol.geom.MultiLineString', function() { expect(multi).to.be.a(ol.geom.Geometry); }); - it('throws when given with insufficient dimensions', function() { - expect(function() { - var multi = new ol.geom.MultiLineString([1]); - multi = multi; // suppress gjslint warning about unused variable - }).to.throwException(); - }); - }); describe('#components', function() { @@ -36,24 +29,6 @@ describe('ol.geom.MultiLineString', function() { }); - describe('#dimension', function() { - - it('can be 2', function() { - var multi = new ol.geom.MultiLineString([ - [[10, 20], [30, 40]], - [[20, 30], [40, 50]]]); - expect(multi.dimension).to.be(2); - }); - - it('can be 3', function() { - var multi = new ol.geom.MultiLineString([ - [[10, 20, 30], [30, 40, 50]], - [[20, 30, 40], [40, 50, 60]]]); - expect(multi.dimension).to.be(3); - }); - - }); - describe('#getBounds()', function() { it('returns the bounding extent', function() { diff --git a/test/spec/ol/geom/multipoint.test.js b/test/spec/ol/geom/multipoint.test.js index dd54c094c0..772186250b 100644 --- a/test/spec/ol/geom/multipoint.test.js +++ b/test/spec/ol/geom/multipoint.test.js @@ -10,13 +10,6 @@ describe('ol.geom.MultiPoint', function() { expect(multi).to.be.a(ol.geom.Geometry); }); - it('throws when given with insufficient dimensions', function() { - expect(function() { - var multi = new ol.geom.MultiPoint([1]); - multi = multi; // suppress gjslint warning about unused variable - }).to.throwException(); - }); - }); describe('#components', function() { @@ -32,20 +25,6 @@ describe('ol.geom.MultiPoint', function() { }); - describe('#dimension', function() { - - it('can be 2', function() { - var multi = new ol.geom.MultiPoint([[10, 20], [30, 40]]); - expect(multi.dimension).to.be(2); - }); - - it('can be 3', function() { - var multi = new ol.geom.MultiPoint([[10, 20, 30], [30, 40, 50]]); - expect(multi.dimension).to.be(3); - }); - - }); - describe('#getBounds()', function() { it('returns the bounding extent', function() { diff --git a/test/spec/ol/geom/multipolygon.test.js b/test/spec/ol/geom/multipolygon.test.js index 2cd118e0ed..e667427d0b 100644 --- a/test/spec/ol/geom/multipolygon.test.js +++ b/test/spec/ol/geom/multipolygon.test.js @@ -41,22 +41,6 @@ describe('ol.geom.MultiPolygon', function() { }); - describe('#dimension', function() { - - it('can be 2', function() { - var multi = new ol.geom.MultiPolygon([ - [outer1, inner1a, inner1b], - [outer2]]); - expect(multi.dimension).to.be(2); - }); - - it('can be 3', function() { - var multi = new ol.geom.MultiPolygon([[[[10, 20, 30], [40, 50, 60]]]]); - expect(multi.dimension).to.be(3); - }); - - }); - describe('#getBounds()', function() { it('returns the bounding extent', function() { diff --git a/test/spec/ol/geom/point.test.js b/test/spec/ol/geom/point.test.js index 32992e7809..48b5a7f1e6 100644 --- a/test/spec/ol/geom/point.test.js +++ b/test/spec/ol/geom/point.test.js @@ -10,27 +10,6 @@ describe('ol.geom.Point', function() { expect(point).to.be.a(ol.geom.Geometry); }); - it('throws when given with insufficient dimensions', function() { - expect(function() { - var point = new ol.geom.Point([1]); - point = point; // suppress gjslint warning about unused variable - }).to.throwException(); - }); - - }); - - describe('#dimension', function() { - - it('can be 2', function() { - var point = new ol.geom.Point([10, 20]); - expect(point.dimension).to.be(2); - }); - - it('can be 3', function() { - var point = new ol.geom.Point([10, 20, 30]); - expect(point.dimension).to.be(3); - }); - }); describe('#getBounds()', function() { diff --git a/test/spec/ol/geom/polygon.test.js b/test/spec/ol/geom/polygon.test.js index 30209d4277..b895d27482 100644 --- a/test/spec/ol/geom/polygon.test.js +++ b/test/spec/ol/geom/polygon.test.js @@ -51,20 +51,6 @@ describe('ol.geom.Polygon', function() { }); - describe('#dimension', function() { - - it('can be 2', function() { - var poly = new ol.geom.Polygon([outer, inner1, inner2]); - expect(poly.dimension).to.be(2); - }); - - it('can be 3', function() { - var poly = new ol.geom.Polygon([[[10, 20, 30], [40, 50, 60]]]); - expect(poly.dimension).to.be(3); - }); - - }); - describe('#getBounds()', function() { it('returns the bounding extent', function() { diff --git a/test/spec/ol/parser/kml.test.js b/test/spec/ol/parser/kml.test.js index 3a3d104abb..30e2ab1e47 100644 --- a/test/spec/ol/parser/kml.test.js +++ b/test/spec/ol/parser/kml.test.js @@ -15,7 +15,6 @@ describe('ol.parser.KML', function() { var geom = obj.features[0].getGeometry(); expect(obj.features[0].getId()).to.eql('KML.Polygon'); expect(geom instanceof ol.geom.Polygon).to.be.ok(); - expect(geom.dimension).to.eql(3); done(); }); }); @@ -28,7 +27,6 @@ describe('ol.parser.KML', function() { expect(obj.features.length).to.eql(2); var geom = obj.features[0].getGeometry(); expect(geom instanceof ol.geom.LineString).to.be.ok(); - expect(geom.dimension).to.eql(3); geom = obj.features[1].getGeometry(); expect(geom instanceof ol.geom.LineString).to.be.ok(); done(); @@ -43,7 +41,6 @@ describe('ol.parser.KML', function() { expect(obj.features.length).to.eql(1); var geom = obj.features[0].getGeometry(); expect(geom instanceof ol.geom.Point).to.be.ok(); - expect(geom.dimension).to.eql(3); done(); }); }); From ce6fd5ab362d95bfe2e4c86aaccdc400ba8367fb Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Wed, 25 Sep 2013 16:57:07 +0200 Subject: [PATCH 9/9] Remove dimension option from KML parser Geometry constructors now accept coordinates in any dimension --- examples/kml-earthquakes.js | 2 +- examples/kml-timezones.js | 2 +- examples/kml.js | 2 +- src/objectliterals.jsdoc | 2 -- src/ol/parser/kmlparser.js | 7 ++----- 5 files changed, 5 insertions(+), 10 deletions(-) diff --git a/examples/kml-earthquakes.js b/examples/kml-earthquakes.js index c1bc43ce6e..826f1fb54f 100644 --- a/examples/kml-earthquakes.js +++ b/examples/kml-earthquakes.js @@ -32,7 +32,7 @@ var style = new ol.style.Style({ var vector = new ol.layer.Vector({ source: new ol.source.Vector({ - parser: new ol.parser.KML({dimension: 2}), + parser: new ol.parser.KML(), url: 'data/kml/2012_Earthquakes_Mag5.kml' }), style: style diff --git a/examples/kml-timezones.js b/examples/kml-timezones.js index b768552986..80524a9e00 100644 --- a/examples/kml-timezones.js +++ b/examples/kml-timezones.js @@ -54,7 +54,7 @@ var style = new ol.style.Style({ var vector = new ol.layer.Vector({ source: new ol.source.Vector({ - parser: new ol.parser.KML({dimension: 2}), + parser: new ol.parser.KML(), url: 'data/kml/timezones.kml' }), style: style diff --git a/examples/kml.js b/examples/kml.js index 7e0fce8da3..d99e343ecc 100644 --- a/examples/kml.js +++ b/examples/kml.js @@ -22,7 +22,7 @@ var raster = new ol.layer.Tile({ var vector = new ol.layer.Vector({ source: new ol.source.Vector({ parser: new ol.parser.KML({ - maxDepth: 1, dimension: 2, extractStyles: true, extractAttributes: true + maxDepth: 1, extractStyles: true, extractAttributes: true }), url: 'data/kml/lines.kml' }) diff --git a/src/objectliterals.jsdoc b/src/objectliterals.jsdoc index 9386a27feb..332699752c 100644 --- a/src/objectliterals.jsdoc +++ b/src/objectliterals.jsdoc @@ -412,8 +412,6 @@ /** * @typedef {Object} ol.parser.KMLOptions - * @property {number|undefined} dimension Create geometries with `dimension` - * dimensions. Default is 3. * @property {boolean|undefined} extractAttributes Should we extract attributes * from the KML? Default is `true´. * @property {boolean|undefined} extractStyles Should we extract styles from the diff --git a/src/ol/parser/kmlparser.js b/src/ol/parser/kmlparser.js index 00817e985e..66e426ed0d 100644 --- a/src/ol/parser/kmlparser.js +++ b/src/ol/parser/kmlparser.js @@ -52,8 +52,6 @@ ol.parser.KML = function(opt_options) { options.extractStyles : false; this.schemaLocation = 'http://www.opengis.net/kml/2.2 ' + 'http://schemas.opengis.net/kml/2.2.0/ogckml22.xsd'; - // TODO re-evaluate once shared structures support 3D - this.dimension = goog.isDef(options.dimension) ? options.dimension : 3; this.maxDepth = goog.isDef(options.maxDepth) ? options.maxDepth : 0; this.trackAttributes = goog.isDef(options.trackAttributes) ? options.trackAttributes : null; @@ -263,8 +261,7 @@ ol.parser.KML = function(opt_options) { for (var i = 0, ii = coords.length; i < ii; i++) { var array = coords[i].replace(reg.removeSpace, '').split(','); var pair = []; - var jj = Math.min(array.length, this.dimension); - for (var j = 0; j < jj; j++) { + for (var j = 0, jj = array.length; j < jj; j++) { pair.push(parseFloat(array[j])); } coordArray.push(pair); @@ -544,7 +541,7 @@ ol.parser.KML = function(opt_options) { 'coord': function(node, container) { var str = this.getChildValue(node); var coords = str.replace(this.regExes.trimSpace, '').split(/\s+/); - for (var i = 0, ii = this.dimension; i < ii; ++i) { + for (var i = 0, ii = coords.length; i < ii; ++i) { coords[i] = parseFloat(coords[i]); } var point = {