[OpenLayers-Commits] r12352 - in sandbox/camptocamp/gpx/openlayers: lib/OpenLayers/Format tests/Format

commits-20090109 at openlayers.org commits-20090109 at openlayers.org
Fri Sep 9 11:53:11 EDT 2011


Author: pgiraud
Date: 2011-09-09 08:53:10 -0700 (Fri, 09 Sep 2011)
New Revision: 12352

Modified:
   sandbox/camptocamp/gpx/openlayers/lib/OpenLayers/Format/GPX.js
   sandbox/camptocamp/gpx/openlayers/tests/Format/GPX.html
Log:
Adding support for name and desc attributes

Modified: sandbox/camptocamp/gpx/openlayers/lib/OpenLayers/Format/GPX.js
===================================================================
--- sandbox/camptocamp/gpx/openlayers/lib/OpenLayers/Format/GPX.js	2011-09-09 09:04:42 UTC (rev 12351)
+++ sandbox/camptocamp/gpx/openlayers/lib/OpenLayers/Format/GPX.js	2011-09-09 15:53:10 UTC (rev 12352)
@@ -20,6 +20,23 @@
  *  - <OpenLayers.Format.XML>
  */
 OpenLayers.Format.GPX = OpenLayers.Class(OpenLayers.Format.XML, {
+    
+    /** 
+     * APIProperty: waypointsDesc
+     * {String} Default description of the waypoints in the case where the
+     *     feature has no "description" attribute.
+     *     Default is "No description available".
+     */
+    waypointsDesc: "No description available",
+
+    /** 
+     * APIProperty: tracksDesc
+     * {String} Default description of the tracks in the case where the
+     *     feature has no "description" attribute.
+     *     Default is "No description available".
+     */
+    tracksDesc: "No description available",
+
    /**
     * APIProperty: extractWaypoints
     * {Boolean} Extract waypoints from GPX. (default: true)
@@ -189,7 +206,7 @@
 
     /**
      * APIMethod: write
-     * Accept Feature Collection, and return a string. 
+     * Accepts Feature Collection, and returns a string. 
      * 
      * Parameters: 
      * features - {Array(<OpenLayers.Feature.Vector>)} List of features to serialize into a string.
@@ -200,54 +217,43 @@
             features : [features];
         gpx = this.createElementNS(this.gpxns, "gpx");
 
-        var featuresNodes = this.buildFeaturesNodes(features);
-        for(var i=0, len=featuresNodes.length; i<len; i++) {
-            gpx.appendChild(featuresNodes[i]);
+        for(var i=0, len=features.length; i<len; i++) {
+            gpx.appendChild(this.buildFeatureNode(features[i]));
         }
         return OpenLayers.Format.XML.prototype.write.apply(this, [gpx]);
     },
 
     /**
-     * Method: buildFeaturesNodes
-     * Accept an array of <OpenLayers.Feature.Vector>, and build a array of nodes for it.
+     * Method: buildFeatureNode
+     * Accepts an <OpenLayers.Feature.Vector>, and builds a node for it.
      * 
      * Parameters:
-     * features - {Array(<OpenLayers.Feature.Vector>)} 
+     * feature - {<OpenLayers.Feature.Vector>}
      *
      * Returns:
      * {Array(DOMElement)}
      */
-    buildFeaturesNodes: function(features) {
-        var featuresNodes = [],
-            trkNode;
-
-        // trk node needs to be added only once
-        function createTrkNode() {
-            if (!trkNode) {
-                trkNode = this.createElementNS(this.gpxns, "trk");
-                featuresNodes.push(trkNode);
+    buildFeatureNode: function(feature) {
+        var geometry = feature.geometry;
+            geometry = geometry.clone();
+        if (this.internalProjection && this.externalProjection) {
+            geometry.transform(this.internalProjection, 
+                               this.externalProjection);
+        }
+        if (geometry.CLASS_NAME == "OpenLayers.Geometry.Point") {
+            var wpt = this.buildWptNode(feature);
+            return wpt;
+        } else {
+            var trkNode = this.createElementNS(this.gpxns, "trk");
+            this.appendAttributesNode(trkNode, feature);
+            var trkSegNodes = this.buildTrkSegNode(geometry);
+            trkSegNodes = OpenLayers.Util.isArray(trkSegNodes) ?
+                trkSegNodes : [trkSegNodes];
+            for (var i = 0, len = trkSegNodes.length; i < len; i++) {
+                trkNode.appendChild(trkSegNodes[i]);
             }
             return trkNode;
         }
-        for (var i = 0, len=features.length; i < len; i++) {
-            var geometry = features[i].geometry;
-                geometry = geometry.clone();
-            if (this.internalProjection && this.externalProjection) {
-                geometry.transform(this.internalProjection, 
-                                   this.externalProjection);
-            }
-            if (geometry.CLASS_NAME == "OpenLayers.Geometry.Point") {
-                featureNode = this.createElementNS(this.gpxns, "wpt");
-                featureNode.setAttribute("lon", geometry.x);
-                featureNode.setAttribute("lat", geometry.y);
-                featuresNodes.push(featureNode);
-            } else {
-                trkNode = createTrkNode.call(this);
-                this.buildTrkSegNode(trkNode, geometry);
-            }
-        }
-
-        return featuresNodes;
     },
 
     /**
@@ -255,10 +261,10 @@
      * Builds trkseg node(s) given a geometry
      *
      * Parameters:
-     * trkNode - {DOMElement} the node to add the trkseg nodes to
+     * trknode
      * geometry - {OpenLayers.Geometry}
      */
-    buildTrkSegNode: function(trkNode, geometry) {
+    buildTrkSegNode: function(geometry) {
         if (geometry.CLASS_NAME == "OpenLayers.Geometry.LineString" ||
             geometry.CLASS_NAME == "OpenLayers.Geometry.LinearRing") {
             var node = this.createElementNS(this.gpxns, "trkseg");
@@ -266,11 +272,13 @@
                 var point = geometry.components[i];
                 node.appendChild(this.buildTrkPtNode(point));
             }
-            trkNode.appendChild(node);
+            return node;
         } else {
-            for (var i = 0, len=geometry.components.length; i < len; i++) {
-                this.buildTrkSegNode(trkNode, geometry.components[i]);
+            var nodes = [];
+            for (var i = 0, len = geometry.components.length; i < len; i++) {
+                nodes.push(this.buildTrkSegNode(geometry.components[i]));
             }
+            return nodes;
         }
     },
     
@@ -291,5 +299,43 @@
         return node;
     },
 
+    /**
+     * Method: buildWptNode
+     * Builds a wpt node given a point
+     *
+     * Parameters:
+     * feature - {OpenLayers.Feature.Vector}
+     *
+     * Returns:
+     * {DOMElement} A wpt node
+     */
+    buildWptNode: function(feature) {
+        var node = this.createElementNS(this.gpxns, "wpt");
+        node.setAttribute("lon", feature.geometry.x);
+        node.setAttribute("lat", feature.geometry.y);
+        this.appendAttributesNode(node, feature);
+        return node;
+    },
+
+    /**
+     * Method: appendAttributesNode
+     * Adds some attributes node.
+     *
+     * Parameters:
+     * node - {DOMElement} the node to append the attribute nodes to.
+     * feature - {OpenLayers.Feature.Vector}
+     */
+    appendAttributesNode: function(node, feature) {
+        var name = this.createElementNS(this.gpxns, 'name');
+        name.appendChild(this.createTextNode(
+            feature.attributes.name || feature.attributes.id));
+        node.appendChild(name);
+        var desc = this.createElementNS(this.gpxns, 'desc');
+        desc.appendChild(this.createTextNode(
+            feature.attributes.description || this.defaultDesc));
+        node.appendChild(desc);
+        // TBD - deal with remaining (non name/description) attributes.
+    },
+
     CLASS_NAME: "OpenLayers.Format.GPX"
 });

Modified: sandbox/camptocamp/gpx/openlayers/tests/Format/GPX.html
===================================================================
--- sandbox/camptocamp/gpx/openlayers/tests/Format/GPX.html	2011-09-09 09:04:42 UTC (rev 12351)
+++ sandbox/camptocamp/gpx/openlayers/tests/Format/GPX.html	2011-09-09 15:53:10 UTC (rev 12352)
@@ -42,11 +42,11 @@
         var point = new OpenLayers.Geometry.Point(-111.04, 45.68);  
         var point2 = new OpenLayers.Geometry.Point(-112.04, 45.68); 
         var features = [
-            new OpenLayers.Feature.Vector(point),
-            new OpenLayers.Feature.Vector(point2)
+            new OpenLayers.Feature.Vector(point, {name: 'foo', description: 'bar'}),
+            new OpenLayers.Feature.Vector(point2, {name: 'foo', description: 'bar'})
         ];
         var data = parser.write(features);
-        t.xml_eq(data, '<?xml version="1.0" encoding="ISO-8859-1"?><gpx xmlns="http://www.topografix.com/GPX/1/1"><wpt lon="-111.04" lat="45.68"/><wpt lon="-112.04" lat="45.68"/></gpx>', 'GPX serializes points correctly');
+        t.xml_eq(data, '<?xml version="1.0" encoding="ISO-8859-1"?><gpx xmlns="http://www.topografix.com/GPX/1/1"><wpt lon="-111.04" lat="45.68"><name>foo</name><desc>bar</desc></wpt><wpt lon="-112.04" lat="45.68"><name>foo</name><desc>bar</desc></wpt></gpx>', 'GPX serializes points correctly');
     }
     function test_Format_GPX_serialize_line(t) { 
         t.plan(1);
@@ -56,9 +56,9 @@
         var point = new OpenLayers.Geometry.Point(-111.04, 45.68);  
         var point2 = new OpenLayers.Geometry.Point(-112.04, 45.68); 
         var line = new OpenLayers.Geometry.LineString([point, point2]);
-        var f = new OpenLayers.Feature.Vector(line);
+        var f = new OpenLayers.Feature.Vector(line, {name: 'foo', description: 'bar'});
         var data = parser.write(f);
-        t.xml_eq(data, '<?xml version="1.0" encoding="ISO-8859-1"?><gpx xmlns="http://www.topografix.com/GPX/1/1"><trk><trkseg><trkpt lon="-111.04" lat="45.68"/><trkpt lon="-112.04" lat="45.68"/></trkseg></trk></gpx>', 'GPX serializes line correctly');
+        t.xml_eq(data, '<?xml version="1.0" encoding="ISO-8859-1"?><gpx xmlns="http://www.topografix.com/GPX/1/1"><trk><name>foo</name><desc>bar</desc><trkseg><trkpt lon="-111.04" lat="45.68"/><trkpt lon="-112.04" lat="45.68"/></trkseg></trk></gpx>', 'GPX serializes line correctly');
     }
     function test_Format_GPX_serialize_lines(t) { 
         t.plan(1);
@@ -71,10 +71,10 @@
         var point3 = new OpenLayers.Geometry.Point(1, 2);  
         var point4 = new OpenLayers.Geometry.Point(3, 4); 
         var line2 = new OpenLayers.Geometry.LineString([point3, point4]);
-        var f = new OpenLayers.Feature.Vector(line);
-        var f2 = new OpenLayers.Feature.Vector(line2);
+        var f = new OpenLayers.Feature.Vector(line, {name: 'foo', description: 'bar'});
+        var f2 = new OpenLayers.Feature.Vector(line2, {name: 'dude', description: 'truite'});
         var data = parser.write([f, f2]);
-        t.xml_eq(data, '<?xml version="1.0" encoding="ISO-8859-1"?><gpx xmlns="http://www.topografix.com/GPX/1/1"><trk><trkseg><trkpt lon="-111.04" lat="45.68"/><trkpt lon="-112.04" lat="45.68"/></trkseg><trkseg><trkpt lon="1" lat="2"/><trkpt lon="3" lat="4"/></trkseg></trk></gpx>', 'GPX serializes lines correctly');
+        t.xml_eq(data, '<?xml version="1.0" encoding="ISO-8859-1"?><gpx xmlns="http://www.topografix.com/GPX/1/1"><trk><name>foo</name><desc>bar</desc><trkseg><trkpt lon="-111.04" lat="45.68"/><trkpt lon="-112.04" lat="45.68"/></trkseg></trk><trk><name>dude</name><desc>truite</desc><trkseg><trkpt lon="1" lat="2"/><trkpt lon="3" lat="4"/></trkseg></trk></gpx>', 'GPX serializes lines correctly');
     }
     function test_Format_GPX_serialize_multiline(t) { 
         t.plan(1);
@@ -88,9 +88,9 @@
         var point4 = new OpenLayers.Geometry.Point(3, 4); 
         var line2 = new OpenLayers.Geometry.LineString([point3, point4]);
         var multiline = new OpenLayers.Geometry.MultiLineString([line, line2]);
-        var f = new OpenLayers.Feature.Vector(multiline);
+        var f = new OpenLayers.Feature.Vector(multiline, {name: 'foo', description: 'bar'});
         var data = parser.write([f]);
-        t.xml_eq(data, '<?xml version="1.0" encoding="ISO-8859-1"?><gpx xmlns="http://www.topografix.com/GPX/1/1"><trk><trkseg><trkpt lon="-111.04" lat="45.68"/><trkpt lon="-112.04" lat="45.68"/></trkseg><trkseg><trkpt lon="1" lat="2"/><trkpt lon="3" lat="4"/></trkseg></trk></gpx>', 'GPX serializes multiline correctly');
+        t.xml_eq(data, '<?xml version="1.0" encoding="ISO-8859-1"?><gpx xmlns="http://www.topografix.com/GPX/1/1"><trk><name>foo</name><desc>bar</desc><trkseg><trkpt lon="-111.04" lat="45.68"/><trkpt lon="-112.04" lat="45.68"/></trkseg><trkseg><trkpt lon="1" lat="2"/><trkpt lon="3" lat="4"/></trkseg></trk></gpx>', 'GPX serializes multiline correctly');
     }
     function test_Format_GPX_serialize_polygon(t) { 
         t.plan(1);
@@ -101,9 +101,9 @@
         var point2 = new OpenLayers.Geometry.Point(-112.04, 45.68); 
         var linearRing = new OpenLayers.Geometry.LinearRing([point, point2, point.clone()]);
         var polygon = new OpenLayers.Geometry.Polygon([linearRing]);
-        var f = new OpenLayers.Feature.Vector(polygon);
+        var f = new OpenLayers.Feature.Vector(polygon, {name: 'foo', description: 'bar'});
         var data = parser.write([f]);
-        t.xml_eq(data, '<?xml version="1.0" encoding="ISO-8859-1"?><gpx xmlns="http://www.topografix.com/GPX/1/1"><trk><trkseg><trkpt lon="-111.04" lat="45.68"/><trkpt lon="-112.04" lat="45.68"/><trkpt lon="-111.04" lat="45.68"/></trkseg></trk></gpx>', 'GPX serializes polygon correctly');
+        t.xml_eq(data, '<?xml version="1.0" encoding="ISO-8859-1"?><gpx xmlns="http://www.topografix.com/GPX/1/1"><trk><name>foo</name><desc>bar</desc><trkseg><trkpt lon="-111.04" lat="45.68"/><trkpt lon="-112.04" lat="45.68"/><trkpt lon="-111.04" lat="45.68"/></trkseg></trk></gpx>', 'GPX serializes polygon correctly');
     }
     </script> 
 </head> 



More information about the Commits mailing list