Merge pull request #3423 from gberaudo/parse_extrude_and_altitudeMode

Parse extrude and altitude mode
This commit is contained in:
Éric Lemoine
2015-03-31 18:29:34 +02:00
4 changed files with 110 additions and 4 deletions

View File

@@ -802,11 +802,15 @@ ol.format.KML.readLineString_ = function(node, objectStack) {
'node.nodeType should be ELEMENT');
goog.asserts.assert(node.localName == 'LineString',
'localName should be LineString');
var properties = ol.xml.pushParseAndPop(/** @type {Object<string,*>} */ ({}),
ol.format.KML.EXTRUDE_AND_ALTITUDE_MODE_PARSERS_, node,
objectStack);
var flatCoordinates =
ol.format.KML.readFlatCoordinatesFromNode_(node, objectStack);
if (goog.isDef(flatCoordinates)) {
var lineString = new ol.geom.LineString(null);
lineString.setFlatCoordinates(ol.geom.GeometryLayout.XYZ, flatCoordinates);
lineString.setProperties(properties);
return lineString;
} else {
return undefined;
@@ -825,12 +829,16 @@ ol.format.KML.readLinearRing_ = function(node, objectStack) {
'node.nodeType should be ELEMENT');
goog.asserts.assert(node.localName == 'LinearRing',
'localName should be LinearRing');
var properties = ol.xml.pushParseAndPop(/** @type {Object<string,*>} */ ({}),
ol.format.KML.EXTRUDE_AND_ALTITUDE_MODE_PARSERS_, node,
objectStack);
var flatCoordinates =
ol.format.KML.readFlatCoordinatesFromNode_(node, objectStack);
if (goog.isDef(flatCoordinates)) {
var polygon = new ol.geom.Polygon(null);
polygon.setFlatCoordinates(ol.geom.GeometryLayout.XYZ, flatCoordinates,
[flatCoordinates.length]);
polygon.setProperties(properties);
return polygon;
} else {
return undefined;
@@ -889,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);
@@ -920,6 +931,9 @@ ol.format.KML.readPoint_ = function(node, objectStack) {
goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT,
'node.nodeType should be ELEMENT');
goog.asserts.assert(node.localName == 'Point', 'localName should be Point');
var properties = ol.xml.pushParseAndPop(/** @type {Object<string,*>} */ ({}),
ol.format.KML.EXTRUDE_AND_ALTITUDE_MODE_PARSERS_, node,
objectStack);
var flatCoordinates =
ol.format.KML.readFlatCoordinatesFromNode_(node, objectStack);
if (goog.isDefAndNotNull(flatCoordinates)) {
@@ -927,6 +941,7 @@ ol.format.KML.readPoint_ = function(node, objectStack) {
goog.asserts.assert(flatCoordinates.length == 3,
'flatCoordinates should have a length of 3');
point.setFlatCoordinates(ol.geom.GeometryLayout.XYZ, flatCoordinates);
point.setProperties(properties);
return point;
} else {
return undefined;
@@ -945,6 +960,9 @@ ol.format.KML.readPolygon_ = function(node, objectStack) {
'node.nodeType should be ELEMENT');
goog.asserts.assert(node.localName == 'Polygon',
'localName should be Polygon');
var properties = ol.xml.pushParseAndPop(/** @type {Object<string,*>} */ ({}),
ol.format.KML.EXTRUDE_AND_ALTITUDE_MODE_PARSERS_, node,
objectStack);
var flatLinearRings = ol.xml.pushParseAndPop(
/** @type {Array.<Array.<number>>} */ ([null]),
ol.format.KML.FLAT_LINEAR_RINGS_PARSERS_, node, objectStack);
@@ -960,6 +978,7 @@ ol.format.KML.readPolygon_ = function(node, objectStack) {
}
polygon.setFlatCoordinates(
ol.geom.GeometryLayout.XYZ, flatCoordinates, ends);
polygon.setProperties(properties);
return polygon;
} else {
return undefined;
@@ -1010,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.
@@ -1266,6 +1316,18 @@ ol.format.KML.EXTENDED_DATA_PARSERS_ = ol.xml.makeParsersNS(
});
/**
* @const
* @type {Object.<string, Object.<string, ol.xml.Parser>>}
* @private
*/
ol.format.KML.EXTRUDE_AND_ALTITUDE_MODE_PARSERS_ = ol.xml.makeParsersNS(
ol.format.KML.NAMESPACE_URIS_, {
'extrude': ol.xml.makeObjectPropertySetter(ol.format.XSD.readBoolean),
'altitudeMode': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.xml.Parser>>}

View File

@@ -2,7 +2,7 @@ goog.provide('ol.geom.Geometry');
goog.provide('ol.geom.GeometryType');
goog.require('goog.functions');
goog.require('ol.Observable');
goog.require('ol.Object');
goog.require('ol.extent');
goog.require('ol.proj');
@@ -50,7 +50,7 @@ ol.geom.GeometryLayout = {
* Base class for vector geometries.
*
* @constructor
* @extends {ol.Observable}
* @extends {ol.Object}
* @fires change Triggered when the geometry changes.
* @api stable
*/
@@ -89,7 +89,7 @@ ol.geom.Geometry = function() {
this.simplifiedGeometryRevision = 0;
};
goog.inherits(ol.geom.Geometry, ol.Observable);
goog.inherits(ol.geom.Geometry, ol.Object);
/**

View File

@@ -679,7 +679,7 @@ ol.xml.parseNode = function(parsersNS, node, objectStack, opt_this) {
* @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack.
* @param {*=} opt_this The object to use as `this`.
* @return {T|undefined} Object.
* @return {T} Object.
* @template T
*/
ol.xml.pushParseAndPop = function(