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:
@@ -897,14 +897,17 @@ ol.format.KML.readMultiGeometry_ = function(node, objectStack) {
|
|||||||
}
|
}
|
||||||
var multiPoint = new ol.geom.MultiPoint(null);
|
var multiPoint = new ol.geom.MultiPoint(null);
|
||||||
multiPoint.setFlatCoordinates(layout, flatCoordinates);
|
multiPoint.setFlatCoordinates(layout, flatCoordinates);
|
||||||
|
ol.format.KML.setCommonGeometryProperties_(multiPoint, geometries);
|
||||||
return multiPoint;
|
return multiPoint;
|
||||||
} else if (type == ol.geom.GeometryType.LINE_STRING) {
|
} else if (type == ol.geom.GeometryType.LINE_STRING) {
|
||||||
var multiLineString = new ol.geom.MultiLineString(null);
|
var multiLineString = new ol.geom.MultiLineString(null);
|
||||||
multiLineString.setLineStrings(geometries);
|
multiLineString.setLineStrings(geometries);
|
||||||
|
ol.format.KML.setCommonGeometryProperties_(multiLineString, geometries);
|
||||||
return multiLineString;
|
return multiLineString;
|
||||||
} else if (type == ol.geom.GeometryType.POLYGON) {
|
} else if (type == ol.geom.GeometryType.POLYGON) {
|
||||||
var multiPolygon = new ol.geom.MultiPolygon(null);
|
var multiPolygon = new ol.geom.MultiPolygon(null);
|
||||||
multiPolygon.setPolygons(geometries);
|
multiPolygon.setPolygons(geometries);
|
||||||
|
ol.format.KML.setCommonGeometryProperties_(multiPolygon, geometries);
|
||||||
return multiPolygon;
|
return multiPolygon;
|
||||||
} else if (type == ol.geom.GeometryType.GEOMETRY_COLLECTION) {
|
} else if (type == ol.geom.GeometryType.GEOMETRY_COLLECTION) {
|
||||||
return new ol.geom.GeometryCollection(geometries);
|
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 {Node} node Node.
|
||||||
* @param {Array.<*>} objectStack Object stack.
|
* @param {Array.<*>} objectStack Object stack.
|
||||||
|
|||||||
@@ -754,9 +754,13 @@ describe('ol.format.KML', function() {
|
|||||||
' <MultiGeometry>' +
|
' <MultiGeometry>' +
|
||||||
' <Point>' +
|
' <Point>' +
|
||||||
' <coordinates>1,2,3</coordinates>' +
|
' <coordinates>1,2,3</coordinates>' +
|
||||||
|
' <extrude>0</extrude>' +
|
||||||
|
' <altitudeMode>absolute</altitudeMode>' +
|
||||||
' </Point>' +
|
' </Point>' +
|
||||||
' <Point>' +
|
' <Point>' +
|
||||||
' <coordinates>4,5,6</coordinates>' +
|
' <coordinates>4,5,6</coordinates>' +
|
||||||
|
' <extrude>1</extrude>' +
|
||||||
|
' <altitudeMode>clampToGround</altitudeMode>' +
|
||||||
' </Point>' +
|
' </Point>' +
|
||||||
' </MultiGeometry>' +
|
' </MultiGeometry>' +
|
||||||
' </Placemark>' +
|
' </Placemark>' +
|
||||||
@@ -768,6 +772,14 @@ describe('ol.format.KML', function() {
|
|||||||
var g = f.getGeometry();
|
var g = f.getGeometry();
|
||||||
expect(g).to.be.an(ol.geom.MultiPoint);
|
expect(g).to.be.an(ol.geom.MultiPoint);
|
||||||
expect(g.getCoordinates()).to.eql([[1, 2, 3], [4, 5, 6]]);
|
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() {
|
it('can write MultiPoint geometries', function() {
|
||||||
@@ -802,6 +814,8 @@ describe('ol.format.KML', function() {
|
|||||||
' <Placemark>' +
|
' <Placemark>' +
|
||||||
' <MultiGeometry>' +
|
' <MultiGeometry>' +
|
||||||
' <LineString>' +
|
' <LineString>' +
|
||||||
|
' <extrude>0</extrude>' +
|
||||||
|
' <altitudeMode>absolute</altitudeMode>' +
|
||||||
' <coordinates>1,2,3 4,5,6</coordinates>' +
|
' <coordinates>1,2,3 4,5,6</coordinates>' +
|
||||||
' </LineString>' +
|
' </LineString>' +
|
||||||
' <LineString>' +
|
' <LineString>' +
|
||||||
@@ -818,6 +832,14 @@ describe('ol.format.KML', function() {
|
|||||||
expect(g).to.be.an(ol.geom.MultiLineString);
|
expect(g).to.be.an(ol.geom.MultiLineString);
|
||||||
expect(g.getCoordinates()).to.eql(
|
expect(g.getCoordinates()).to.eql(
|
||||||
[[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]]);
|
[[[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() {
|
it('can write MultiLineString geometries', function() {
|
||||||
@@ -852,6 +874,8 @@ describe('ol.format.KML', function() {
|
|||||||
' <Placemark>' +
|
' <Placemark>' +
|
||||||
' <MultiGeometry>' +
|
' <MultiGeometry>' +
|
||||||
' <Polygon>' +
|
' <Polygon>' +
|
||||||
|
' <extrude>0</extrude>' +
|
||||||
|
' <altitudeMode>absolute</altitudeMode>' +
|
||||||
' <outerBoundaryIs>' +
|
' <outerBoundaryIs>' +
|
||||||
' <LinearRing>' +
|
' <LinearRing>' +
|
||||||
' <coordinates>0,0,0 0,1,0 1,1,0 1,0,0</coordinates>' +
|
' <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(
|
expect(g.getCoordinates()).to.eql(
|
||||||
[[[[0, 0, 0], [0, 1, 0], [1, 1, 0], [1, 0, 0]]],
|
[[[[0, 0, 0], [0, 1, 0], [1, 1, 0], [1, 0, 0]]],
|
||||||
[[[3, 0, 0], [3, 1, 0], [4, 1, 0], [4, 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() {
|
it('can write MultiPolygon geometries', function() {
|
||||||
|
|||||||
Reference in New Issue
Block a user