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() {