Thanks, jchris! I now have this: http://mick.couchone.com/blog/_design/geosofa/_list/index/recent-posts?descending=true&limit=10&format=atom
And this is what it looks like in Google Maps: http://maps.google.com/maps?f=q&source=s_q&hl=en&geocode=&q=http:%2F%2Fmick.couchone.com%2Fblog%2F_design%2Fgeosofa%2F_list%2Findex%2Frecent-posts%3Fdescending%3Dtrue%26limit%3D10%26format%3Datom&sll=37.0625,-95.677068&sspn=35.547176,56.513672&ie=UTF8&z=3 Here's what I did: I copied sofa into a new folder geosofa, and made these changes: (at the end of vendor/couchapp/lib/atom.js) exports.header = function(data) { // //var f = <feed xmlns="http://www.w3.org/2005/Atom"/>; var f = <feed xmlns="http://www.w3.org/2005/Atom" xmlns:georss="http://www.georss.org/georss"/>; // f.title = data.title; f.id = data.feed_id; f.li...@href = data.feed_link; f.li...@rel = "self"; f.generator = "CouchApp on CouchDB"; f.updated = rfc3339(data.updated); return f.toXMLString().replace(/\<\/feed\>/,''); }; exports.entry = function(data) { var entry = <entry/>; entry.id = data.entry_id; entry.title = data.title; entry.content = data.content; entry.conte...@type = (data.content_type || 'html'); entry.updated = rfc3339(data.updated); entry.author = <author><name>{data.author}</name></author>; entry.li...@href = data.alternate; entry.li...@rel = "alternate"; // entry.point = data.point; // return entry; } (at the end of lists/index.js) alternate : path.absolute(path.show('post', row.id)), // //point : row.value.loc[1] + " " + row.value.loc[0] point : row.value.latitude + " " + row.value.longitude // }); // send the entry to client send(feedEntry); } while (row = getRow()); } // close the loop after all rows are rendered return "</feed>"; }); }; (I also made the following rudimentary changes to templates/edit.html) <!-- form to create a post --> <form id="new-post" action="new.html" method="post"> <h1>{{pageTitle}}</h1> <!-- amended for geosofa --> <p><label>Place Name</label> <input type="text" size="50" name="title" value=""></p> <p><label>Latitude</label> <input type="text" size="50" name="latitude" value=""></p> <p><label>Longitude</label> <input type="text" size="50" name="longitude" value=""></p> <!-- --> Some issues: 1. I wasn't able to edit atom.js to make it take account of the full name for georss:point entry.georss:point = data.point I tried backslash-escaping, quoting, square brackets etc but with no luck. In the end I settled with "point" (without the namespace). It works but it's a bit wrong. 2. I started by saving the data in an array called "loc", since this is the way suggested by Volker (http://vmx.cx/cgi-bin/blog/index.cgi/geocouch-the-future-is-now:2010-05-03:en,CouchDB,Python,Erlang,geo) and more in line with geojson. However, I've been tripped up by my lack of knowledge in couchapp - I don't know how to write from my couchapp into an array, whereas writing into separate latitude, longitude fields was very easy - just a matter of adding the text input tags to templates/edit.html Thanks very much. Couchapp is simply amazing. Michael On 22 July 2010 21:34, J Chris Anderson <[email protected]> wrote: > > On Jul 22, 2010, at 1:27 PM, Michael Lenahan wrote: > >> Hi there - I'm looking to find ways to get CouchDB to serve georss (in this >> case, a point with latitude and longitude). >> >> I'm taking sofa as my starting point, because it has atom feed capability >> built in. >> >> So, sofa can generate this: >> http://mick.couchone.com/blog/_design/sofa/_list/index/recent-posts?descending=true&limit=10&format=atom >> >> In the couchapp files on my local machine I'm looking to amend >> sofa/lists/index.js so that the feed entry includes georss:point as >> specified here: >> http://www.georss.org/simple#Point >> >> Currently the relevant part of sofa/lists/index.js looks like this: >> >> // generate the entry for this row >> var feedEntry = Atom.entry({ >> entry_id : >> path.absolute('/'+encodeURIComponent(req.info.db_name)+'/'+encodeURIComponent( >> row.id)), >> title : row.value.title, >> content : html, >> updated : new Date(row.value.created_at), >> author : row.value.author, >> alternate : path.absolute(path.show('post', row.id)) >> }); >> > > you will need to modify atom.js to add the proper xml to the output. > > http://github.com/jchris/sofa/blob/master/vendor/couchapp/lib/atom.js#L32 > > You should just copy this to your app's lib folder (I probably never should > have put it in vendor in the first place, no other app uses it, I think). > > I don't know geo rss well enough but if it indeed RSS not Atom you will > probably need to use atom.js as a starting point to write your own XML > generator. > > > >> Has anyone out there done this already? Specifically I wonder how to handle >> the fact of georss:point containing a colon and getting that to work in the >> js file. >> >> Also - apologies if this is a dumb question - is it simply a matter of >> including latitude and longitude in my couchdb database, then concatenating >> these at the correct position in this js file - >> >> georss:point : row.value.latitude + ' ' + row.value.longitude >> > > for this, you can quote the keys, like: "georss:point" > >> - or are there other things I need to consider before referencing these db >> elements? >> >> Thanks! >> >> Michael > >
