Write all geometry's properties in KML
This commit is contained in:
@@ -2475,10 +2475,16 @@ ol.format.KML.writePrimitiveGeometry_ = function(node, geometry, objectStack) {
|
|||||||
var /** @type {ol.XmlNodeStackItem} */ context = {node: node};
|
var /** @type {ol.XmlNodeStackItem} */ context = {node: node};
|
||||||
context['layout'] = geometry.getLayout();
|
context['layout'] = geometry.getLayout();
|
||||||
context['stride'] = geometry.getStride();
|
context['stride'] = geometry.getStride();
|
||||||
ol.xml.pushSerializeAndPop(context,
|
|
||||||
ol.format.KML.PRIMITIVE_GEOMETRY_SERIALIZERS_,
|
// serialize properties (properties unknown to KML are not serialized)
|
||||||
ol.format.KML.COORDINATES_NODE_FACTORY_,
|
var properties = geometry.getProperties();
|
||||||
[flatCoordinates], objectStack);
|
properties.coordinates = flatCoordinates;
|
||||||
|
|
||||||
|
var parentNode = objectStack[objectStack.length - 1].node;
|
||||||
|
var orderedKeys = ol.format.KML.PRIMITIVE_GEOMETRY_SEQUENCE_[parentNode.namespaceURI];
|
||||||
|
var values = ol.xml.makeSequence(properties, orderedKeys);
|
||||||
|
ol.xml.pushSerializeAndPop(context, ol.format.KML.PRIMITIVE_GEOMETRY_SERIALIZERS_,
|
||||||
|
ol.xml.OBJECT_PROPERTY_NODE_FACTORY, values, objectStack, orderedKeys);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -2639,7 +2645,6 @@ ol.format.KML.GEOMETRY_TYPE_TO_NODENAME_ = {
|
|||||||
'GeometryCollection': 'MultiGeometry'
|
'GeometryCollection': 'MultiGeometry'
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @const
|
* @const
|
||||||
* @type {Object.<string, Array.<string>>}
|
* @type {Object.<string, Array.<string>>}
|
||||||
@@ -2815,6 +2820,17 @@ ol.format.KML.PLACEMARK_SERIALIZERS_ = ol.xml.makeStructureNS(
|
|||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @const
|
||||||
|
* @type {Object.<string, Array.<string>>}
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
ol.format.KML.PRIMITIVE_GEOMETRY_SEQUENCE_ = ol.xml.makeStructureNS(
|
||||||
|
ol.format.KML.NAMESPACE_URIS_, [
|
||||||
|
'extrude', 'tessellate', 'altitudeMode', 'coordinates'
|
||||||
|
]);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @const
|
* @const
|
||||||
* @type {Object.<string, Object.<string, ol.XmlSerializer>>}
|
* @type {Object.<string, Object.<string, ol.XmlSerializer>>}
|
||||||
@@ -2822,6 +2838,9 @@ ol.format.KML.PLACEMARK_SERIALIZERS_ = ol.xml.makeStructureNS(
|
|||||||
*/
|
*/
|
||||||
ol.format.KML.PRIMITIVE_GEOMETRY_SERIALIZERS_ = ol.xml.makeStructureNS(
|
ol.format.KML.PRIMITIVE_GEOMETRY_SERIALIZERS_ = ol.xml.makeStructureNS(
|
||||||
ol.format.KML.NAMESPACE_URIS_, {
|
ol.format.KML.NAMESPACE_URIS_, {
|
||||||
|
'extrude': ol.xml.makeChildAppender(ol.format.XSD.writeBooleanTextNode),
|
||||||
|
'tessellate': ol.xml.makeChildAppender(ol.format.XSD.writeBooleanTextNode),
|
||||||
|
'altitudeMode': ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode),
|
||||||
'coordinates': ol.xml.makeChildAppender(
|
'coordinates': ol.xml.makeChildAppender(
|
||||||
ol.format.KML.writeCoordinatesTextNode_)
|
ol.format.KML.writeCoordinatesTextNode_)
|
||||||
});
|
});
|
||||||
@@ -2933,16 +2952,6 @@ ol.format.KML.GEOMETRY_NODE_FACTORY_ = function(value, objectStack,
|
|||||||
ol.format.KML.COLOR_NODE_FACTORY_ = ol.xml.makeSimpleNodeFactory('color');
|
ol.format.KML.COLOR_NODE_FACTORY_ = ol.xml.makeSimpleNodeFactory('color');
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A factory for creating coordinates nodes.
|
|
||||||
* @const
|
|
||||||
* @type {function(*, Array.<*>, string=): (Node|undefined)}
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
ol.format.KML.COORDINATES_NODE_FACTORY_ =
|
|
||||||
ol.xml.makeSimpleNodeFactory('coordinates');
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A factory for creating Data nodes.
|
* A factory for creating Data nodes.
|
||||||
* @const
|
* @const
|
||||||
|
|||||||
@@ -192,6 +192,33 @@ describe('ol.format.KML', function() {
|
|||||||
expect(node).to.xmleql(ol.xml.parse(text));
|
expect(node).to.xmleql(ol.xml.parse(text));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
it('can write properties', function() {
|
||||||
|
var lineString = new ol.geom.LineString([[1, 2], [3, 4]]);
|
||||||
|
lineString.set('extrude', false);
|
||||||
|
lineString.set('tessellate', true);
|
||||||
|
lineString.set('altitudeMode', 'clampToGround');
|
||||||
|
lineString.set('unsupportedProperty', 'foo');
|
||||||
|
var features = [new ol.Feature(lineString)];
|
||||||
|
var node = format.writeFeaturesNode(features);
|
||||||
|
var text =
|
||||||
|
'<kml xmlns="http://www.opengis.net/kml/2.2"' +
|
||||||
|
' xmlns:gx="http://www.google.com/kml/ext/2.2"' +
|
||||||
|
' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' +
|
||||||
|
' xsi:schemaLocation="http://www.opengis.net/kml/2.2' +
|
||||||
|
' https://developers.google.com/kml/schema/kml22gx.xsd">' +
|
||||||
|
' <Placemark>' +
|
||||||
|
' <LineString>' +
|
||||||
|
' <extrude>0</extrude>' +
|
||||||
|
' <tessellate>1</tessellate>' +
|
||||||
|
' <altitudeMode>clampToGround</altitudeMode>' +
|
||||||
|
' <coordinates>1,2 3,4</coordinates>' +
|
||||||
|
' </LineString>' +
|
||||||
|
' </Placemark>' +
|
||||||
|
'</kml>';
|
||||||
|
expect(node).to.xmleql(ol.xml.parse(text));
|
||||||
|
});
|
||||||
|
|
||||||
it('can read Point geometries', function() {
|
it('can read Point geometries', function() {
|
||||||
var text =
|
var text =
|
||||||
'<kml xmlns="http://www.opengis.net/kml/2.2"' +
|
'<kml xmlns="http://www.opengis.net/kml/2.2"' +
|
||||||
|
|||||||
Reference in New Issue
Block a user