[OpenLayers-Commits] r4197 - sandbox/tschaub/xml/lib/OpenLayers/Format

commits at openlayers.org commits at openlayers.org
Fri Sep 7 18:19:57 EDT 2007


Author: crschmidt
Date: 2007-09-07 18:19:55 -0400 (Fri, 07 Sep 2007)
New Revision: 4197

Modified:
   sandbox/tschaub/xml/lib/OpenLayers/Format/GeoRSS.js
Log:
Make GeoRSS format do GeoRSS points, lines, polygons in addition
to wgs84. 


Modified: sandbox/tschaub/xml/lib/OpenLayers/Format/GeoRSS.js
===================================================================
--- sandbox/tschaub/xml/lib/OpenLayers/Format/GeoRSS.js	2007-09-07 22:06:40 UTC (rev 4196)
+++ sandbox/tschaub/xml/lib/OpenLayers/Format/GeoRSS.js	2007-09-07 22:19:55 UTC (rev 4197)
@@ -46,61 +46,67 @@
     },
     
     /**
-     * APIMethod: read
-     * Return a list of features from a GeoRSS doc
-     
-     * Parameters:
-     * data - {Element} 
-     *
-     * Returns:
-     * An Array of <OpenLayers.Feature.Vector>s
+     * Method: createGeometryFromItem
+     * Return an {<OpenLayers.Geometry>} from an XML dom GeoRSS Item.
      */
-    read: function(doc) {
-        if (typeof doc == "string") { 
-            doc = OpenLayers.Format.XML.prototype.read.apply(this, [doc]);
-        }
-
-        /* Try RSS items first, then Atom entries */
-        var itemlist = null;
-        itemlist = this.getElementsByTagNameNS(doc, '*', 'item');
-        if (itemlist.length == 0) {
-            itemlist = this.getElementsByTagNameNS(doc, '*', 'entry');
-        }
-        
-        var features = [];
-        for(var i=0; i<itemlist.length; i++) {
-            // this is horrendous - please change this
-            var point = OpenLayers.Util.getNodes(itemlist[i], 'georss:point');
-            var lat = OpenLayers.Util.getNodes(itemlist[i], 'geo:lat');
-            var lon = OpenLayers.Util.getNodes(itemlist[i], 'geo:long');
+    createGeometryFromItem: function(item) {
+        var point = OpenLayers.Util.getNodes(item, 'georss:point');
+        var line = OpenLayers.Util.getNodes(item, 'georss:line');
+        var polygon = OpenLayers.Util.getNodes(item, 'georss:polygon');
+        var lat = OpenLayers.Util.getNodes(item, 'geo:lat');
+        var lon = OpenLayers.Util.getNodes(item, 'geo:long');
+        if (point.length > 0 || (lat.length > 0 && lon.length > 0)) {
             if (point.length > 0) {
                 var location = point[0].firstChild.nodeValue.trim().split(/\s+/);
                 
                 if (location.length !=2) {
                     var location = point[0].firstChild.nodeValue.trim().split(/\s*,\s*/);
                 }
-            } else if (lat.length > 0 && lon.length > 0) {
+            } else {
                 var location = [parseFloat(lat[0].firstChild.nodeValue), parseFloat(lon[0].firstChild.nodeValue)];
-            } else {
-                continue;
+            }    
+            var geometry = new OpenLayers.Geometry.Point(parseFloat(location[1]),
+                                                     parseFloat(location[0]));
+        } else if (line.length > 0) {
+            var coords = line[0].firstChild.nodeValue.trim().split(/\s+/);
+            var components = []; 
+            for (var i=0; i < coords.length; i+=2) {
+                var point = new OpenLayers.Geometry.Point(parseFloat(coords[i+1]), parseFloat(coords[i]));
+                components.push(point);
             }
-            var geometry = new OpenLayers.Geometry.Point(parseFloat(location[1]),
-                                                         parseFloat(location[0]));
+            geometry = new OpenLayers.Geometry.LineString(components);
+        } else if (polygon.length > 0) { 
+            var coords = polygon[0].firstChild.nodeValue.trim().split(/\s+/);
+            var components = []; 
+            for (var i=0; i < coords.length; i+=2) {
+                var point = new OpenLayers.Geometry.Point(parseFloat(coords[i+1]), parseFloat(coords[i]));
+                components.push(point);
+            }
+            geometry = new OpenLayers.Geometry.Polygon([new OpenLayers.Geometry.LinearRing(components)]);
+        }
+        return geometry;                                             
+    },        
 
+    /**
+     * Method: createGeometryFromItem
+     * Return an {<OpenLayers.Feature.Vector>} from an XML dom GeoRSS Item.
+     */
+    createFeatureFromItem: function(item) {
+            var geometry = this.createGeometryFromItem(item);
             /* Provide defaults for title and description */
             var title = "Untitled";
             try {
-                title = OpenLayers.Util.getNodes(itemlist[i], 
+                title = OpenLayers.Util.getNodes(item, 
                         "title")[0].firstChild.nodeValue;
             }
             catch (e) { title="Untitled"; }
            
             /* First try RSS descriptions, then Atom summaries */
-            var descr_nodes = this.getElementsByTagNameNS(itemlist[i],
+            var descr_nodes = this.getElementsByTagNameNS(item,
                                                           "*",
                                                           "description");
             if (descr_nodes.length == 0) {
-                descr_nodes = this.getElementsByTagNameNS(itemlist[i],
+                descr_nodes = this.getElementsByTagNameNS(item,
                                                           "*",
                                                           "summary");
             }
@@ -112,23 +118,62 @@
 
             /* If no link URL is found in the first child node, try the
                href attribute */
+            var link = null;
+            var edit_link = null;
             try {
-                var link = OpenLayers.Util.getNodes(itemlist[i], "link")[0].firstChild.nodeValue;
-            } 
+                var link = OpenLayers.Util.getNodes(item, "link")[0].firstChild.nodeValue;
+            }
             catch (e) {
-                try {
-                    var link = OpenLayers.Util.getNodes(itemlist[i], "link")[0].getAttribute("href");
-                }
-                catch (e) {}
+                var link_list = OpenLayers.Util.getNodes(item, "link");
+                for (var i = 0; i < link_list.length; i++) {
+                    var this_link = link_list[i];
+                    link = this_link.getAttribute("href");
+                }    
             }
+            var id = null;
+            try {
+                id = OpenLayers.Util.getNodes(item, "id")[0].firstChild.nodeValue;
+            } catch (e) {
+            }
             
             var data = {
                 "title": title,
                 "description": description,
-                "link": link
+                "link": link,
             };
-            features.push(new OpenLayers.Feature.Vector(geometry, data));
+            var feature = new OpenLayers.Feature.Vector(geometry, data);
+            feature.fid = id;
+            return feature;
+    },        
+    
+    /**
+     * APIMethod: read
+     * Return a list of features from a GeoRSS doc
+     
+     * Parameters:
+     * data - {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]);
         }
+
+        /* Try RSS items first, then Atom entries */
+        var itemlist = null;
+        itemlist = this.getElementsByTagNameNS(doc, '*', 'item');
+        if (itemlist.length == 0) {
+            itemlist = this.getElementsByTagNameNS(doc, '*', 'entry');
+        }
+        
+        var features = [];
+        for(var i=0; i<itemlist.length; i++) {
+            // this is horrendous - please change this
+            var item = itemlist[i];
+            features.push(this.createFeatureFromItem(item));
+        }
         return features;
     },
     



More information about the Commits mailing list