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.
This commit is contained in:
Guillaume Beraudo
2015-03-31 15:14:12 +02:00
parent 5bd63f7e2c
commit f25302f8b7
2 changed files with 66 additions and 0 deletions

View File

@@ -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.<ol.geom.Geometry>} 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.

View File

@@ -754,9 +754,13 @@ describe('ol.format.KML', function() {
' <MultiGeometry>' +
' <Point>' +
' <coordinates>1,2,3</coordinates>' +
' <extrude>0</extrude>' +
' <altitudeMode>absolute</altitudeMode>' +
' </Point>' +
' <Point>' +
' <coordinates>4,5,6</coordinates>' +
' <extrude>1</extrude>' +
' <altitudeMode>clampToGround</altitudeMode>' +
' </Point>' +
' </MultiGeometry>' +
' </Placemark>' +
@@ -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() {
' <Placemark>' +
' <MultiGeometry>' +
' <LineString>' +
' <extrude>0</extrude>' +
' <altitudeMode>absolute</altitudeMode>' +
' <coordinates>1,2,3 4,5,6</coordinates>' +
' </LineString>' +
' <LineString>' +
@@ -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() {
' <Placemark>' +
' <MultiGeometry>' +
' <Polygon>' +
' <extrude>0</extrude>' +
' <altitudeMode>absolute</altitudeMode>' +
' <outerBoundaryIs>' +
' <LinearRing>' +
' <coordinates>0,0,0 0,1,0 1,1,0 1,0,0</coordinates>' +
@@ -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() {