diff --git a/src/ol/format/geojsonformat.js b/src/ol/format/geojsonformat.js index 4e4b96ca66..ae5d9c76e8 100644 --- a/src/ol/format/geojsonformat.js +++ b/src/ol/format/geojsonformat.js @@ -1,13 +1,14 @@ // FIXME coordinate order // FIXME reprojection -// FIXME GeometryCollection goog.provide('ol.format.GeoJSON'); +goog.require('goog.array'); goog.require('goog.asserts'); goog.require('goog.object'); goog.require('ol.Feature'); goog.require('ol.format.JSON'); +goog.require('ol.geom.GeometryCollection'); goog.require('ol.geom.LineString'); goog.require('ol.geom.MultiLineString'); goog.require('ol.geom.MultiPoint'); @@ -41,7 +42,7 @@ goog.inherits(ol.format.GeoJSON, ol.format.JSON); /** - * @param {GeoJSONGeometry} object Object. + * @param {GeoJSONObject} object Object. * @private * @return {ol.geom.Geometry} Geometry. */ @@ -52,6 +53,19 @@ ol.format.GeoJSON.readGeometry_ = function(object) { }; +/** + * @param {GeoJSONGeometryCollection} object Object. + * @private + * @return {ol.geom.GeometryCollection} Geometry collection. + */ +ol.format.GeoJSON.readGeometryCollectionGeometry_ = function(object) { + goog.asserts.assert(object.type == 'GeometryCollection'); + var geometries = goog.array.map( + object.geometries, ol.format.GeoJSON.readGeometry_); + return new ol.geom.GeometryCollection(geometries); +}; + + /** * @param {GeoJSONGeometry} object Object. * @private @@ -121,7 +135,7 @@ ol.format.GeoJSON.readPolygonGeometry_ = function(object) { /** * @param {ol.geom.Geometry} geometry Geometry. * @private - * @return {GeoJSONGeometry} GeoJSON geometry. + * @return {GeoJSONObject} GeoJSON geometry. */ ol.format.GeoJSON.writeGeometry_ = function(geometry) { var geometryWriter = ol.format.GeoJSON.GEOMETRY_WRITERS_[geometry.getType()]; @@ -130,6 +144,22 @@ ol.format.GeoJSON.writeGeometry_ = function(geometry) { }; +/** + * @param {ol.geom.Geometry} geometry Geometry. + * @private + * @return {GeoJSONGeometryCollection} GeoJSON geometry collection. + */ +ol.format.GeoJSON.writeGeometryCollectionGeometry_ = function(geometry) { + goog.asserts.assertInstanceof(geometry, ol.geom.GeometryCollection); + var geometries = goog.array.map( + geometry.getGeometriesArray(), ol.format.GeoJSON.writeGeometry_); + return /** @type {GeoJSONGeometryCollection} */ ({ + 'type': 'GeometryCollection', + 'geometries': geometries + }); +}; + + /** * @param {ol.geom.Geometry} geometry Geometry. * @private @@ -219,7 +249,7 @@ ol.format.GeoJSON.writePolygonGeometry_ = function(geometry) { /** * @const * @private - * @type {Object.} + * @type {Object.} */ ol.format.GeoJSON.GEOMETRY_READERS_ = { 'Point': ol.format.GeoJSON.readPointGeometry_, @@ -227,14 +257,15 @@ ol.format.GeoJSON.GEOMETRY_READERS_ = { 'Polygon': ol.format.GeoJSON.readPolygonGeometry_, 'MultiPoint': ol.format.GeoJSON.readMultiPointGeometry_, 'MultiLineString': ol.format.GeoJSON.readMultiLineStringGeometry_, - 'MultiPolygon': ol.format.GeoJSON.readMultiPolygonGeometry_ + 'MultiPolygon': ol.format.GeoJSON.readMultiPolygonGeometry_, + 'GeometryCollection': ol.format.GeoJSON.readGeometryCollectionGeometry_ }; /** * @const * @private - * @type {Object.} + * @type {Object.} */ ol.format.GeoJSON.GEOMETRY_WRITERS_ = { 'Point': ol.format.GeoJSON.writePointGeometry_, @@ -242,7 +273,8 @@ ol.format.GeoJSON.GEOMETRY_WRITERS_ = { 'Polygon': ol.format.GeoJSON.writePolygonGeometry_, 'MultiPoint': ol.format.GeoJSON.writeMultiPointGeometry_, 'MultiLineString': ol.format.GeoJSON.writeMultiLineStringGeometry_, - 'MultiPolygon': ol.format.GeoJSON.writeMultiPolygonGeometry_ + 'MultiPolygon': ol.format.GeoJSON.writeMultiPolygonGeometry_, + 'GeometryCollection': ol.format.GeoJSON.writeGeometryCollectionGeometry_ }; diff --git a/test/spec/ol/format/geojsonformat.test.js b/test/spec/ol/format/geojsonformat.test.js index 1d40411c62..a6792d834f 100644 --- a/test/spec/ol/format/geojsonformat.test.js +++ b/test/spec/ol/format/geojsonformat.test.js @@ -279,7 +279,7 @@ describe('ol.format.GeoJSON', function() { expect(rings[2]).to.be.a(ol.geom.LinearRing); }); - it.skip('parses geometry collection', function() { + it('parses geometry collection', function() { var str = JSON.stringify({ type: 'GeometryCollection', geometries: [ @@ -288,7 +288,9 @@ describe('ol.format.GeoJSON', function() { ] }); - var array = format.readGeometry(str); + var geometryCollection = format.readGeometry(str); + expect(geometryCollection).to.be.an(ol.geom.GeometryCollection); + var array = geometryCollection.getGeometries(); expect(array.length).to.be(2); expect(array[0]).to.be.a(ol.geom.Point); expect(array[1]).to.be.a(ol.geom.LineString); @@ -441,17 +443,20 @@ describe('ol.format.GeoJSON', function() { format.readGeometry(geojson).getCoordinates()); }); - it.skip('encodes geometry collection', function() { + it('encodes geometry collection', function() { var collection = new ol.geom.GeometryCollection([ new ol.geom.Point([10, 20]), new ol.geom.LineString([[30, 40], [50, 60]]) ]); var geojson = format.writeGeometry(collection); var got = format.readGeometry(geojson); - var components = collection.getComponents(); - expect(components.length).to.equal(got.length); - for (var i = 0, ii = components.length; i < ii; ++i) { - expect(components[i].getCoordinates()).to.eql(got[i].getCoordinates()); + expect(got).to.be.an(ol.geom.GeometryCollection); + var gotGeometries = got.getGeometries(); + var geometries = collection.getGeometries(); + expect(geometries.length).to.equal(gotGeometries.length); + for (var i = 0, ii = geometries.length; i < ii; ++i) { + expect(geometries[i].getCoordinates()). + to.eql(gotGeometries[i].getCoordinates()); } }); @@ -463,6 +468,7 @@ describe('ol.format.GeoJSON', function() { goog.require('ol.Feature'); goog.require('ol.extent'); goog.require('ol.format.GeoJSON'); +goog.require('ol.geom.GeometryCollection'); goog.require('ol.geom.LineString'); goog.require('ol.geom.LinearRing'); goog.require('ol.geom.Point');