diff --git a/src/ol/format/kmlformat.js b/src/ol/format/kmlformat.js index 8ad3401b7c..5036018c9d 100644 --- a/src/ol/format/kmlformat.js +++ b/src/ol/format/kmlformat.js @@ -897,14 +897,17 @@ ol.format.KML.readMultiGeometry_ = function(node, objectStack) { } var multiPoint = new ol.geom.MultiPoint(null); multiPoint.setFlatCoordinates(layout, flatCoordinates); + ol.format.KML.setCommonGeometryProperties_(multiPoint, geometries); return multiPoint; } else if (type == ol.geom.GeometryType.LINE_STRING) { var multiLineString = new ol.geom.MultiLineString(null); multiLineString.setLineStrings(geometries); + ol.format.KML.setCommonGeometryProperties_(multiLineString, geometries); return multiLineString; } else if (type == ol.geom.GeometryType.POLYGON) { var multiPolygon = new ol.geom.MultiPolygon(null); multiPolygon.setPolygons(geometries); + ol.format.KML.setCommonGeometryProperties_(multiPolygon, geometries); return multiPolygon; } else if (type == ol.geom.GeometryType.GEOMETRY_COLLECTION) { return new ol.geom.GeometryCollection(geometries); @@ -1026,6 +1029,37 @@ ol.format.KML.readStyle_ = function(node, objectStack) { }; +/** + * Reads an array of geometries and creates arrays for common geometry + * properties. Then sets them to the multi geometry. + * @param {ol.geom.MultiPoint|ol.geom.MultiLineString|ol.geom.MultiPolygon} + * multiGeometry + * @param {Array.} geometries + * @private + */ +ol.format.KML.setCommonGeometryProperties_ = function(multiGeometry, + geometries) { + var ii = geometries.length; + var extrudes = new Array(geometries.length); + var altitudeModes = new Array(geometries.length); + var geometry, i, hasExtrude, hasAltitudeMode; + hasExtrude = hasAltitudeMode = false; + for (i = 0; i < ii; ++i) { + geometry = geometries[i]; + extrudes[i] = geometry.get('extrude'); + altitudeModes[i] = geometry.get('altitudeMode'); + hasExtrude = hasExtrude || goog.isDef(extrudes[i]); + hasAltitudeMode = hasAltitudeMode || goog.isDef(altitudeModes[i]); + } + if (hasExtrude) { + multiGeometry.set('extrude', extrudes); + } + if (hasAltitudeMode) { + multiGeometry.set('altitudeMode', altitudeModes); + } +}; + + /** * @param {Node} node Node. * @param {Array.<*>} objectStack Object stack. diff --git a/test/spec/ol/format/kmlformat.test.js b/test/spec/ol/format/kmlformat.test.js index db7e21423b..6050a7976f 100644 --- a/test/spec/ol/format/kmlformat.test.js +++ b/test/spec/ol/format/kmlformat.test.js @@ -754,9 +754,13 @@ describe('ol.format.KML', function() { ' ' + ' ' + ' 1,2,3' + + ' 0' + + ' absolute' + ' ' + ' ' + ' 4,5,6' + + ' 1' + + ' clampToGround' + ' ' + ' ' + ' ' + @@ -768,6 +772,14 @@ describe('ol.format.KML', function() { var g = f.getGeometry(); expect(g).to.be.an(ol.geom.MultiPoint); expect(g.getCoordinates()).to.eql([[1, 2, 3], [4, 5, 6]]); + expect(g.get('extrude')).to.be.an('array'); + expect(g.get('extrude')).to.have.length(2); + expect(g.get('extrude')[0]).to.be(false); + expect(g.get('extrude')[1]).to.be(true); + expect(g.get('altitudeMode')).to.be.an('array'); + expect(g.get('altitudeMode')).to.have.length(2); + expect(g.get('altitudeMode')[0]).to.be('absolute'); + expect(g.get('altitudeMode')[1]).to.be('clampToGround'); }); it('can write MultiPoint geometries', function() { @@ -802,6 +814,8 @@ describe('ol.format.KML', function() { ' ' + ' ' + ' ' + + ' 0' + + ' absolute' + ' 1,2,3 4,5,6' + ' ' + ' ' + @@ -818,6 +832,14 @@ describe('ol.format.KML', function() { expect(g).to.be.an(ol.geom.MultiLineString); expect(g.getCoordinates()).to.eql( [[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]]); + expect(g.get('extrude')).to.be.an('array'); + expect(g.get('extrude')).to.have.length(2); + expect(g.get('extrude')[0]).to.be(false); + expect(g.get('extrude')[1]).to.be(undefined); + expect(g.get('altitudeMode')).to.be.an('array'); + expect(g.get('altitudeMode')).to.have.length(2); + expect(g.get('altitudeMode')[0]).to.be('absolute'); + expect(g.get('altitudeMode')[1]).to.be(undefined); }); it('can write MultiLineString geometries', function() { @@ -852,6 +874,8 @@ describe('ol.format.KML', function() { ' ' + ' ' + ' ' + + ' 0' + + ' absolute' + ' ' + ' ' + ' 0,0,0 0,1,0 1,1,0 1,0,0' + @@ -877,6 +901,14 @@ describe('ol.format.KML', function() { expect(g.getCoordinates()).to.eql( [[[[0, 0, 0], [0, 1, 0], [1, 1, 0], [1, 0, 0]]], [[[3, 0, 0], [3, 1, 0], [4, 1, 0], [4, 0, 0]]]]); + expect(g.get('extrude')).to.be.an('array'); + expect(g.get('extrude')).to.have.length(2); + expect(g.get('extrude')[0]).to.be(false); + expect(g.get('extrude')[1]).to.be(undefined); + expect(g.get('altitudeMode')).to.be.an('array'); + expect(g.get('altitudeMode')).to.have.length(2); + expect(g.get('altitudeMode')[0]).to.be('absolute'); + expect(g.get('altitudeMode')[1]).to.be(undefined); }); it('can write MultiPolygon geometries', function() {