Thanks for sharing this info - very similar to what I want to try and
do with couchdb.
Sent from my iPhone
On Jul 23, 2010, at 1:28 PM, Michael Lenahan
<[email protected]> wrote:
(Resending because I forgot to add a section I amended in templates/
edit.html)
---------- Forwarded message ----------
From: Michael Lenahan <[email protected]>
Date: 23 July 2010 20:23
Subject: Re: georss atom feed
To: [email protected]
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>
<!-- -->
(... this is further down in templates/edit.html)
// apply docForm at login.
$("#account").evently({
loggedIn : function(e,r) {
var userCtx = r.userCtx;
postForm = app.docForm("form#new-post", {
id : {{ docid }},
//fields : ["title", "body", "tags"],
fields : ["title", "latitude", "longitude", "body",
"tags"],
template : {
type : "post",
format : "markdown",
author : userCtx.name
},
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