From f25302f8b749ed2d9c32d3d92c52bf049058c4ae Mon Sep 17 00:00:00 2001 From: Guillaume Beraudo Date: Tue, 31 Mar 2015 15:14:12 +0200 Subject: [PATCH] Parse KML extrude and altitudeMode from multi geometries Handle MultiPoint, MultiLineString, MultiPolygon. LinearRing properties are not handled. An 'extrude' boolean array property is set in the geometry properties. An 'altitudeMode' string array property is set in the geometry properties. --- src/ol/format/kmlformat.js | 34 +++++++++++++++++++++++++++ test/spec/ol/format/kmlformat.test.js | 32 +++++++++++++++++++++++++ 2 files changed, 66 insertions(+) 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() {