c8y-openlayer
Version:
This module is designed to help integrate Openlayer with Cumulocity IoT
948 lines (842 loc) • 31.1 kB
JavaScript
import _ol_ from '../index.js';
import _ol_Feature_ from '../feature.js';
import _ol_array_ from '../array.js';
import _ol_format_Feature_ from '../format/feature.js';
import _ol_format_XMLFeature_ from '../format/xmlfeature.js';
import _ol_format_XSD_ from '../format/xsd.js';
import _ol_geom_GeometryLayout_ from '../geom/geometrylayout.js';
import _ol_geom_LineString_ from '../geom/linestring.js';
import _ol_geom_MultiLineString_ from '../geom/multilinestring.js';
import _ol_geom_Point_ from '../geom/point.js';
import _ol_proj_ from '../proj.js';
import _ol_xml_ from '../xml.js';
/**
* @classdesc
* Feature format for reading and writing data in the GPX format.
*
* @constructor
* @extends {ol.format.XMLFeature}
* @param {olx.format.GPXOptions=} opt_options Options.
* @api
*/
var _ol_format_GPX_ = function(opt_options) {
var options = opt_options ? opt_options : {};
_ol_format_XMLFeature_.call(this);
/**
* @inheritDoc
*/
this.defaultDataProjection = _ol_proj_.get('EPSG:4326');
/**
* @type {function(ol.Feature, Node)|undefined}
* @private
*/
this.readExtensions_ = options.readExtensions;
};
_ol_.inherits(_ol_format_GPX_, _ol_format_XMLFeature_);
/**
* @const
* @private
* @type {Array.<string>}
*/
_ol_format_GPX_.NAMESPACE_URIS_ = [
null,
'http://www.topografix.com/GPX/1/0',
'http://www.topografix.com/GPX/1/1'
];
/**
* @const
* @type {string}
* @private
*/
_ol_format_GPX_.SCHEMA_LOCATION_ = 'http://www.topografix.com/GPX/1/1 ' +
'http://www.topografix.com/GPX/1/1/gpx.xsd';
/**
* @param {Array.<number>} flatCoordinates Flat coordinates.
* @param {ol.LayoutOptions} layoutOptions Layout options.
* @param {Node} node Node.
* @param {Object} values Values.
* @private
* @return {Array.<number>} Flat coordinates.
*/
_ol_format_GPX_.appendCoordinate_ = function(flatCoordinates, layoutOptions, node, values) {
flatCoordinates.push(
parseFloat(node.getAttribute('lon')),
parseFloat(node.getAttribute('lat')));
if ('ele' in values) {
flatCoordinates.push(/** @type {number} */ (values['ele']));
delete values['ele'];
layoutOptions.hasZ = true;
} else {
flatCoordinates.push(0);
}
if ('time' in values) {
flatCoordinates.push(/** @type {number} */ (values['time']));
delete values['time'];
layoutOptions.hasM = true;
} else {
flatCoordinates.push(0);
}
return flatCoordinates;
};
/**
* Choose GeometryLayout based on flags in layoutOptions and adjust flatCoordinates
* and ends arrays by shrinking them accordingly (removing unused zero entries).
*
* @param {ol.LayoutOptions} layoutOptions Layout options.
* @param {Array.<number>} flatCoordinates Flat coordinates.
* @param {Array.<number>=} ends Ends.
* @return {ol.geom.GeometryLayout} Layout.
*/
_ol_format_GPX_.applyLayoutOptions_ = function(layoutOptions, flatCoordinates, ends) {
var layout = _ol_geom_GeometryLayout_.XY;
var stride = 2;
if (layoutOptions.hasZ && layoutOptions.hasM) {
layout = _ol_geom_GeometryLayout_.XYZM;
stride = 4;
} else if (layoutOptions.hasZ) {
layout = _ol_geom_GeometryLayout_.XYZ;
stride = 3;
} else if (layoutOptions.hasM) {
layout = _ol_geom_GeometryLayout_.XYM;
stride = 3;
}
if (stride !== 4) {
var i, ii;
for (i = 0, ii = flatCoordinates.length / 4; i < ii; i++) {
flatCoordinates[i * stride] = flatCoordinates[i * 4];
flatCoordinates[i * stride + 1] = flatCoordinates[i * 4 + 1];
if (layoutOptions.hasZ) {
flatCoordinates[i * stride + 2] = flatCoordinates[i * 4 + 2];
}
if (layoutOptions.hasM) {
flatCoordinates[i * stride + 2] = flatCoordinates[i * 4 + 3];
}
}
flatCoordinates.length = flatCoordinates.length / 4 * stride;
if (ends) {
for (i = 0, ii = ends.length; i < ii; i++) {
ends[i] = ends[i] / 4 * stride;
}
}
}
return layout;
};
/**
* @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack.
* @private
*/
_ol_format_GPX_.parseLink_ = function(node, objectStack) {
var values = /** @type {Object} */ (objectStack[objectStack.length - 1]);
var href = node.getAttribute('href');
if (href !== null) {
values['link'] = href;
}
_ol_xml_.parseNode(_ol_format_GPX_.LINK_PARSERS_, node, objectStack);
};
/**
* @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack.
* @private
*/
_ol_format_GPX_.parseExtensions_ = function(node, objectStack) {
var values = /** @type {Object} */ (objectStack[objectStack.length - 1]);
values['extensionsNode_'] = node;
};
/**
* @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack.
* @private
*/
_ol_format_GPX_.parseRtePt_ = function(node, objectStack) {
var values = _ol_xml_.pushParseAndPop(
{}, _ol_format_GPX_.RTEPT_PARSERS_, node, objectStack);
if (values) {
var rteValues = /** @type {Object} */ (objectStack[objectStack.length - 1]);
var flatCoordinates = /** @type {Array.<number>} */
(rteValues['flatCoordinates']);
var layoutOptions = /** @type {ol.LayoutOptions} */
(rteValues['layoutOptions']);
_ol_format_GPX_.appendCoordinate_(flatCoordinates, layoutOptions, node, values);
}
};
/**
* @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack.
* @private
*/
_ol_format_GPX_.parseTrkPt_ = function(node, objectStack) {
var values = _ol_xml_.pushParseAndPop(
{}, _ol_format_GPX_.TRKPT_PARSERS_, node, objectStack);
if (values) {
var trkValues = /** @type {Object} */ (objectStack[objectStack.length - 1]);
var flatCoordinates = /** @type {Array.<number>} */
(trkValues['flatCoordinates']);
var layoutOptions = /** @type {ol.LayoutOptions} */
(trkValues['layoutOptions']);
_ol_format_GPX_.appendCoordinate_(flatCoordinates, layoutOptions, node, values);
}
};
/**
* @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack.
* @private
*/
_ol_format_GPX_.parseTrkSeg_ = function(node, objectStack) {
var values = /** @type {Object} */ (objectStack[objectStack.length - 1]);
_ol_xml_.parseNode(_ol_format_GPX_.TRKSEG_PARSERS_, node, objectStack);
var flatCoordinates = /** @type {Array.<number>} */
(values['flatCoordinates']);
var ends = /** @type {Array.<number>} */ (values['ends']);
ends.push(flatCoordinates.length);
};
/**
* @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack.
* @private
* @return {ol.Feature|undefined} Track.
*/
_ol_format_GPX_.readRte_ = function(node, objectStack) {
var options = /** @type {olx.format.ReadOptions} */ (objectStack[0]);
var values = _ol_xml_.pushParseAndPop({
'flatCoordinates': [],
'layoutOptions': {}
}, _ol_format_GPX_.RTE_PARSERS_, node, objectStack);
if (!values) {
return undefined;
}
var flatCoordinates = /** @type {Array.<number>} */
(values['flatCoordinates']);
delete values['flatCoordinates'];
var layoutOptions = /** @type {ol.LayoutOptions} */ (values['layoutOptions']);
delete values['layoutOptions'];
var layout = _ol_format_GPX_.applyLayoutOptions_(layoutOptions, flatCoordinates);
var geometry = new _ol_geom_LineString_(null);
geometry.setFlatCoordinates(layout, flatCoordinates);
_ol_format_Feature_.transformWithOptions(geometry, false, options);
var feature = new _ol_Feature_(geometry);
feature.setProperties(values);
return feature;
};
/**
* @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack.
* @private
* @return {ol.Feature|undefined} Track.
*/
_ol_format_GPX_.readTrk_ = function(node, objectStack) {
var options = /** @type {olx.format.ReadOptions} */ (objectStack[0]);
var values = _ol_xml_.pushParseAndPop({
'flatCoordinates': [],
'ends': [],
'layoutOptions': {}
}, _ol_format_GPX_.TRK_PARSERS_, node, objectStack);
if (!values) {
return undefined;
}
var flatCoordinates = /** @type {Array.<number>} */
(values['flatCoordinates']);
delete values['flatCoordinates'];
var ends = /** @type {Array.<number>} */ (values['ends']);
delete values['ends'];
var layoutOptions = /** @type {ol.LayoutOptions} */ (values['layoutOptions']);
delete values['layoutOptions'];
var layout = _ol_format_GPX_.applyLayoutOptions_(layoutOptions, flatCoordinates, ends);
var geometry = new _ol_geom_MultiLineString_(null);
geometry.setFlatCoordinates(layout, flatCoordinates, ends);
_ol_format_Feature_.transformWithOptions(geometry, false, options);
var feature = new _ol_Feature_(geometry);
feature.setProperties(values);
return feature;
};
/**
* @param {Node} node Node.
* @param {Array.<*>} objectStack Object stack.
* @private
* @return {ol.Feature|undefined} Waypoint.
*/
_ol_format_GPX_.readWpt_ = function(node, objectStack) {
var options = /** @type {olx.format.ReadOptions} */ (objectStack[0]);
var values = _ol_xml_.pushParseAndPop(
{}, _ol_format_GPX_.WPT_PARSERS_, node, objectStack);
if (!values) {
return undefined;
}
var layoutOptions = /** @type {ol.LayoutOptions} */ ({});
var coordinates = _ol_format_GPX_.appendCoordinate_([], layoutOptions, node, values);
var layout = _ol_format_GPX_.applyLayoutOptions_(layoutOptions, coordinates);
var geometry = new _ol_geom_Point_(coordinates, layout);
_ol_format_Feature_.transformWithOptions(geometry, false, options);
var feature = new _ol_Feature_(geometry);
feature.setProperties(values);
return feature;
};
/**
* @const
* @type {Object.<string, function(Node, Array.<*>): (ol.Feature|undefined)>}
* @private
*/
_ol_format_GPX_.FEATURE_READER_ = {
'rte': _ol_format_GPX_.readRte_,
'trk': _ol_format_GPX_.readTrk_,
'wpt': _ol_format_GPX_.readWpt_
};
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/
_ol_format_GPX_.GPX_PARSERS_ = _ol_xml_.makeStructureNS(
_ol_format_GPX_.NAMESPACE_URIS_, {
'rte': _ol_xml_.makeArrayPusher(_ol_format_GPX_.readRte_),
'trk': _ol_xml_.makeArrayPusher(_ol_format_GPX_.readTrk_),
'wpt': _ol_xml_.makeArrayPusher(_ol_format_GPX_.readWpt_)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/
_ol_format_GPX_.LINK_PARSERS_ = _ol_xml_.makeStructureNS(
_ol_format_GPX_.NAMESPACE_URIS_, {
'text':
_ol_xml_.makeObjectPropertySetter(_ol_format_XSD_.readString, 'linkText'),
'type':
_ol_xml_.makeObjectPropertySetter(_ol_format_XSD_.readString, 'linkType')
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/
_ol_format_GPX_.RTE_PARSERS_ = _ol_xml_.makeStructureNS(
_ol_format_GPX_.NAMESPACE_URIS_, {
'name': _ol_xml_.makeObjectPropertySetter(_ol_format_XSD_.readString),
'cmt': _ol_xml_.makeObjectPropertySetter(_ol_format_XSD_.readString),
'desc': _ol_xml_.makeObjectPropertySetter(_ol_format_XSD_.readString),
'src': _ol_xml_.makeObjectPropertySetter(_ol_format_XSD_.readString),
'link': _ol_format_GPX_.parseLink_,
'number':
_ol_xml_.makeObjectPropertySetter(_ol_format_XSD_.readNonNegativeInteger),
'extensions': _ol_format_GPX_.parseExtensions_,
'type': _ol_xml_.makeObjectPropertySetter(_ol_format_XSD_.readString),
'rtept': _ol_format_GPX_.parseRtePt_
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/
_ol_format_GPX_.RTEPT_PARSERS_ = _ol_xml_.makeStructureNS(
_ol_format_GPX_.NAMESPACE_URIS_, {
'ele': _ol_xml_.makeObjectPropertySetter(_ol_format_XSD_.readDecimal),
'time': _ol_xml_.makeObjectPropertySetter(_ol_format_XSD_.readDateTime)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/
_ol_format_GPX_.TRK_PARSERS_ = _ol_xml_.makeStructureNS(
_ol_format_GPX_.NAMESPACE_URIS_, {
'name': _ol_xml_.makeObjectPropertySetter(_ol_format_XSD_.readString),
'cmt': _ol_xml_.makeObjectPropertySetter(_ol_format_XSD_.readString),
'desc': _ol_xml_.makeObjectPropertySetter(_ol_format_XSD_.readString),
'src': _ol_xml_.makeObjectPropertySetter(_ol_format_XSD_.readString),
'link': _ol_format_GPX_.parseLink_,
'number':
_ol_xml_.makeObjectPropertySetter(_ol_format_XSD_.readNonNegativeInteger),
'type': _ol_xml_.makeObjectPropertySetter(_ol_format_XSD_.readString),
'extensions': _ol_format_GPX_.parseExtensions_,
'trkseg': _ol_format_GPX_.parseTrkSeg_
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/
_ol_format_GPX_.TRKSEG_PARSERS_ = _ol_xml_.makeStructureNS(
_ol_format_GPX_.NAMESPACE_URIS_, {
'trkpt': _ol_format_GPX_.parseTrkPt_
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/
_ol_format_GPX_.TRKPT_PARSERS_ = _ol_xml_.makeStructureNS(
_ol_format_GPX_.NAMESPACE_URIS_, {
'ele': _ol_xml_.makeObjectPropertySetter(_ol_format_XSD_.readDecimal),
'time': _ol_xml_.makeObjectPropertySetter(_ol_format_XSD_.readDateTime)
});
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlParser>>}
* @private
*/
_ol_format_GPX_.WPT_PARSERS_ = _ol_xml_.makeStructureNS(
_ol_format_GPX_.NAMESPACE_URIS_, {
'ele': _ol_xml_.makeObjectPropertySetter(_ol_format_XSD_.readDecimal),
'time': _ol_xml_.makeObjectPropertySetter(_ol_format_XSD_.readDateTime),
'magvar': _ol_xml_.makeObjectPropertySetter(_ol_format_XSD_.readDecimal),
'geoidheight': _ol_xml_.makeObjectPropertySetter(_ol_format_XSD_.readDecimal),
'name': _ol_xml_.makeObjectPropertySetter(_ol_format_XSD_.readString),
'cmt': _ol_xml_.makeObjectPropertySetter(_ol_format_XSD_.readString),
'desc': _ol_xml_.makeObjectPropertySetter(_ol_format_XSD_.readString),
'src': _ol_xml_.makeObjectPropertySetter(_ol_format_XSD_.readString),
'link': _ol_format_GPX_.parseLink_,
'sym': _ol_xml_.makeObjectPropertySetter(_ol_format_XSD_.readString),
'type': _ol_xml_.makeObjectPropertySetter(_ol_format_XSD_.readString),
'fix': _ol_xml_.makeObjectPropertySetter(_ol_format_XSD_.readString),
'sat': _ol_xml_.makeObjectPropertySetter(
_ol_format_XSD_.readNonNegativeInteger),
'hdop': _ol_xml_.makeObjectPropertySetter(_ol_format_XSD_.readDecimal),
'vdop': _ol_xml_.makeObjectPropertySetter(_ol_format_XSD_.readDecimal),
'pdop': _ol_xml_.makeObjectPropertySetter(_ol_format_XSD_.readDecimal),
'ageofdgpsdata':
_ol_xml_.makeObjectPropertySetter(_ol_format_XSD_.readDecimal),
'dgpsid':
_ol_xml_.makeObjectPropertySetter(_ol_format_XSD_.readNonNegativeInteger),
'extensions': _ol_format_GPX_.parseExtensions_
});
/**
* @param {Array.<ol.Feature>} features List of features.
* @private
*/
_ol_format_GPX_.prototype.handleReadExtensions_ = function(features) {
if (!features) {
features = [];
}
for (var i = 0, ii = features.length; i < ii; ++i) {
var feature = features[i];
if (this.readExtensions_) {
var extensionsNode = feature.get('extensionsNode_') || null;
this.readExtensions_(feature, extensionsNode);
}
feature.set('extensionsNode_', undefined);
}
};
/**
* Read the first feature from a GPX source.
* Routes (`<rte>`) are converted into LineString geometries, and tracks (`<trk>`)
* into MultiLineString. Any properties on route and track waypoints are ignored.
*
* @function
* @param {Document|Node|Object|string} source Source.
* @param {olx.format.ReadOptions=} opt_options Read options.
* @return {ol.Feature} Feature.
* @api
*/
_ol_format_GPX_.prototype.readFeature;
/**
* @inheritDoc
*/
_ol_format_GPX_.prototype.readFeatureFromNode = function(node, opt_options) {
if (!_ol_array_.includes(_ol_format_GPX_.NAMESPACE_URIS_, node.namespaceURI)) {
return null;
}
var featureReader = _ol_format_GPX_.FEATURE_READER_[node.localName];
if (!featureReader) {
return null;
}
var feature = featureReader(node, [this.getReadOptions(node, opt_options)]);
if (!feature) {
return null;
}
this.handleReadExtensions_([feature]);
return feature;
};
/**
* Read all features from a GPX source.
* Routes (`<rte>`) are converted into LineString geometries, and tracks (`<trk>`)
* into MultiLineString. Any properties on route and track waypoints are ignored.
*
* @function
* @param {Document|Node|Object|string} source Source.
* @param {olx.format.ReadOptions=} opt_options Read options.
* @return {Array.<ol.Feature>} Features.
* @api
*/
_ol_format_GPX_.prototype.readFeatures;
/**
* @inheritDoc
*/
_ol_format_GPX_.prototype.readFeaturesFromNode = function(node, opt_options) {
if (!_ol_array_.includes(_ol_format_GPX_.NAMESPACE_URIS_, node.namespaceURI)) {
return [];
}
if (node.localName == 'gpx') {
/** @type {Array.<ol.Feature>} */
var features = _ol_xml_.pushParseAndPop([], _ol_format_GPX_.GPX_PARSERS_,
node, [this.getReadOptions(node, opt_options)]);
if (features) {
this.handleReadExtensions_(features);
return features;
} else {
return [];
}
}
return [];
};
/**
* Read the projection from a GPX source.
*
* @function
* @param {Document|Node|Object|string} source Source.
* @return {ol.proj.Projection} Projection.
* @api
*/
_ol_format_GPX_.prototype.readProjection;
/**
* @param {Node} node Node.
* @param {string} value Value for the link's `href` attribute.
* @param {Array.<*>} objectStack Node stack.
* @private
*/
_ol_format_GPX_.writeLink_ = function(node, value, objectStack) {
node.setAttribute('href', value);
var context = objectStack[objectStack.length - 1];
var properties = context['properties'];
var link = [
properties['linkText'],
properties['linkType']
];
_ol_xml_.pushSerializeAndPop(/** @type {ol.XmlNodeStackItem} */ ({node: node}),
_ol_format_GPX_.LINK_SERIALIZERS_, _ol_xml_.OBJECT_PROPERTY_NODE_FACTORY,
link, objectStack, _ol_format_GPX_.LINK_SEQUENCE_);
};
/**
* @param {Node} node Node.
* @param {ol.Coordinate} coordinate Coordinate.
* @param {Array.<*>} objectStack Object stack.
* @private
*/
_ol_format_GPX_.writeWptType_ = function(node, coordinate, objectStack) {
var context = objectStack[objectStack.length - 1];
var parentNode = context.node;
var namespaceURI = parentNode.namespaceURI;
var properties = context['properties'];
//FIXME Projection handling
_ol_xml_.setAttributeNS(node, null, 'lat', coordinate[1]);
_ol_xml_.setAttributeNS(node, null, 'lon', coordinate[0]);
var geometryLayout = context['geometryLayout'];
switch (geometryLayout) {
case _ol_geom_GeometryLayout_.XYZM:
if (coordinate[3] !== 0) {
properties['time'] = coordinate[3];
}
// fall through
case _ol_geom_GeometryLayout_.XYZ:
if (coordinate[2] !== 0) {
properties['ele'] = coordinate[2];
}
break;
case _ol_geom_GeometryLayout_.XYM:
if (coordinate[2] !== 0) {
properties['time'] = coordinate[2];
}
break;
default:
// pass
}
var orderedKeys = (node.nodeName == 'rtept') ?
_ol_format_GPX_.RTEPT_TYPE_SEQUENCE_[namespaceURI] :
_ol_format_GPX_.WPT_TYPE_SEQUENCE_[namespaceURI];
var values = _ol_xml_.makeSequence(properties, orderedKeys);
_ol_xml_.pushSerializeAndPop(/** @type {ol.XmlNodeStackItem} */
({node: node, 'properties': properties}),
_ol_format_GPX_.WPT_TYPE_SERIALIZERS_, _ol_xml_.OBJECT_PROPERTY_NODE_FACTORY,
values, objectStack, orderedKeys);
};
/**
* @param {Node} node Node.
* @param {ol.Feature} feature Feature.
* @param {Array.<*>} objectStack Object stack.
* @private
*/
_ol_format_GPX_.writeRte_ = function(node, feature, objectStack) {
var options = /** @type {olx.format.WriteOptions} */ (objectStack[0]);
var properties = feature.getProperties();
var context = {node: node, 'properties': properties};
var geometry = feature.getGeometry();
if (geometry) {
geometry = /** @type {ol.geom.LineString} */
(_ol_format_Feature_.transformWithOptions(geometry, true, options));
context['geometryLayout'] = geometry.getLayout();
properties['rtept'] = geometry.getCoordinates();
}
var parentNode = objectStack[objectStack.length - 1].node;
var orderedKeys = _ol_format_GPX_.RTE_SEQUENCE_[parentNode.namespaceURI];
var values = _ol_xml_.makeSequence(properties, orderedKeys);
_ol_xml_.pushSerializeAndPop(context,
_ol_format_GPX_.RTE_SERIALIZERS_, _ol_xml_.OBJECT_PROPERTY_NODE_FACTORY,
values, objectStack, orderedKeys);
};
/**
* @param {Node} node Node.
* @param {ol.Feature} feature Feature.
* @param {Array.<*>} objectStack Object stack.
* @private
*/
_ol_format_GPX_.writeTrk_ = function(node, feature, objectStack) {
var options = /** @type {olx.format.WriteOptions} */ (objectStack[0]);
var properties = feature.getProperties();
/** @type {ol.XmlNodeStackItem} */
var context = {node: node, 'properties': properties};
var geometry = feature.getGeometry();
if (geometry) {
geometry = /** @type {ol.geom.MultiLineString} */
(_ol_format_Feature_.transformWithOptions(geometry, true, options));
properties['trkseg'] = geometry.getLineStrings();
}
var parentNode = objectStack[objectStack.length - 1].node;
var orderedKeys = _ol_format_GPX_.TRK_SEQUENCE_[parentNode.namespaceURI];
var values = _ol_xml_.makeSequence(properties, orderedKeys);
_ol_xml_.pushSerializeAndPop(context,
_ol_format_GPX_.TRK_SERIALIZERS_, _ol_xml_.OBJECT_PROPERTY_NODE_FACTORY,
values, objectStack, orderedKeys);
};
/**
* @param {Node} node Node.
* @param {ol.geom.LineString} lineString LineString.
* @param {Array.<*>} objectStack Object stack.
* @private
*/
_ol_format_GPX_.writeTrkSeg_ = function(node, lineString, objectStack) {
/** @type {ol.XmlNodeStackItem} */
var context = {node: node, 'geometryLayout': lineString.getLayout(),
'properties': {}};
_ol_xml_.pushSerializeAndPop(context,
_ol_format_GPX_.TRKSEG_SERIALIZERS_, _ol_format_GPX_.TRKSEG_NODE_FACTORY_,
lineString.getCoordinates(), objectStack);
};
/**
* @param {Node} node Node.
* @param {ol.Feature} feature Feature.
* @param {Array.<*>} objectStack Object stack.
* @private
*/
_ol_format_GPX_.writeWpt_ = function(node, feature, objectStack) {
var options = /** @type {olx.format.WriteOptions} */ (objectStack[0]);
var context = objectStack[objectStack.length - 1];
context['properties'] = feature.getProperties();
var geometry = feature.getGeometry();
if (geometry) {
geometry = /** @type {ol.geom.Point} */
(_ol_format_Feature_.transformWithOptions(geometry, true, options));
context['geometryLayout'] = geometry.getLayout();
_ol_format_GPX_.writeWptType_(node, geometry.getCoordinates(), objectStack);
}
};
/**
* @const
* @type {Array.<string>}
* @private
*/
_ol_format_GPX_.LINK_SEQUENCE_ = ['text', 'type'];
/**
* @type {Object.<string, Object.<string, ol.XmlSerializer>>}
* @private
*/
_ol_format_GPX_.LINK_SERIALIZERS_ = _ol_xml_.makeStructureNS(
_ol_format_GPX_.NAMESPACE_URIS_, {
'text': _ol_xml_.makeChildAppender(_ol_format_XSD_.writeStringTextNode),
'type': _ol_xml_.makeChildAppender(_ol_format_XSD_.writeStringTextNode)
});
/**
* @const
* @type {Object.<string, Array.<string>>}
* @private
*/
_ol_format_GPX_.RTE_SEQUENCE_ = _ol_xml_.makeStructureNS(
_ol_format_GPX_.NAMESPACE_URIS_, [
'name', 'cmt', 'desc', 'src', 'link', 'number', 'type', 'rtept'
]);
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlSerializer>>}
* @private
*/
_ol_format_GPX_.RTE_SERIALIZERS_ = _ol_xml_.makeStructureNS(
_ol_format_GPX_.NAMESPACE_URIS_, {
'name': _ol_xml_.makeChildAppender(_ol_format_XSD_.writeStringTextNode),
'cmt': _ol_xml_.makeChildAppender(_ol_format_XSD_.writeStringTextNode),
'desc': _ol_xml_.makeChildAppender(_ol_format_XSD_.writeStringTextNode),
'src': _ol_xml_.makeChildAppender(_ol_format_XSD_.writeStringTextNode),
'link': _ol_xml_.makeChildAppender(_ol_format_GPX_.writeLink_),
'number': _ol_xml_.makeChildAppender(
_ol_format_XSD_.writeNonNegativeIntegerTextNode),
'type': _ol_xml_.makeChildAppender(_ol_format_XSD_.writeStringTextNode),
'rtept': _ol_xml_.makeArraySerializer(_ol_xml_.makeChildAppender(
_ol_format_GPX_.writeWptType_))
});
/**
* @const
* @type {Object.<string, Array.<string>>}
* @private
*/
_ol_format_GPX_.RTEPT_TYPE_SEQUENCE_ = _ol_xml_.makeStructureNS(
_ol_format_GPX_.NAMESPACE_URIS_, [
'ele', 'time'
]);
/**
* @const
* @type {Object.<string, Array.<string>>}
* @private
*/
_ol_format_GPX_.TRK_SEQUENCE_ = _ol_xml_.makeStructureNS(
_ol_format_GPX_.NAMESPACE_URIS_, [
'name', 'cmt', 'desc', 'src', 'link', 'number', 'type', 'trkseg'
]);
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlSerializer>>}
* @private
*/
_ol_format_GPX_.TRK_SERIALIZERS_ = _ol_xml_.makeStructureNS(
_ol_format_GPX_.NAMESPACE_URIS_, {
'name': _ol_xml_.makeChildAppender(_ol_format_XSD_.writeStringTextNode),
'cmt': _ol_xml_.makeChildAppender(_ol_format_XSD_.writeStringTextNode),
'desc': _ol_xml_.makeChildAppender(_ol_format_XSD_.writeStringTextNode),
'src': _ol_xml_.makeChildAppender(_ol_format_XSD_.writeStringTextNode),
'link': _ol_xml_.makeChildAppender(_ol_format_GPX_.writeLink_),
'number': _ol_xml_.makeChildAppender(
_ol_format_XSD_.writeNonNegativeIntegerTextNode),
'type': _ol_xml_.makeChildAppender(_ol_format_XSD_.writeStringTextNode),
'trkseg': _ol_xml_.makeArraySerializer(_ol_xml_.makeChildAppender(
_ol_format_GPX_.writeTrkSeg_))
});
/**
* @const
* @type {function(*, Array.<*>, string=): (Node|undefined)}
* @private
*/
_ol_format_GPX_.TRKSEG_NODE_FACTORY_ = _ol_xml_.makeSimpleNodeFactory('trkpt');
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlSerializer>>}
* @private
*/
_ol_format_GPX_.TRKSEG_SERIALIZERS_ = _ol_xml_.makeStructureNS(
_ol_format_GPX_.NAMESPACE_URIS_, {
'trkpt': _ol_xml_.makeChildAppender(_ol_format_GPX_.writeWptType_)
});
/**
* @const
* @type {Object.<string, Array.<string>>}
* @private
*/
_ol_format_GPX_.WPT_TYPE_SEQUENCE_ = _ol_xml_.makeStructureNS(
_ol_format_GPX_.NAMESPACE_URIS_, [
'ele', 'time', 'magvar', 'geoidheight', 'name', 'cmt', 'desc', 'src',
'link', 'sym', 'type', 'fix', 'sat', 'hdop', 'vdop', 'pdop',
'ageofdgpsdata', 'dgpsid'
]);
/**
* @type {Object.<string, Object.<string, ol.XmlSerializer>>}
* @private
*/
_ol_format_GPX_.WPT_TYPE_SERIALIZERS_ = _ol_xml_.makeStructureNS(
_ol_format_GPX_.NAMESPACE_URIS_, {
'ele': _ol_xml_.makeChildAppender(_ol_format_XSD_.writeDecimalTextNode),
'time': _ol_xml_.makeChildAppender(_ol_format_XSD_.writeDateTimeTextNode),
'magvar': _ol_xml_.makeChildAppender(_ol_format_XSD_.writeDecimalTextNode),
'geoidheight': _ol_xml_.makeChildAppender(
_ol_format_XSD_.writeDecimalTextNode),
'name': _ol_xml_.makeChildAppender(_ol_format_XSD_.writeStringTextNode),
'cmt': _ol_xml_.makeChildAppender(_ol_format_XSD_.writeStringTextNode),
'desc': _ol_xml_.makeChildAppender(_ol_format_XSD_.writeStringTextNode),
'src': _ol_xml_.makeChildAppender(_ol_format_XSD_.writeStringTextNode),
'link': _ol_xml_.makeChildAppender(_ol_format_GPX_.writeLink_),
'sym': _ol_xml_.makeChildAppender(_ol_format_XSD_.writeStringTextNode),
'type': _ol_xml_.makeChildAppender(_ol_format_XSD_.writeStringTextNode),
'fix': _ol_xml_.makeChildAppender(_ol_format_XSD_.writeStringTextNode),
'sat': _ol_xml_.makeChildAppender(
_ol_format_XSD_.writeNonNegativeIntegerTextNode),
'hdop': _ol_xml_.makeChildAppender(_ol_format_XSD_.writeDecimalTextNode),
'vdop': _ol_xml_.makeChildAppender(_ol_format_XSD_.writeDecimalTextNode),
'pdop': _ol_xml_.makeChildAppender(_ol_format_XSD_.writeDecimalTextNode),
'ageofdgpsdata': _ol_xml_.makeChildAppender(
_ol_format_XSD_.writeDecimalTextNode),
'dgpsid': _ol_xml_.makeChildAppender(
_ol_format_XSD_.writeNonNegativeIntegerTextNode)
});
/**
* @const
* @type {Object.<string, string>}
* @private
*/
_ol_format_GPX_.GEOMETRY_TYPE_TO_NODENAME_ = {
'Point': 'wpt',
'LineString': 'rte',
'MultiLineString': 'trk'
};
/**
* @const
* @param {*} value Value.
* @param {Array.<*>} objectStack Object stack.
* @param {string=} opt_nodeName Node name.
* @return {Node|undefined} Node.
* @private
*/
_ol_format_GPX_.GPX_NODE_FACTORY_ = function(value, objectStack, opt_nodeName) {
var geometry = /** @type {ol.Feature} */ (value).getGeometry();
if (geometry) {
var nodeName = _ol_format_GPX_.GEOMETRY_TYPE_TO_NODENAME_[geometry.getType()];
if (nodeName) {
var parentNode = objectStack[objectStack.length - 1].node;
return _ol_xml_.createElementNS(parentNode.namespaceURI, nodeName);
}
}
};
/**
* @const
* @type {Object.<string, Object.<string, ol.XmlSerializer>>}
* @private
*/
_ol_format_GPX_.GPX_SERIALIZERS_ = _ol_xml_.makeStructureNS(
_ol_format_GPX_.NAMESPACE_URIS_, {
'rte': _ol_xml_.makeChildAppender(_ol_format_GPX_.writeRte_),
'trk': _ol_xml_.makeChildAppender(_ol_format_GPX_.writeTrk_),
'wpt': _ol_xml_.makeChildAppender(_ol_format_GPX_.writeWpt_)
});
/**
* Encode an array of features in the GPX format.
* LineString geometries are output as routes (`<rte>`), and MultiLineString
* as tracks (`<trk>`).
*
* @function
* @param {Array.<ol.Feature>} features Features.
* @param {olx.format.WriteOptions=} opt_options Write options.
* @return {string} Result.
* @api
*/
_ol_format_GPX_.prototype.writeFeatures;
/**
* Encode an array of features in the GPX format as an XML node.
* LineString geometries are output as routes (`<rte>`), and MultiLineString
* as tracks (`<trk>`).
*
* @param {Array.<ol.Feature>} features Features.
* @param {olx.format.WriteOptions=} opt_options Options.
* @return {Node} Node.
* @override
* @api
*/
_ol_format_GPX_.prototype.writeFeaturesNode = function(features, opt_options) {
opt_options = this.adaptOptions(opt_options);
//FIXME Serialize metadata
var gpx = _ol_xml_.createElementNS('http://www.topografix.com/GPX/1/1', 'gpx');
var xmlnsUri = 'http://www.w3.org/2000/xmlns/';
var xmlSchemaInstanceUri = 'http://www.w3.org/2001/XMLSchema-instance';
_ol_xml_.setAttributeNS(gpx, xmlnsUri, 'xmlns:xsi', xmlSchemaInstanceUri);
_ol_xml_.setAttributeNS(gpx, xmlSchemaInstanceUri, 'xsi:schemaLocation',
_ol_format_GPX_.SCHEMA_LOCATION_);
gpx.setAttribute('version', '1.1');
gpx.setAttribute('creator', 'OpenLayers');
_ol_xml_.pushSerializeAndPop(/** @type {ol.XmlNodeStackItem} */
({node: gpx}), _ol_format_GPX_.GPX_SERIALIZERS_,
_ol_format_GPX_.GPX_NODE_FACTORY_, features, [opt_options]);
return gpx;
};
export default _ol_format_GPX_;