diff --git a/src/ol/format/gpxformat.exports b/src/ol/format/gpxformat.exports new file mode 100644 index 0000000000..82582fd4ac --- /dev/null +++ b/src/ol/format/gpxformat.exports @@ -0,0 +1,3 @@ +@exportSymbol ol.format.GPX +@exportProperty ol.format.GPX.prototype.readFeature +@exportProperty ol.format.GPX.prototype.readFeatures diff --git a/src/ol/format/gpxformat.js b/src/ol/format/gpxformat.js new file mode 100644 index 0000000000..31ca041ffc --- /dev/null +++ b/src/ol/format/gpxformat.js @@ -0,0 +1,419 @@ +goog.provide('ol.format.GPX'); + +goog.require('goog.array'); +goog.require('goog.asserts'); +goog.require('goog.dom.NodeType'); +goog.require('goog.object'); +goog.require('ol.Feature'); +goog.require('ol.format.XML'); +goog.require('ol.format.XSD'); +goog.require('ol.geom.LineString'); +goog.require('ol.geom.MultiLineString'); +goog.require('ol.geom.Point'); +goog.require('ol.proj'); +goog.require('ol.xml'); + + + +/** + * @constructor + * @extends {ol.format.XML} + */ +ol.format.GPX = function() { + goog.base(this); +}; +goog.inherits(ol.format.GPX, ol.format.XML); + + +/** + * @const + * @private + * @type {Array.} + */ +ol.format.GPX.NAMESPACE_URIS_ = [ + null, + 'http://www.topografix.com/GPX/1/0', + 'http://www.topografix.com/GPX/1/1' +]; + + +/** + * @param {Array.} flatCoordinates Flat coordinates. + * @param {Node} node Node. + * @param {Object} values Values. + * @private + * @return {Array.} Flat coordinates. + */ +ol.format.GPX.appendCoordinate_ = function(flatCoordinates, node, values) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + flatCoordinates.push( + parseFloat(node.getAttribute('lon')), + parseFloat(node.getAttribute('lat'))); + if (goog.object.containsKey(values, 'ele')) { + flatCoordinates.push( + /** @type {number} */ (goog.object.get(values, 'ele'))); + goog.object.remove(values, 'ele'); + } else { + flatCoordinates.push(0); + } + if (goog.object.containsKey(values, 'time')) { + flatCoordinates.push( + /** @type {number} */ (goog.object.get(values, 'time'))); + goog.object.remove(values, 'time'); + } else { + flatCoordinates.push(0); + } + return flatCoordinates; +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + */ +ol.format.GPX.parseLink_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'link'); + var values = /** @type {Object} */ (objectStack[objectStack.length - 1]); + var href = node.getAttribute('href'); + if (!goog.isNull(href)) { + goog.object.set(values, 'link', href); + } + ol.xml.parse(ol.format.GPX.LINK_PARSERS_, node, objectStack); +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + */ +ol.format.GPX.parseRtePt_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'rtept'); + var values = ol.xml.pushAndParse( + {}, ol.format.GPX.RTEPT_PARSERS_, node, objectStack); + if (goog.isDef(values)) { + var rteValues = /** @type {Object} */ (objectStack[objectStack.length - 1]); + var flatCoordinates = /** @type {Array.} */ + (goog.object.get(rteValues, 'flatCoordinates')); + ol.format.GPX.appendCoordinate_(flatCoordinates, node, values); + } +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + */ +ol.format.GPX.parseTrkPt_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'trkpt'); + var values = ol.xml.pushAndParse( + {}, ol.format.GPX.TRKPT_PARSERS_, node, objectStack); + if (goog.isDef(values)) { + var trkValues = /** @type {Object} */ (objectStack[objectStack.length - 1]); + var flatCoordinates = /** @type {Array.} */ + (goog.object.get(trkValues, 'flatCoordinates')); + ol.format.GPX.appendCoordinate_(flatCoordinates, node, values); + } +}; + + +/** + * @param {Node} node Node. + * @param {Array.<*>} objectStack Object stack. + * @private + */ +ol.format.GPX.parseTrkSeg_ = function(node, objectStack) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'trkseg'); + var values = /** @type {Object} */ (objectStack[objectStack.length - 1]); + ol.xml.parse(ol.format.GPX.TRKSEG_PARSERS_, node, objectStack); + var flatCoordinates = /** @type {Array.} */ + (goog.object.get(values, 'flatCoordinates')); + var ends = /** @type {Array.} */ (goog.object.get(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) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'rte'); + var values = ol.xml.pushAndParse({ + 'flatCoordinates': [] + }, ol.format.GPX.RTE_PARSERS_, node, objectStack); + if (!goog.isDef(values)) { + return undefined; + } + var flatCoordinates = /** @type {Array.} */ + (goog.object.get(values, 'flatCoordinates')); + goog.object.remove(values, 'flatCoordinates'); + var geometry = new ol.geom.LineString(null); + geometry.setFlatCoordinates(ol.geom.GeometryLayout.XYZM, flatCoordinates); + var feature = new ol.Feature(geometry); + feature.setValues(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) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'trk'); + var values = ol.xml.pushAndParse({ + 'flatCoordinates': [], + 'ends': [] + }, ol.format.GPX.TRK_PARSERS_, node, objectStack); + if (!goog.isDef(values)) { + return undefined; + } + var flatCoordinates = /** @type {Array.} */ + (goog.object.get(values, 'flatCoordinates')); + goog.object.remove(values, 'flatCoordinates'); + var ends = /** @type {Array.} */ (goog.object.get(values, 'ends')); + goog.object.remove(values, 'ends'); + var geometry = new ol.geom.MultiLineString(null); + geometry.setFlatCoordinates( + ol.geom.GeometryLayout.XYZM, flatCoordinates, ends); + var feature = new ol.Feature(geometry); + feature.setValues(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) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + goog.asserts.assert(node.localName == 'wpt'); + var values = ol.xml.pushAndParse( + {}, ol.format.GPX.WPT_PARSERS_, node, objectStack); + if (!goog.isDef(values)) { + return undefined; + } + var coordinates = ol.format.GPX.appendCoordinate_([], node, values); + var geometry = new ol.geom.Point( + coordinates, ol.geom.GeometryLayout.XYZM); + var feature = new ol.Feature(geometry); + feature.setValues(values); + return feature; +}; + + +/** + * @const + * @type {Object.): (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.>} + * @private + */ +ol.format.GPX.GPX_PARSERS_ = ol.xml.makeParsersNS( + 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.>} + * @private + */ +ol.format.GPX.LINK_PARSERS_ = ol.xml.makeParsersNS( + 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.>} + * @private + */ +ol.format.GPX.RTE_PARSERS_ = ol.xml.makeParsersNS( + 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), + 'rtept': ol.format.GPX.parseRtePt_ + }); + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.GPX.RTEPT_PARSERS_ = ol.xml.makeParsersNS( + ol.format.GPX.NAMESPACE_URIS_, { + 'ele': ol.xml.makeObjectPropertySetter(ol.format.XSD.readDecimal), + 'time': ol.xml.makeObjectPropertySetter(ol.format.XSD.readDateTime) + }); + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.GPX.TRK_PARSERS_ = ol.xml.makeParsersNS( + 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), + 'trkseg': ol.format.GPX.parseTrkSeg_ + }); + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.GPX.TRKSEG_PARSERS_ = ol.xml.makeParsersNS( + ol.format.GPX.NAMESPACE_URIS_, { + 'trkpt': ol.format.GPX.parseTrkPt_ + }); + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.GPX.TRKPT_PARSERS_ = ol.xml.makeParsersNS( + ol.format.GPX.NAMESPACE_URIS_, { + 'ele': ol.xml.makeObjectPropertySetter(ol.format.XSD.readDecimal), + 'time': ol.xml.makeObjectPropertySetter(ol.format.XSD.readDateTime) + }); + + +/** + * @const + * @type {Object.>} + * @private + */ +ol.format.GPX.WPT_PARSERS_ = ol.xml.makeParsersNS( + ol.format.GPX.NAMESPACE_URIS_, { + 'ele': ol.xml.makeObjectPropertySetter(ol.format.XSD.readDecimal), + 'time': ol.xml.makeObjectPropertySetter(ol.format.XSD.readDateTime), + '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) + }); + + +/** + * @inheritDoc + */ +ol.format.GPX.prototype.readFeatureFromNode = function(node) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + if (goog.array.indexOf(ol.format.GPX.NAMESPACE_URIS_, node.namespaceURI) == + -1) { + return null; + } + var featureReader = ol.format.GPX.FEATURE_READER_[node.localName]; + if (!goog.isDef(featureReader)) { + return null; + } + var feature = featureReader(node, []); + if (!goog.isDef(feature)) { + return null; + } + return feature; +}; + + +/** + * @inheritDoc + */ +ol.format.GPX.prototype.readFeaturesFromNode = function(node) { + goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT); + if (goog.array.indexOf(ol.format.GPX.NAMESPACE_URIS_, node.namespaceURI) == + -1) { + return []; + } + if (node.localName == 'gpx') { + var features = ol.xml.pushAndParse(/** @type {Array.} */ ([]), + ol.format.GPX.GPX_PARSERS_, node, []); + if (goog.isDef(features)) { + return features; + } else { + return []; + } + } + return []; +}; + + +/** + * @inheritDoc + */ +ol.format.GPX.prototype.readProjectionFromDocument = function(doc) { + return ol.proj.get('EPSG:4326'); +}; + + +/** + * @inheritDoc + */ +ol.format.GPX.prototype.readProjectionFromNode = function(node) { + return ol.proj.get('EPSG:4326'); +}; diff --git a/test/spec/ol/format/gpxformat.test.js b/test/spec/ol/format/gpxformat.test.js new file mode 100644 index 0000000000..53b8a78a17 --- /dev/null +++ b/test/spec/ol/format/gpxformat.test.js @@ -0,0 +1,377 @@ +goog.provide('ol.test.format.GPX'); + + +describe('ol.format.GPX', function() { + + var format; + beforeEach(function() { + format = new ol.format.GPX(); + }); + + describe('readFeatures', function() { + + describe('rte', function() { + + it('can read an empty rte', function() { + var text = + '' + + ' ' + + ''; + var fs = format.readFeatures(text); + expect(fs).to.have.length(1); + var f = fs[0]; + expect(f).to.be.an(ol.Feature); + var g = f.getGeometry(); + expect(g).to.be.an(ol.geom.LineString); + expect(g.getCoordinates()).to.eql([]); + expect(g.getLayout()).to.be(ol.geom.GeometryLayout.XYZM); + }); + + it('can read various rte attributes', function() { + var text = + '' + + ' ' + + ' Name' + + ' Comment' + + ' Description' + + ' Source' + + ' ' + + ' Link text' + + ' Link type' + + ' ' + + ' 1' + + ' Type' + + ' ' + + ''; + var fs = format.readFeatures(text); + expect(fs).to.have.length(1); + var f = fs[0]; + expect(f).to.be.an(ol.Feature); + expect(f.get('name')).to.be('Name'); + expect(f.get('cmt')).to.be('Comment'); + expect(f.get('desc')).to.be('Description'); + expect(f.get('src')).to.be('Source'); + expect(f.get('link')).to.be('http://example.com/'); + expect(f.get('linkText')).to.be('Link text'); + expect(f.get('linkType')).to.be('Link type'); + expect(f.get('number')).to.be(1); + expect(f.get('type')).to.be('Type'); + }); + + it('can read a rte with multiple rtepts', function() { + var text = + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ''; + var fs = format.readFeatures(text); + expect(fs).to.have.length(1); + var f = fs[0]; + expect(f).to.be.an(ol.Feature); + var g = f.getGeometry(); + expect(g).to.be.an(ol.geom.LineString); + expect(g.getCoordinates()).to.eql([[2, 1, 0, 0], [4, 3, 0, 0]]); + expect(g.getLayout()).to.be(ol.geom.GeometryLayout.XYZM); + }); + + }); + + describe('trk', function() { + + it('can read an empty trk', function() { + var text = + '' + + ' ' + + ''; + var fs = format.readFeatures(text); + expect(fs).to.have.length(1); + var f = fs[0]; + expect(f).to.be.an(ol.Feature); + var g = f.getGeometry(); + expect(g).to.be.an(ol.geom.MultiLineString); + expect(g.getCoordinates()).to.eql([]); + expect(g.getLayout()).to.be(ol.geom.GeometryLayout.XYZM); + }); + + it('can read various trk attributes', function() { + var text = + '' + + ' ' + + ' Name' + + ' Comment' + + ' Description' + + ' Source' + + ' ' + + ' Link text' + + ' Link type' + + ' ' + + ' 1' + + ' Type' + + ' ' + + ''; + var fs = format.readFeatures(text); + expect(fs).to.have.length(1); + var f = fs[0]; + expect(f).to.be.an(ol.Feature); + expect(f.get('name')).to.be('Name'); + expect(f.get('cmt')).to.be('Comment'); + expect(f.get('desc')).to.be('Description'); + expect(f.get('src')).to.be('Source'); + expect(f.get('link')).to.be('http://example.com/'); + expect(f.get('linkText')).to.be('Link text'); + expect(f.get('linkType')).to.be('Link type'); + expect(f.get('number')).to.be(1); + expect(f.get('type')).to.be('Type'); + }); + + it('can read a trk with an empty trkseg', function() { + var text = + '' + + ' ' + + ' ' + + ' ' + + ''; + var fs = format.readFeatures(text); + expect(fs).to.have.length(1); + var f = fs[0]; + expect(f).to.be.an(ol.Feature); + var g = f.getGeometry(); + expect(g).to.be.an(ol.geom.MultiLineString); + expect(g.getCoordinates()).to.eql([[]]); + expect(g.getLayout()).to.be(ol.geom.GeometryLayout.XYZM); + }); + + it('can read a trk with a trkseg with multiple trkpts', function() { + var text = + '' + + ' ' + + ' ' + + ' ' + + ' 3' + + ' ' + + ' ' + + ' ' + + ' 7' + + ' ' + + ' ' + + ' ' + + ' ' + + ''; + var fs = format.readFeatures(text); + expect(fs).to.have.length(1); + var f = fs[0]; + expect(f).to.be.an(ol.Feature); + var g = f.getGeometry(); + expect(g).to.be.an(ol.geom.MultiLineString); + expect(g.getCoordinates()).to.eql([ + [[2, 1, 3, 1263115752], [6, 5, 7, 1263115812]] + ]); + expect(g.getLayout()).to.be(ol.geom.GeometryLayout.XYZM); + }); + + it('can read a trk with multiple trksegs', function() { + var text = + '' + + ' ' + + ' ' + + ' ' + + ' 3' + + ' ' + + ' ' + + ' ' + + ' 7' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' 10' + + ' ' + + ' ' + + ' ' + + ' 13' + + ' ' + + ' ' + + ' ' + + ' ' + + ''; + var fs = format.readFeatures(text); + expect(fs).to.have.length(1); + var f = fs[0]; + expect(f).to.be.an(ol.Feature); + var g = f.getGeometry(); + expect(g).to.be.an(ol.geom.MultiLineString); + expect(g.getCoordinates()).to.eql([ + [[2, 1, 3, 1263115752], [6, 5, 7, 1263115812]], + [[9, 8, 10, 1263115872], [12, 11, 13, 1263115932]] + ]); + expect(g.getLayout()).to.be(ol.geom.GeometryLayout.XYZM); + }); + + }); + + describe('wpt', function() { + + it('can read a wpt', function() { + var text = + '' + + ' ' + + ''; + var fs = format.readFeatures(text); + expect(fs).to.have.length(1); + var f = fs[0]; + expect(f).to.be.an(ol.Feature); + var g = f.getGeometry(); + expect(g).to.be.an(ol.geom.Point); + expect(g.getCoordinates()).to.eql([2, 1, 0, 0]); + expect(g.getLayout()).to.be(ol.geom.GeometryLayout.XYZM); + }); + + it('can read a wpt with ele', function() { + var text = + '' + + ' ' + + ' 3' + + ' ' + + ''; + var fs = format.readFeatures(text); + expect(fs).to.have.length(1); + var f = fs[0]; + expect(f).to.be.an(ol.Feature); + var g = f.getGeometry(); + expect(g).to.be.an(ol.geom.Point); + expect(g.getCoordinates()).to.eql([2, 1, 3, 0]); + expect(g.getLayout()).to.be(ol.geom.GeometryLayout.XYZM); + }); + + it('can read a wpt with time', function() { + var text = + '' + + ' ' + + ' ' + + ' ' + + ''; + var fs = format.readFeatures(text); + expect(fs).to.have.length(1); + var f = fs[0]; + expect(f).to.be.an(ol.Feature); + var g = f.getGeometry(); + expect(g).to.be.an(ol.geom.Point); + expect(g.getCoordinates()).to.eql([2, 1, 0, 1263115752]); + expect(g.getLayout()).to.be(ol.geom.GeometryLayout.XYZM); + }); + + it('can read a wpt with ele and time', function() { + var text = + '' + + ' ' + + ' 3' + + ' ' + + ' ' + + ''; + var fs = format.readFeatures(text); + expect(fs).to.have.length(1); + var f = fs[0]; + expect(f).to.be.an(ol.Feature); + var g = f.getGeometry(); + expect(g).to.be.an(ol.geom.Point); + expect(g.getCoordinates()).to.eql([2, 1, 3, 1263115752]); + expect(g.getLayout()).to.be(ol.geom.GeometryLayout.XYZM); + }); + + it('can read various wpt attributes', function() { + var text = + '' + + ' ' + + ' 4' + + ' Name' + + ' Comment' + + ' Description' + + ' Source' + + ' ' + + ' Link text' + + ' Link type' + + ' ' + + ' Symbol' + + ' Type' + + ' 2d' + + ' 5' + + ' 6' + + ' 7' + + ' 8' + + ' 9' + + ' 10' + + ' ' + + ''; + var fs = format.readFeatures(text); + expect(fs).to.have.length(1); + var f = fs[0]; + expect(f).to.be.an(ol.Feature); + expect(f.get('name')).to.be('Name'); + expect(f.get('cmt')).to.be('Comment'); + expect(f.get('desc')).to.be('Description'); + expect(f.get('src')).to.be('Source'); + expect(f.get('link')).to.be('http://example.com/'); + expect(f.get('linkText')).to.be('Link text'); + expect(f.get('linkType')).to.be('Link type'); + expect(f.get('sym')).to.be('Symbol'); + expect(f.get('type')).to.be('Type'); + expect(f.get('fix')).to.be('2d'); + expect(f.get('hdop')).to.be(6); + expect(f.get('vdop')).to.be(7); + expect(f.get('pdop')).to.be(8); + expect(f.get('ageofdgpsdata')).to.be(9); + expect(f.get('dgpsid')).to.be(10); + }); + + }); + + describe('XML namespace support', function() { + + it('can read features with a version 1.0 namespace', function() { + var text = + '' + + ' ' + + ' ' + + ' ' + + ''; + var fs = format.readFeatures(text); + expect(fs).to.have.length(3); + }); + + it('can read features with a version 1.1 namespace', function() { + var text = + '' + + ' ' + + ' ' + + ' ' + + ''; + var fs = format.readFeatures(text); + expect(fs).to.have.length(3); + }); + + it('can read features with no namespace', function() { + var text = + '' + + ' ' + + ' ' + + ' ' + + ''; + var fs = format.readFeatures(text); + expect(fs).to.have.length(3); + }); + + }); + + }); + +}); + + +goog.require('ol.Feature'); +goog.require('ol.format.GPX'); +goog.require('ol.geom.LineString'); +goog.require('ol.geom.MultiLineString'); +goog.require('ol.geom.Point');