git-svn-id: http://svn.openlayers.org/branches/openlayers/2.7@7975 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf
176 lines
5.9 KiB
JavaScript
176 lines
5.9 KiB
JavaScript
/* Copyright (c) 2006-2007 MetaCarta, Inc., published under a modified BSD license.
|
|
* See http://svn.openlayers.org/trunk/openlayers/repository-license.txt
|
|
* for the full text of the license. */
|
|
|
|
/**
|
|
* @requires OpenLayers/Format/XML.js
|
|
* @requires OpenLayers/Feature/Vector.js
|
|
* @requires OpenLayers/Geometry/Point.js
|
|
* @requires OpenLayers/Geometry/LineString.js
|
|
*
|
|
* Class: OpenLayers.Format.GPX
|
|
* Read/write GPX parser. Create a new instance with the
|
|
* <OpenLayers.Format.GPX> constructor.
|
|
*
|
|
* Inherits from:
|
|
* - <OpenLayers.Format.XML>
|
|
*/
|
|
OpenLayers.Format.GPX = OpenLayers.Class(OpenLayers.Format.XML, {
|
|
/**
|
|
* APIProperty: extractWaypoints
|
|
* {Boolean} Extract waypoints from GPX. (default: true)
|
|
*/
|
|
extractWaypoints: true,
|
|
|
|
/**
|
|
* APIProperty: extractTracks
|
|
* {Boolean} Extract tracks from GPX. (default: true)
|
|
*/
|
|
extractTracks: true,
|
|
|
|
/**
|
|
* APIProperty: extractRoutes
|
|
* {Boolean} Extract routes from GPX. (default: true)
|
|
*/
|
|
extractRoutes: true,
|
|
|
|
/**
|
|
* APIProperty: extractAttributes
|
|
* {Boolean} Extract feature attributes from GPX. (default: true)
|
|
* NOTE: Attributes as part of extensions to the GPX standard may not
|
|
* be extracted.
|
|
*/
|
|
extractAttributes: true,
|
|
|
|
/**
|
|
* Constructor: OpenLayers.Format.GPX
|
|
* Create a new parser for GPX.
|
|
*
|
|
* Parameters:
|
|
* options - {Object} An optional object whose properties will be set on
|
|
* this instance.
|
|
*/
|
|
initialize: function(options) {
|
|
OpenLayers.Format.XML.prototype.initialize.apply(this, [options]);
|
|
},
|
|
|
|
/**
|
|
* APIMethod: read
|
|
* Return a list of features from a GPX doc
|
|
*
|
|
* Parameters:
|
|
* doc - {Element}
|
|
*
|
|
* Returns:
|
|
* An Array of <OpenLayers.Feature.Vector>s
|
|
*/
|
|
read: function(doc) {
|
|
if (typeof doc == "string") {
|
|
doc = OpenLayers.Format.XML.prototype.read.apply(this, [doc]);
|
|
}
|
|
var features = [];
|
|
|
|
if(this.extractWaypoints) {
|
|
var waypoints = doc.getElementsByTagName("wpt");
|
|
for (var l = 0, len = waypoints.length; l < len; l++) {
|
|
var attrs = {};
|
|
if(this.extractAttributes) {
|
|
attrs = this.parseAttributes(waypoints[l]);
|
|
}
|
|
var wpt = new OpenLayers.Geometry.Point(waypoints[l].getAttribute("lon"), waypoints[l].getAttribute("lat"));
|
|
features.push(new OpenLayers.Feature.Vector(wpt, attrs));
|
|
}
|
|
}
|
|
|
|
if(this.extractTracks) {
|
|
var tracks = doc.getElementsByTagName("trk");
|
|
for (var i=0, len=tracks.length; i<len; i++) {
|
|
// Attributes are only in trk nodes, not trkseg nodes
|
|
var attrs = {};
|
|
if(this.extractAttributes) {
|
|
attrs = this.parseAttributes(tracks[i]);
|
|
}
|
|
|
|
var segs = this.getElementsByTagNameNS(tracks[i], tracks[i].namespaceURI, "trkseg");
|
|
for (var j = 0, seglen = segs.length; j < seglen; j++) {
|
|
// We don't yet support extraction of trkpt attributes
|
|
// All trksegs of a trk get that trk's attributes
|
|
var track = this.extractSegment(segs[j], "trkpt");
|
|
features.push(new OpenLayers.Feature.Vector(track, attrs));
|
|
}
|
|
}
|
|
}
|
|
|
|
if(this.extractRoutes) {
|
|
var routes = doc.getElementsByTagName("rte");
|
|
for (var k=0, klen=routes.length; k<klen; k++) {
|
|
var attrs = {};
|
|
if(this.extractAttributes) {
|
|
attrs = this.parseAttributes(routes[k]);
|
|
}
|
|
var route = this.extractSegment(routes[k], "rtept");
|
|
features.push(new OpenLayers.Feature.Vector(route, attrs));
|
|
}
|
|
}
|
|
|
|
if (this.internalProjection && this.externalProjection) {
|
|
for (var g = 0, featLength = features.length; g < featLength; g++) {
|
|
features[g].geometry.transform(this.externalProjection,
|
|
this.internalProjection);
|
|
}
|
|
}
|
|
|
|
return features;
|
|
},
|
|
|
|
/**
|
|
* Method: extractSegment
|
|
*
|
|
* Parameters:
|
|
* segment - {<DOMElement>} a trkseg or rte node to parse
|
|
* segmentType - {String} nodeName of waypoints that form the line
|
|
*
|
|
* Returns:
|
|
* {<OpenLayers.Geometry.LineString>} A linestring geometry
|
|
*/
|
|
extractSegment: function(segment, segmentType) {
|
|
var points = this.getElementsByTagNameNS(segment, segment.namespaceURI, segmentType);
|
|
var point_features = [];
|
|
for (var i = 0, len = points.length; i < len; i++) {
|
|
point_features.push(new OpenLayers.Geometry.Point(points[i].getAttribute("lon"), points[i].getAttribute("lat")));
|
|
}
|
|
return new OpenLayers.Geometry.LineString(point_features);
|
|
},
|
|
|
|
/**
|
|
* Method: parseAttributes
|
|
*
|
|
* Parameters:
|
|
* node - {<DOMElement>}
|
|
*
|
|
* Returns:
|
|
* {Object} An attributes object.
|
|
*/
|
|
parseAttributes: function(node) {
|
|
// node is either a wpt, trk or rte
|
|
// attributes are children of the form <attr>value</attr>
|
|
var attributes = {};
|
|
var attrNode = node.firstChild;
|
|
while(attrNode) {
|
|
if(attrNode.nodeType == 1) {
|
|
var value = attrNode.firstChild;
|
|
if(value.nodeType == 3 || value.nodeType == 4) {
|
|
name = (attrNode.prefix) ?
|
|
attrNode.nodeName.split(":")[1] :
|
|
attrNode.nodeName;
|
|
attributes[name] = value.nodeValue;
|
|
}
|
|
}
|
|
attrNode = attrNode.nextSibling;
|
|
}
|
|
return attributes;
|
|
},
|
|
|
|
CLASS_NAME: "OpenLayers.Format.GPX"
|
|
});
|