<?xml version="1.0" encoding="utf-8"?>
<!-- generator="Kukkaisvoima version 7" -->
<rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
>
<channel>
<title>vmx: geo</title>
<link>http://vmx.cx/cgi-bin/blog/index.cgi</link>
<description>Blog of Volker Mische</description>
<pubDate>Sun, 20 Dec 2009 16:37:21 +0200</pubDate>
<lastBuildDate>Sun, 20 Dec 2009 16:37:21 +0200</lastBuildDate>
<generator>http://23.fi/kukkaisvoima/</generator>
<language>en</language>
<item>
<title>GeoCouch: The future
</title>
<link>http://vmx.cx/cgi-bin/blog/index.cgi/geocouch-the-future%3A2009-12-20%3Aen%2CCouchDB%2CPython%2Cgeo</link>
<comments>http://vmx.cx/cgi-bin/blog/index.cgi/geocouch-the-future%3A2009-12-20%3Aen%2CCouchDB%2CPython%2Cgeo#comments</comments>
<pubDate>Sun, 20 Dec 2009 16:37:21 +0200</pubDate>
<dc:creator>Volker Mische</dc:creator>
<category>en</category>
<category>CouchDB</category>
<category>Python</category>
<category>geo</category>
<guid isPermaLink="false">http://vmx.cx/cgi-bin/blog/index.cgi/geocouch-the-future%3A2009-12-20%3Aen%2CCouchDB%2CPython%2Cgeo/</guid>
<description><![CDATA[ 
 [...]]]></description>
<content:encoded><![CDATA[

<p><a href="http://gitorious.org/geocouch/">GeoCouch</a> started as a <a href="/cgi-bin/blog/index.cgi/geocouch-geospatial-queries-with-couchdb:2008-10-26:en,CouchDB,Python,geo">proof of concept</a> and was heavily rewritten for the <a href="/cgi-bin/blog/index.cgi/geocouch-new-release-0.10.0:2009-09-19:en,CouchDB,Python,geo">0.10 release</a>. As more and more people got interested, I got feedback to see what people really want/need. And now it's time to determine the future of GeoCouch. It's your chance to shape the future. In this blog entry I'll explain my ideas for the future, but I'm more than happy to get further ideas/complains from you. So please check if my ideas match your use-cases for GeoCouch.
</p>
<h3>Stripping it down</h3>
<p>GeoCouch needs an external spatial index, at the moment I use <a href="http://www.gaia-gis.it/spatialite/">SpatiaLite</a> for it, but a <a href="http://postgis.refractions.net/">PostGIS</a> backend would be easily possible. My inital idea was that it is better to use the existing power of spatial databases, rather than reinventing the wheel. I though I could use all the power they have, that I can even use them for complex analytics, but I can't. As I only store the geometries, I need to “ask” CouchDB for the attributes (no, I don't want to store attributes in my spatial index).
<!--This would be possible, but I'll explain the “analytics use-case” later.-->
</p>
<p>If I don't use the full power of the spatial databases, but only a small fraction, there might be better solution. Therefore I propose that GeoCouch will use a simple spatial index for storing the geometries, not a full blown spatial database. I haven't decided yet which one it'll be, but I really think about moving this part to Erlang (I know that quite a few people would love that move).
</p>
<p>You will loose functionality like reprojection. The spatial index won't know anything about projections. So GeoCouch won't be projection aware anymore, but you application still can be. For example if you want to return your data in a different projection than it was stored, you do the transformation after you've queried GeoCouch.
</p>
<p>You would also loose fancy things for geometries, like boolean operations on them. But this is something I'd call complex analytics, and not simple querying.
</p>
<p>GeoCouch would only support three simple queries: bounding search, polygon search and radius/distance search. If the search would be within a union of polygons, let's say all countries of the European Union, you would simply make the union operation before you query GeoCouch.
</p>

<h3>Complex analytics</h3>
<p>What I call “complex analytics” is things like: “return all apple trees that are located with a 10km range around buildings that have are over 100m high, but only in countries with a population over 50 million people” is not possible with GeoCouch as you would need the attribute values as well. Those are stored in CouchDB, so you would need to request them. What GeoCouch only supports is a simple: give me all IDs within a bounding box/polygon/radius.
</p>

<h3>Conclusion</h3>
<p>Simple requests are needed for everyday use, thus they should be incredibly fast. Complex analytics don't necessarily need to handle thousands of requests per second, in most cases they don't even need to be processed in real-time. I'd like to see some layer build above GeoCouch, so CouchDB can even be used for analytics (which is a thing I wanted to have right from the start).
</p>
<p>This means that GeoCouch will be mainly for high performance and massive sized projects that need some simple spatial bits, what I think the majority of users need.
</p>
<p>If you either think you really need only those simple queries, but you want them to be fast, or you think this is wrong, that you need dynamic reprojection I can only invite you to leave a comment below or drop a mail to <a href="mailto:volker.mische@gmail.com">volker.mische@gmail.com</a>. Thanks.
</p>
]]></content:encoded>
<wfw:commentRss>http://vmx.cx/cgi-bin/blog/index.cgi/geocouch-the-future%3A2009-12-20%3Aen%2CCouchDB%2CPython%2Cgeo/feed/</wfw:commentRss>
</item>
<item>
<title>FOSS4G 2009: “Geodata and CouchDB” presentation is online
</title>
<link>http://vmx.cx/cgi-bin/blog/index.cgi/foss4g-2009-presentation-is-online%3A2009-11-17%3Aen%2CCouchDB%2CPython%2Cgeo</link>
<comments>http://vmx.cx/cgi-bin/blog/index.cgi/foss4g-2009-presentation-is-online%3A2009-11-17%3Aen%2CCouchDB%2CPython%2Cgeo#comments</comments>
<pubDate>Tue, 17 Nov 2009 11:48:43 +0200</pubDate>
<dc:creator>Volker Mische</dc:creator>
<category>en</category>
<category>CouchDB</category>
<category>Python</category>
<category>geo</category>
<guid isPermaLink="false">http://vmx.cx/cgi-bin/blog/index.cgi/foss4g-2009-presentation-is-online%3A2009-11-17%3Aen%2CCouchDB%2CPython%2Cgeo/</guid>
<description><![CDATA[ 
 [...]]]></description>
<content:encoded><![CDATA[

<p>The final wrap-up of the <a href="http://2009.foss4g.org/">FOSS4G 2009</a>,
<a href="http://2009.foss4g.org/presentations/#presentation_78">my presentation
on “Geodata and CouchDB”</a> is available online in several formats. It should
also be of interest for people who are new to CouchDB as huge parts of the
talk are an introduction into CouchDB.
</p>
<ul>
  <li>The raw slides
<a href="/blog/2009-11-17/geodata-and-couchdb.pdf">as PDF</a> (licensed under
<a href="http://creativecommons.org/licenses/by/3.0/de/">CC-BY-3.0-de</a>).</li>
  <li>The slides with comments
<a href="/blog/2009-11-17/geodata-and-couchdb.htm">as HTML</a> (licensed under
<a href="http://creativecommons.org/licenses/by/3.0/de/">CC-BY-3.0-de</a>).</li>
  <li>The <a href="http://www.fosslc.org/drupal/node/595">slides with audio</a>
(<a href="http://blip.tv/file/2795979">or at blib.tv</a>). It’s the
recording of the actual talk at the conference</a>. Thanks
<a href="http://georaffe.org/">Alex</a> and
<a href="http://www.fosslc.org/">FOSSLC</a> for recording it (licensed under
<a href="http://creativecommons.org/licenses/by-sa/3.0/">CC-BY-SA-3.0</a>).</li>
</ul>
]]></content:encoded>
<wfw:commentRss>http://vmx.cx/cgi-bin/blog/index.cgi/foss4g-2009-presentation-is-online%3A2009-11-17%3Aen%2CCouchDB%2CPython%2Cgeo/feed/</wfw:commentRss>
</item>
<item>
<title>Drag as long as you want
</title>
<link>http://vmx.cx/cgi-bin/blog/index.cgi/drag-as-long-as-want%3A2009-11-11%3Aen%2COpenLayers%2CJavaScript%2Cgeo</link>
<comments>http://vmx.cx/cgi-bin/blog/index.cgi/drag-as-long-as-want%3A2009-11-11%3Aen%2COpenLayers%2CJavaScript%2Cgeo#comments</comments>
<pubDate>Wed, 11 Nov 2009 12:25:35 +0200</pubDate>
<dc:creator>Volker Mische</dc:creator>
<category>en</category>
<category>OpenLayers</category>
<category>JavaScript</category>
<category>geo</category>
<guid isPermaLink="false">http://vmx.cx/cgi-bin/blog/index.cgi/drag-as-long-as-want%3A2009-11-11%3Aen%2COpenLayers%2CJavaScript%2Cgeo/</guid>
<description><![CDATA[ 
 [...]]]></description>
<content:encoded><![CDATA[

<p>It has been a very long outstanding bug (officially it was a missing
feature) in <a href="http://www.openlayers.org/">OpenLayers</a> that annoyed
me from the first time I’ve been using OpenLayers. I’m talking about
<a href="http://trac.openlayers.org/ticket/39">ticket #39</a>: “Allow
pan-dragging while outside map until mouseup”.
</p>
<p>Normally when you drag the map in OpenLayers it will stop dragging as soon
as you hit the edge of the map viewport (the <code>div</code> that contains
the map). Whenever you have a small map, but a huge window and a loooong way to
drag, it can get quite annoying, as the maximum distance you can drag at once
is the size of that viewport.
</p>
<p>But yesterday
<a href="http://openlayers.org/pipermail/commits/2009-November/009095.html">it
finally happend</a>. A patch to fix it landed in trunk. A first rough cut was
made at the
<a href="http://openlayers.org/blog/2009/10/26/openlayers-at-the-foss4g-code-sprint/">OpenLayers
code sprint at the FOSS4G</a>.
<a href="http://wiki.osgeo.org/wiki/User:Ahocevar">Andreas Hocevar</a> reviewed
the code and made a more unobtrusive version of it (thanks, again).
</p>
<p>Try these two examples to see the difference. Click on the map an drag it a
long way to the right and back to the left again (you might need to zoom it a bit to see the full effect):
<ul>
  <li><a href="http://openlayers.org/dev/examples/lite.html">default
behaviour</a></li>
  <li><a href="http://openlayers.org/dev/examples/document-drag.html">documentDrag behaviour</a></li>
</ul>
<p>As it is a new feature, it isn’t enabled by default (and only available on
current SVN trunk, it will be available in OpenLayers 2.9). To enable it on
 your map, just use the following code to add the <code>documentDrag</code>
parameter to the
<a href="http://dev.openlayers.org/docs/files/OpenLayers/Control/DragPan-js.html">DragPan control</a> (you obviously need a recent SVN checkout).
<p><strong>Update</strong> (2009-11-18): It got even easier with
<a href="http://openlayers.org/pipermail/commits/2009-November/009109.html">r9805</a>:
</p>
<p>
  <pre>
<code>// Use default controls but with documentDrag enabled.
var controls = [
    new OpenLayers.Control.Navigation({documentDrag: true}),
    new OpenLayers.Control.PanZoom(),
    new OpenLayers.Control.ArgParser(),
    new OpenLayers.Control.Attribution()]
map = new OpenLayers.Map('map', {controls: controls});
</code></pre>
</p>
<p>For a full working version have a look at
<a href="http://svn.openlayers.org/trunk/openlayers/examples/document-drag.html">the
source of the documentDrag example</a>.
]]></content:encoded>
<wfw:commentRss>http://vmx.cx/cgi-bin/blog/index.cgi/drag-as-long-as-want%3A2009-11-11%3Aen%2COpenLayers%2CJavaScript%2Cgeo/feed/</wfw:commentRss>
</item>
<item>
<title>FOSS4G 2009: It was great
</title>
<link>http://vmx.cx/cgi-bin/blog/index.cgi/foss4g-2009-it-was-great%3A2009-10-25%3Aen%2Cgeo</link>
<comments>http://vmx.cx/cgi-bin/blog/index.cgi/foss4g-2009-it-was-great%3A2009-10-25%3Aen%2Cgeo#comments</comments>
<pubDate>Sun, 25 Oct 2009 04:23:09 +0200</pubDate>
<dc:creator>Volker Mische</dc:creator>
<category>en</category>
<category>geo</category>
<guid isPermaLink="false">http://vmx.cx/cgi-bin/blog/index.cgi/foss4g-2009-it-was-great%3A2009-10-25%3Aen%2Cgeo/</guid>
<description><![CDATA[ 
 [...]]]></description>
<content:encoded><![CDATA[

<p>The <a href="http://2009.foss4g.org/">FOSS4G 2009</a> (Free and Open Source
Software for Geospatial Conference) is over now, it was great. I've finally met
many people that I've previously only chatted or discussed on mailing lists
with.
</p>

<h3>Organisation and venue</h3>
<p>The <a href="http://www.scec.com.au/">Sydney Convention & Exhibition Centre
Darling Harbour</a> really is an amazing venue and
<a href="http://www.arinex.com.au/">Arinex</a> did a great job as well. We had
good food, the technicians were keeping everything up and running, even the
wireless internet didn't break down and performed well.
</p>
<p>The <a href="http://2009.foss4g.org/about_us/">Organising Committee</a> did
an excellent job (especially
<a href="http://fromtheinsidelookingin.blogspot.com/">Mark</a>), too. I exclude
myself a bit, I was more the code monkey before the conference, rather than
keeping that conference running smoothly. But because of that I had the chance
to visit quite a few presentations.</p>

<h3>Presentations</h3>
<p>Probably the most favoured presentation was
<a href="http://2009.foss4g.org/speakers/#Paul_Ramsey">Paul Ramsey's
Keynote speech</a>. It was just incredibly insightful and entertaining
(<a href="http://www.youtube.com/watch?v=zB_a28vBtBk">watch it at YouTube</a>).
it here.</p>
<p>There were to other excellent presentations as well. First the
<a href="http://2009.foss4g.org/presentations/#presentation_63">Mapping
interviews with open source technologies</a> by
<a href="http://twitter.com/fogonwater">Chris McDowall</a>. He is using a video
projector and a <a href="http://en.wikipedia.org/wiki/Wii_Remote">Wii remote
control</a> in order to map locations people are pointing at during an
interview (just watch <a href="http://www.youtube.com/watch?v=8ezThgEy8Ho">this
video</a> to get a better idea).
</p>
<p>And second the
<a href="http://2009.foss4g.org/presentations/#presentation_71">Visualising
animal movements in ‘near’ real time</a> by
<a href="http://www.ausvet.com.au/content.php?page=ben">Ben Madin</a>. It was
about a project where they try to track the movements if cows in Southeast
Asia. The idea is to place GSM transmitters in one of the cows' stomach to
track their position. But they are facing problem like "How to get a GSM signal
through 40cm of meat". Really interesting.
</p>
<h4>Geodata and CouchDB</h4>
<p>So how did
<a href="http://2009.foss4g.org/presentations/#presentation_78">my talk</a>
go? I'm very happy with it. I haven't expected so much positive feedback and
so many good conversations about
<a href="http://couchdb.apache.org">CouchDB</a> and
<a href="http://gitorious.org/geocouch/">GeoCouch</a> afterwards and during the
next days.
</p>

<h3>After show parties</h3>
<p>After the talks it's time to socialise while having a few beers. It was
again great, every single night.
</p>
<p>One outstanding event was the <a href="http://www.ignitespatial.com/">Ignite
Spatial</a> on Wednesday. 10 high paced talks with 20 slides displayed 15 secs
each. My favourite one was the
<a href="http://www.ignitespatial.com/?page_id=181">Pie charts are evil talk</a>
by Glen Bell. Another result of the night is that I'll always think about
<a href="http://otherfancystuff.blogspot.com/2009/10/should-i-defend-my-cred-yes.html">short green skirts</a> whenever someone is mentioning
<a href="http://wave.google.com">Google Wave</a>.

<h3>The code sprint</h3>
<p>I was code sprinting <a href="http://openlayers.org/">OpenLayers</a>. It was
well organised and we got some cool new stuff in. Sadly, I haven't reached my
goal of fixing <a href="http://trac.openlayers.org/ticket/39">Ticket 39</a>,
but hopefully soon (or next year in Barcelona). But I was discussing with
<a href="http://wiki.osgeo.org/wiki/User:Rdewit">Roald de Wit</a> and
<a href="http://wiki.osgeo.org/wiki/User:Ahocevar">Andreas Hocevar</a> the
implementation details of the abstraction of the UI in OpenLayers (that idea was
discussed in the
<a href="http://blog.xebia.com/2009/10/23/taking-openlayers-to-the-next-level/">Openlayers
BOF</a>).
</p>

<h3>Final words</h3>
<p>Yes, it really was great. I hope to see you all again in Barcelona at the
<a href="http://2010.foss4g.org">FOSS4G 2010</a>.
</p>
]]></content:encoded>
<wfw:commentRss>http://vmx.cx/cgi-bin/blog/index.cgi/foss4g-2009-it-was-great%3A2009-10-25%3Aen%2Cgeo/feed/</wfw:commentRss>
</item>
<item>
<title>Benchmarking is not easy
</title>
<link>http://vmx.cx/cgi-bin/blog/index.cgi/benchmarking-is-not-easy%3A2009-09-23%3Aen%2CCouchDB%2CPython%2CTileCache%2Cgeo</link>
<comments>http://vmx.cx/cgi-bin/blog/index.cgi/benchmarking-is-not-easy%3A2009-09-23%3Aen%2CCouchDB%2CPython%2CTileCache%2Cgeo#comments</comments>
<pubDate>Wed, 23 Sep 2009 17:39:06 +0200</pubDate>
<dc:creator>Volker Mische</dc:creator>
<category>en</category>
<category>CouchDB</category>
<category>Python</category>
<category>TileCache</category>
<category>geo</category>
<guid isPermaLink="false">http://vmx.cx/cgi-bin/blog/index.cgi/benchmarking-is-not-easy%3A2009-09-23%3Aen%2CCouchDB%2CPython%2CTileCache%2Cgeo/</guid>
<description><![CDATA[ 
 [...]]]></description>
<content:encoded><![CDATA[

<p>There are so many ways to have a play with
<a href="http://couchdb.apache.org">CouchDB</a>. This time I thought about using
CouchDB as a <a href="http://tilecache.org/">TileCache</a> storage. 
Sounds easy, so it was.
</p>

<h3>What is a tilecache</h3>
<p>Everyone knows <a href="http://maps.google.com/">Google Maps</a> and its
small images, called <em>tiles</em>. Rendering those tiles for the whole world
for every zoom level can be quite time consuming, therefore you can render
them on demand and cache them once they are rendered. This is the business of
a tilecache.
</p>
<p>You can use the tilecache as a proxy to a remote tile server as well, that's
what I did for this benchmark.</p>

<h3>Coding</h3>
<p><a href="/blog/2009-09-23/Couchdb.py">The implementation</a> looks quite
similar to the
<a href="http://svn.tilecache.org/trunk/tilecache/TileCache/Caches/Memcached.py">memcache
one</a>. I haven't implemented locking as I was just after something working,
not a full-fledged backend.
</p>
<p>When I finished coding, it was time to find out how it performs. That should
be easy, as there's a tilecache_seeding script bundled with TileCache to fill
the cache. So you fill the cache, then you switch the remote server off and
test how long it takes if all requests are hits without any fails (i.e. all
tiles are in your cache and don't need to be requested from a remote server).
</p>
<p>The two contestants for the benchmark are the CouchDB backend and the one
that stores the tiles directly on the filesystem.</p>

<h3>Everyone loves numbers</h3>
<p>We keep it simple and measure the time for seeding with
<a href="http://www.gnu.org/software/time/">time</a>. How long will it take to
request 780 tiles? The first number is the average (in seconds), the one in
brackets the standard deviation.
</p>
<ul>
  <li><p>Filesystem:</p>
<pre>
real 0.35 (0.04)
user 0.16 (0.02)
sys  0.05 (0.01)
</pre>
  </li>
  <li><p>CouchDB:</p>
<pre>
real 3.03 (0.18)
user 0.96 (0.05)
sys  0.21 (0.03)
</pre>
  </li>
</ul>
<p>Let's say CouchDB is 10 times slower that the file system based cache. Wow,
CouchDB really sucks! Why would you use it as tile storage? Although you could:
</p>
<ul>
  <li>easily store metadata with every tile, like a date when it should
expire.</li>
  <li>keep a history of tiles and show them as "travel through time layers"
in your mapping application</li>
  <li>easy replication to other servers</li>
</ul>
<p>You just don't want such a slow hog. And those
<a href="http://wiki.apache.org/couchdb/People_on_the_Couch">CouchDB
people</a> try to tell me that CouchDB would be fast. Pha!</p>

<h3>Really??</h3>
<p>You might already wonder, where the details are, the software version
numbers, the specification of the system and all that stuff? These things are
missing with a good reason. This benchmark just isn't right, even if I would
add these details. The problem lies some layers deeper.
</p>
<p>This benchmark is way to far away from a real-life usage. You would request
much more tiles and not the same 780 ones with every run. When I was
benchmarking the filesystem cache, all tiles were already in the system's
cache, therefore it was <em>that</em> fast.
</p>
<p>Simple solution: clear the system cache and run the tests again. Here are
the results after as <code>echo 3 > /proc/sys/vm/drop_caches</drop>
<ul>
  <li><p>Filesystem:</p>
<pre>
real 8.36 (0.71)
user 0.29 (0.04)
sys  0.18 (0.03)
</pre>
  </li>
  <li><p>CouchDB:</p>
<pre>
real 6.64 (0.15)
user 1.13 (0.07)
sys  0.29 (0.06)
</pre>
  </li>
</ul>
<p>Wow, the CouchDB cache is faster than the filesystem cache. Too nice to be
true. The reason is easy: loading the CouchDB database file, thus one file
access on the disk, is way faster that 780 accesses.
</p>

<h3>Does it really matter?</h3>
<p>Let's take the first benchmark, if CouchDB would be that much slower, but
isn't it perhaps <em>fast enough</em>? Even with those measures (ten times
slower than the filesystem cache) it would mean your cache can take 250
requests per second. Let's say a user requests 9 tiles per second it would be
about 25 users at the same time. With every user staying 2 minutes on the map
it would mean 18&#160;000 users per day. Not bad.
</p>
<p>Additionally you gain some nice things you won't have with other
caches (as outlined above). And if you really need more performance you could
always dump the tiles to the filesystem with a cron job.
</p>

<h3>Conclusion</h3>
<ol>
  <li>Benchmarking is not easy, but easy to get wrong.</li>
  <li>Slow might be fast enough.</li>
  <li>Read more about benchmarking on
<a href="http://jan.prima.de/plok/archives/176-Caveats-of-Evaluating-Databases.html">Jan's
blog</a>.</li>
</ol>
]]></content:encoded>
<wfw:commentRss>http://vmx.cx/cgi-bin/blog/index.cgi/benchmarking-is-not-easy%3A2009-09-23%3Aen%2CCouchDB%2CPython%2CTileCache%2Cgeo/feed/</wfw:commentRss>
</item>
<item>
<title>GeoCouch: New release (0.10.0)
</title>
<link>http://vmx.cx/cgi-bin/blog/index.cgi/geocouch-new-release-0.10.0%3A2009-09-19%3Aen%2CCouchDB%2CPython%2Cgeo</link>
<comments>http://vmx.cx/cgi-bin/blog/index.cgi/geocouch-new-release-0.10.0%3A2009-09-19%3Aen%2CCouchDB%2CPython%2Cgeo#comments</comments>
<pubDate>Sat, 19 Sep 2009 14:26:45 +0200</pubDate>
<dc:creator>Volker Mische</dc:creator>
<category>en</category>
<category>CouchDB</category>
<category>Python</category>
<category>geo</category>
<guid isPermaLink="false">http://vmx.cx/cgi-bin/blog/index.cgi/geocouch-new-release-0.10.0%3A2009-09-19%3Aen%2CCouchDB%2CPython%2Cgeo/</guid>
<description><![CDATA[ 
 [...]]]></description>
<content:encoded><![CDATA[

<p>It has been way to long since the initial release, but it’s finally there:
a new release of GeoCouch. For all first time visitors, GeoCouch is an
extension for <a href="http://couchdb.apache.org/">CouchDB</a> to support
geo-spatial queries like bounding box or polygon searches.
</p>
<p>I keep this blog entry relatively short and only outline the highlights and
requirements for the new release as GeoCouch finally has a real home at
<a href="http://gitorious.org/geocouch/">http://gitorious.org/geocouch/</a>.
Feel free to contribute to the wiki or fork the source.
</p>

<h3>Highlights</h3>
<ul>
  <li>Many geometries
<a href="http://gitorious.org/geocouch/pages/GeometryDefinition">are
supported</a>: points, lines, polygons (using Shapely).</li>
  <li>Queries are largely along the lines of the
<a href="http://www.opensearch.org/Specifications/OpenSearch/Extensions/Geo/1.0/Draft_1">OpenSearch-Geo
extension draft</a>. Currently
<a href="http://gitorious.org/geocouch/pages/Queries">supported</a> are
bounding box and polygon searches.</li>
  <li>Adding new backends (in addition to SpatiaLite) is easily possible.</li>
</ul>

<h3>Requirements</h3>
<ul>
  <li><a href="http://www.kernel.org/">Linux 2.6.26</a></li>
  <li><a href="http://couchdb.apache.org/">CouchDB 0.10.0</a></li>
  <li><a href="http://www.python.org/">Python 2.6.0</a></li>
  <li><a href="http://code.google.com/p/couchdb-python/">couchdb-python 0.6.x (0.6.0 doesn't work)</a></li>
  <li><a href="http://trac.gispython.org/lab/wiki/Shapely">Shapely 1.0.12</a></li>
  <li><a href="http://code.google.com/p/apsw/">APSW - Another Python SQLite Wrapper 3.5.9-r2</a></li>
  <li><a href="http://www.gaia-gis.it/spatialite/">SpatiaLite 2.3.1</a></li>
</ul>
<p>Other versions might work.</p>

<h3>Download</h3>
<p>If you don’t like Git, you can
<a href="/geocouch/downloads/geocouch-0.10.0.tar.bz2">download GeoCouch 0.10.0
here</a>.
</p>
]]></content:encoded>
<wfw:commentRss>http://vmx.cx/cgi-bin/blog/index.cgi/geocouch-new-release-0.10.0%3A2009-09-19%3Aen%2CCouchDB%2CPython%2Cgeo/feed/</wfw:commentRss>
</item>
<item>
<title>FOSS4G 2009: I'm speaking
</title>
<link>http://vmx.cx/cgi-bin/blog/index.cgi/foss4g-2009-im-speaking%3A2009-07-21%3Aen%2CCouchDB%2Cgeo</link>
<comments>http://vmx.cx/cgi-bin/blog/index.cgi/foss4g-2009-im-speaking%3A2009-07-21%3Aen%2CCouchDB%2Cgeo#comments</comments>
<pubDate>Tue, 21 Jul 2009 19:05:34 +0200</pubDate>
<dc:creator>Volker Mische</dc:creator>
<category>en</category>
<category>CouchDB</category>
<category>geo</category>
<guid isPermaLink="false">http://vmx.cx/cgi-bin/blog/index.cgi/foss4g-2009-im-speaking%3A2009-07-21%3Aen%2CCouchDB%2Cgeo/</guid>
<description><![CDATA[ 
 [...]]]></description>
<content:encoded><![CDATA[

<div class="figure">
  <a href="http://2009.foss4g.org/presentations/#presentation_78">
    <img src="/blog/2009-07-21/logo_145x90_speaking.png" alt="FOSS4G 2009 - I'm speaking!" width="145" height="90" />
  </a>
</div>

<p>I did it! I'll speak on the <a href="http://2009.foss4g.org/">FOSS4G
Conference 2009</a> (Free and Open Source Software for Geospatial Conference),
20th–23rd October in Sydney about “CouchDB and Geodata”. More information
is available at the
<a href="http://2009.foss4g.org/presentations/#presentation_78">official
website</a>.
</p>
]]></content:encoded>
<wfw:commentRss>http://vmx.cx/cgi-bin/blog/index.cgi/foss4g-2009-im-speaking%3A2009-07-21%3Aen%2CCouchDB%2Cgeo/feed/</wfw:commentRss>
</item>
<item>
<title>Poor man’s bounding box queries with CouchDB
</title>
<link>http://vmx.cx/cgi-bin/blog/index.cgi/poor-mans-bounding-box-queries-with-couchdb%3A2009-07-19%3Aen%2CCouchDB%2CJavaScript%2Cgeo</link>
<comments>http://vmx.cx/cgi-bin/blog/index.cgi/poor-mans-bounding-box-queries-with-couchdb%3A2009-07-19%3Aen%2CCouchDB%2CJavaScript%2Cgeo#comments</comments>
<pubDate>Sun, 19 Jul 2009 23:55:29 +0200</pubDate>
<dc:creator>Volker Mische</dc:creator>
<category>en</category>
<category>CouchDB</category>
<category>JavaScript</category>
<category>geo</category>
<guid isPermaLink="false">http://vmx.cx/cgi-bin/blog/index.cgi/poor-mans-bounding-box-queries-with-couchdb%3A2009-07-19%3Aen%2CCouchDB%2CJavaScript%2Cgeo/</guid>
<description><![CDATA[ 
 [...]]]></description>
<content:encoded><![CDATA[

<p>
<a href="http://mail-archives.apache.org/mod_mbox/couchdb-user/200809.mbox/<gbg36q$n8g$1@ger.gmane.org>">Several</a>
<a href="http://mail-archives.apache.org/mod_mbox/couchdb-user/200903.mbox/<20090304111938.GC16406@banot.net>">people</a>
<a href="http://mail-archives.apache.org/mod_mbox/couchdb-user/200906.mbox/<2C1A5D65-F929-42B8-93CE-A9BB68C8D1DA@mac.com>">store</a>
geographical points within <a href="http://couchdb.apache.org/">CouchDB</a> and would like to make a
<a href="http://en.wikipedia.org/wiki/Minimum_bounding_rectangle">bounding box
query</a> on them. This isn’t possible with plain CouchDB
<a href="http://wiki.apache.org/couchdb/HTTP_view_API">_views</a>. But there’s
light at the end of the tunnel. One solution will be
<a href="geocouch-geospatial-queries-with-couchdb%3A2008-10-26%3Aen%2CCouchDB%2CPython%2Cgeo">GeoCouch</a>
(which can do a lot more than simple bounding box queries), once there’s a new
release, the other one is already there: you can use a the
<a href="http://wiki.apache.org/couchdb/Formatting_with_Show_and_List">list/show
API</a> (<strong>Warning</strong>: the current wiki page (as at 2009-07-19) applies to CouchDB 0.9, I use the new 0.10 API).
</p>
<p>You can either add a _list function as described in the
<a href="http://wiki.apache.org/couchdb/Formatting_with_Show_and_List">documentation</a> or use my
<a href="http://vmx.cx/cgi-bin/blog/index.cgi/list-function-editing-in-futon%3A2009-07-19%3Aen%2CCouchDB%2CJavaScript">futon-list
branch</a> which includes an interface for easier _list function creation/editing</a>.
</p>

<h3>Your data</h3>

<p>The _list function needs to match your data, thus I expect documents with
a field named <code>location</code> which contains an array with the
coordinates. Here’s a simple example document:
</p>
<p>
  <pre>
<code>
{
   "_id": "00001aef7b72e90b991975ef2a7e1fa7",
   "_rev": "1-4063357886",
   "name": "Augsburg",
   "location": [
       10.898333,
       48.371667
   ],
   "some extra data": "Zirbelnuss"
}
</code></pre>
</p>


<h3>The _list function</h3>

<p>We aim at creating a _list function that returns the same response as a
normal _view would return, but filtered with a bounding box. Let’s start
with a _list function which returns the same results as plain _view (no
bounding box filtering, yet). The whitespaces of the output differ slightly.
</p>
<p>
  <pre>
<code>function(head, req) {
    var row, sep = '\n';

    // Send the same Content-Type as CouchDB would
    if (req.headers.Accept.indexOf('application/json')!=-1)
      start({"headers":{"Content-Type" : "application/json"}});
    else
      start({"headers":{"Content-Type" : "text/plain"}});

    send('{"total_rows":' + head.total_rows +
         ',"offset":'+head.offset+',"rows":[');
    while (row = getRow()) {
        send(sep + toJSON(row));
        sep = ',\n';
    }
    return "\n]}";
};
</code></pre>
</p>

<p>The _list API allows to you add any arbitrary query string to the URL. In
our case that will be <code>bbox=west,south,east,north</code> (adapted from the
<a href="http://www.opensearch.org/Specifications/OpenSearch/Extensions/Geo/1.0/Draft_1">OpenSearch
Geo Extension</a>). Parsing the bounding box is really easy. The query
parameters of the request are stored in the property <code>req.query</code> as
key/value pairs. Get the bounding box, split it into separate values and
compare it with the values of every row.
</p>
<p>
  <pre>
<code>var row, location, bbox = req.query.bbox.split(',');
while (row = getRow()) {
    location = row.value.location;
    if (location[0]&gt;bbox[0] && location[0]&lt;bbox[2] &&
            location[1]&gt;bbox[1] && location[1]&lt;bbox[2]) {
        send(sep + toJSON(row));
        sep = ',\n';
    }
}</code></pre>
</p>
<p>And finally we make sure that no error message is thrown when the
<code>bbox</code> query parameter is omitted. Here’s the final result:
</p>
<p>
  <pre>
<code>function(head, req) {
    var row, bbox, location, sep = '\n';

    // Send the same Content-Type as CouchDB would
    if (req.headers.Accept.indexOf('application/json')!=-1)
      start({"headers":{"Content-Type" : "application/json"}});
    else
      start({"headers":{"Content-Type" : "text/plain"}});

    if (req.query.bbox)
        bbox = req.query.bbox.split(',');

    send('{"total_rows":' + head.total_rows +
         ',"offset":'+head.offset+',"rows":[');
    while (row = getRow()) {
        location = row.value.location;
        if (!bbox || (location[0]&gt;bbox[0] && location[0]&lt;bbox[2] &&
                      location[1]&gt;bbox[1] && location[1]&lt;bbox[2])) {
            send(sep + toJSON(row));
            sep = ',\n';
        }
    }
    return "\n]}";
};</code></pre>
</p>
<p>An example how to access your _list function would be:
<code>http://localhost:5984/geodata/_design/designdoc/_list/bbox/viewname?bbox=10,0,120,90&limit=10000</code>
</p>
<p>Now you should be able to filter any of your point clouds with a bounding
box. The performance should be alright for a reasonable number of points. A
usual use-case would something like displaying a few points on a map, where you
don’t want to see zillions of them anyway.
</p>
<p>Stay tuned for a follow-up posting about displaying points with
<a href="http://openlayers.org/">OpenLayers</a>.
</p>
]]></content:encoded>
<wfw:commentRss>http://vmx.cx/cgi-bin/blog/index.cgi/poor-mans-bounding-box-queries-with-couchdb%3A2009-07-19%3Aen%2CCouchDB%2CJavaScript%2Cgeo/feed/</wfw:commentRss>
</item>
<item>
<title>GeoCouch: Geospatial queries with CouchDB
</title>
<link>http://vmx.cx/cgi-bin/blog/index.cgi/geocouch-geospatial-queries-with-couchdb%3A2008-10-26%3Aen%2CCouchDB%2CPython%2Cgeo</link>
<comments>http://vmx.cx/cgi-bin/blog/index.cgi/geocouch-geospatial-queries-with-couchdb%3A2008-10-26%3Aen%2CCouchDB%2CPython%2Cgeo#comments</comments>
<pubDate>Sun, 26 Oct 2008 20:59:14 +0200</pubDate>
<dc:creator>Volker Mische</dc:creator>
<category>en</category>
<category>CouchDB</category>
<category>Python</category>
<category>geo</category>
<guid isPermaLink="false">http://vmx.cx/cgi-bin/blog/index.cgi/geocouch-geospatial-queries-with-couchdb%3A2008-10-26%3Aen%2CCouchDB%2CPython%2Cgeo/</guid>
<description><![CDATA[ 
 [...]]]></description>
<content:encoded><![CDATA[

<p><strong>Update</strong> (2009-09-19): There's a new GeoCouch release. More information at <a href="/cgi-bin/blog/index.cgi/geocouch-new-release-0.10.0:2009-09-19:en,CouchDB,Python,geo">GeoCouch: New release 0.10.0</a>.</p>

<p>After almost six months of silence I finally managed to get a prototype done
(thanks <a href="http://jan.prima.de/~jan/">Jan</a> for keeping me motivated).
</p>

<h3>What do you get?</h3>
<p>You get some code to play around with, to get a slight idea of how such a
geospatial extension for <a href="http://couchdb.org/">CouchDB</a> could look
like. The code base isn’t polished yet, but it’s good enough to get it out of
the door. The current version only supports one geometry type
(<code>POINT</code>), and one operation (a bounding box search).
</p>
<p>As CouchDB doesn’t allow an intersection of results gathered from an
external service, the result of the bounding box search will be plain text
document IDs and their coordinates.
</p>

<h3>How does it work?</h3>
<p>GeoCouch consists of two parts, the indexer and the query processor.
Both are connected through stdin/out with CouchDB.</p>

<h4>Indexer (geostore)</h4>
<p>In order to make the indexer understand which fields in the document contain
geometries, a special design document is needed. As soon as a database has such
a document, the database is <em>geo-enabled</em> and the indexer will store the
geometries in a spatial index, which is a
<a href="http://www.gaia-gis.it/spatialite/">SpatiaLite</a> database at the
moment</a>.
</p>
<p>Everytime a database in CouchDB is altered (create, delete, update) the
indexer gets notified and will act accordingly to keep the spatial index
up to date with CouchDB.
</p>

<h4>Query processor (geoquery)</h4>
<p>To process queries with an external service is possible with
<a href="http://www.davispj.com/">Paul Joseph Davis’</a> excellent
<a href="http://github.com/davisp/couchdb/tree/external2">
external2 CouchDB branch</a>. Queries to CouchDB can get passed along to an
external service.
</p>
<p>At the moment the result is the output of this service, it’s plain text in
our case. In the future the external service will only return document IDs
which will be passed back to the view. The result will be an intersection of
document IDs of the view and the document IDs the external service returned.
</p>

<h3>How do I use it?</h3>
<p>When everything is installed correctly it’s quite easy to get started.</p>

<h4>Setting things up</h4>
<ul>
  <li>Create a new database named <code>geodata</code> (could be anything).</li>
  <li>Add a document named <code>myhome</code>, there you’ll store all the information
of your home including the coordinates. As we are only interested in a bounding
box search it’s enough to have a location:
      <pre>
<code>{
  "_id": "myhome",
  "_rev": "3358484250",
  "location": [ 151.208333, -33.869444 ]
}</code></pre>
  </li>
  <li>Add as many other documents like this, make sure all of them have a field
called <code>location</code> with the coordinates as array. As for the database,
the name of the field could be anything, but has to be the same in all
documents.
  </li>
  <li>Now we come to the interesting part, the special design view that
<em>geo-enables</em> the database. The document has to be named
“<code>_design/_geocouch</code>”. After creating it also needs some special fields and
will look like this:
    <p>
      <pre>
<code>{
  "_id": "_design/_geocouch",
  "_rev": "610069068",
  "srid": 4326,
  "loc": {
    "type": "POINT",
    "x": "location[0]",
    "y": "location[1]"
  }
}</code></pre>
    </p>
    <p>The coordinate system that should be used is specified by an
<a href="http://en.wikipedia.org/wiki/SRID">SRID</a>. If you don’t know which
value to use for <code>srid</code>, use <code>4326</code>. It’s assumed that
all geometries in your document belong to the same coordinate system.
    </p>
    <p>The other field is the information where to find the geometry in the
documents. The name you choose will be used for the bounding box queries,
I’ve chosen <code>loc</code>. It defines the type (<code>POINT</code>), and
where to find the x/y coordinate (this will probably be changed to lat/lon in
the future).
    </p>
    <p>The way to specify where to find the field is comparable to XPath, but
much simpler. As JSON consists of nested dictionaries and arrays, you can get a
property within an array with the index (e.g. <code>location[0]</code> is the
first element in an Array called <code>location</code>). If it is a dictionary
you specify it separated by a dot (e.g. <code>location.x</code> is a property
named <code>x</code> within another one called <code>location</code>). It can
of course be nested much deeper, the path always starts at the root of the
document (e.g. <code>bike.stolen.found[0]</code>).
    </p>
  </li>
</ul>

<h4>Bounding box search</h4>
<p>And finally you can make a bounding box search. Simply browse a URL like
this one (this is a bounding box that encloses the whole world):
</p>
<p>
  <pre>
<code>http://localhost:5984/geodata/_external/geo?q={"geom":"loc","bbox":[-180,-90,180,90]}
</code></pre>
</p>
<p>The expected result is:</p>
<p>
  <pre>
<code>myhome 151.208333 -33.869444</code></pre>
</p>

<h3>Requirements</h3>
<p>You’d like to give it a try? Here is a list of the software and their versions
I used to get it work on my system, but others might work as well. GeoCouch
includes installation/configuration instructions.</p>
<ul>
  <li><a href="http://www.kernel.org/">Linux 2.6.26</a></li>
  <li><a href="http://www.python.org/">Python 2.5.2</a></li>
  <li><a href=http://code.google.com/p/apsw/">APSW - Another Python SQLite Wrapper 3.5.9-r2</a></li>
  <li><a href="http://www.gaia-gis.it/spatialite/">SpatiaLite 2.2</a></li>
  <li><a href="http://github.com/davisp/couchdb/tree/external2">
davisp’s external2 branch of CouchDB</a>
  </li>
</ul>

<h3>Download GeoCouch</h3>
<p>Get SpacialCouch now! It’s new, it’s free
(<a href="http://www.opensource.org/licenses/mit-license.php">MIT</a>
licensed).</p>
<ul>
  <li><a href="/blog/2008-10-26/geocouch-0.0.1.tar.bz2">
GeoCouch 0.0.1</a></li>
</ul>

<h3>What’s next?</h3>
<p>The current version is meant to play with, many things are not possible,
many things needs to be improved. But with the power of SpatiaLite (and the
underlying libraries) it shouldn’t be too hard.
</p>
<p>Therefore I hope this will only be start and will end up in a discussion
on what should be done, what other things might be possible. I’d love to
hear your use cases for a geospatially enabled CouchDB.</p>

]]></content:encoded>
<wfw:commentRss>http://vmx.cx/cgi-bin/blog/index.cgi/geocouch-geospatial-queries-with-couchdb%3A2008-10-26%3Aen%2CCouchDB%2CPython%2Cgeo/feed/</wfw:commentRss>
</item>
<item>
<title>CouchDB and geodata?
</title>
<link>http://vmx.cx/cgi-bin/blog/index.cgi/couchdb-and-geodata%3A2008-05-03%3Aen%2Cgeo%2CCouchDB</link>
<comments>http://vmx.cx/cgi-bin/blog/index.cgi/couchdb-and-geodata%3A2008-05-03%3Aen%2Cgeo%2CCouchDB#comments</comments>
<pubDate>Sat, 03 May 2008 12:18:50 +0200</pubDate>
<dc:creator>Volker Mische</dc:creator>
<category>en</category>
<category>geo</category>
<category>CouchDB</category>
<guid isPermaLink="false">http://vmx.cx/cgi-bin/blog/index.cgi/couchdb-and-geodata%3A2008-05-03%3Aen%2Cgeo%2CCouchDB/</guid>
<description><![CDATA[ 
 [...]]]></description>
<content:encoded><![CDATA[

<p>Let me introduce the two protagonists. If you know them already, just
<a href="#serious">skip this part</a>.</p>
<dl>
  <dt>CouchDB</dt>
  <dd>
    <p>From the <a href="http://incubator.apache.org/couchdb/">official
website</a>:
    </p>
    <blockquote>
      <p>Apache CouchDB is a distributed, fault-tolerant and schema-free
document-oriented database accessible via a RESTful HTTP/JSON API.
      </p>
    </blockquote>
    <p>The word <em>database</em> is often connected to
<a href="http://en.wikipedia.org/wiki/RDBMS">RDBMS</a>, but CouchDB is way
different. You don’t store your data in predefined tables and fields with
certain data types like <code>INTEGER</code> or <code>VARCHAR</code>, but every
database record is stored on it’s own (in so-called <em>documents</em>).
    </p>
    <p>In RDBMS you build relations between several tables to store and receive
the data; in a document-oriented DB (DODB) one record is stored after
another (these records can, of course, be splitted into several documents that
might even reference each other through their ID). The structure of these
documents doesn’t matter for their storage. The big advantage is that if a new
property is needed, just add it to the document. There’s no need to change any
global context (like schema definitions of tables in RDBMS).
    </p>
  </dd>
  <dt>Geodata</dt>
  <dd>
    <p>I haven’t found a good definition for geodata, so here’s my own:</p>
    <blockquote>
      <p>Geodata is data with a spatial reference.</p>
    </blockquote>
    <p>This data is not restricted to the spatial reference only. Far more
important is the actual (meta)data that is connected to this spatial reference.
This data describes what it is all about. It could be a house with information
about its number, age, size or a measuring station that monitors the
temperature.
    </p>
  </dd>
</dl>

<h3 id="serious">Are you serious?</h3>

<p>Why should someone want to put his geodata into a big mess of thousands of
documents instead of a nicely structured RDBMS? You don’t have to be a computer
scientist to know that retrieving data out of a RDBMS is damn fast and a DODB
approach sounds like a slow, “I grep through a long list of files”.
</p>
<p>This might partly be true, but high performance shouldn’t be a use case for
DODBs. Their flexibility and ease of usage is what they make them perform great.
You have the choice between being fast or being flexible.
</p>

<h3 id="usecase">The use case</h3>

<p>Flexibility over performance for geodata services has a use case when it
comes to interoperability between different data sources.
</p>
<p>Imagine you are the governor of a big country that consists of several
smaller territories. Each of these have a smart guy that developed (independent
of all the others) a system to collect data about how many bicycles topple over
per day. It’s a geo-spational system, as the exact location where it happend is
stored in the database.
</p>
<p>All territories use a RDBMS, but from different manufacturers. In addition
they store the information about the bikes differently. One territory
distinguishes between bicycle for children, youth and adults; another one
stores the size of the felly instead. Those information could be mapped very
easily to a uniform one, but the territories don’t want to give up the
infrastructures of their current systems. They still want to collect their data
in their way.
</p>
<p>
What you really want is a solution to be able exchange the data easily between
the territories and have uniform way to access the data country wide.
</p>

<h4 id="solution1">Solution I</h4>

<p>To exchange their data they set a new layer of transformation above the
current DB. The output will be a new format they both agreed on. This sounds
like a good solution for the problem, but there are a few downsides:
</p>
<ul>
  <li>The transformation could be very difficult to express with SQL. This
could lead to huge slow downs. This isn’t such a big problem if you just
exchange the data, but a big advantage, the speed of RDBMS, gets lost.
  </li>
  <li>The transformation layer needs to support for DBs of different
manufacturers.
  </li>
  <li>Queries across territory borders seem difficult. Will all servers serve
all data? Will you need to query multiple servers to get the data of two
territories?
  </li>
  <li>Heterogeneous environments lead to higher maintenance costs than
homogeneous ones.</li>
</ul>


<h4 id="solution2">Solution II</h4>

<p>All territories store their data in a new shiny type of DB, a DODB. If they
collect the data, it’s currently transformed somehow to fit into a RDBMS. They
could either change this and store it directly into the new DB (long term goal)
or transform their current data to make it fit.
</p>
<p>So what’s the difference between transforming the data from the RDBMS to
another RDBMS or to a DODB?
</p>
<ul>
  <li>Transforming to a DODB is more like a dump of the data, thus easy.</li>
  <li>Probably you can’t convert to another existing DB schema, as this will
lead to a lost of information. So a new DB schema needs to be created/an
existing one altered (every time something new occurs).</li>
</ul>
<p>Characteristics:</p>
<ul>
  <li>All data can be stored in one big database, queries across territories
are easy (simple “if’s”)</li>
  <li>A single database can be replicated easily.</li>
  <li>Queries are slow compared to plain SQL queries on RDBMS, probably not
suitable for real-time applications</li>
</ul>


<h4 id="solution3">Solution III</h4>

<p>Follow the approach of <a href="#solution2">Solution II</a> but using one
gigantic RDBMS that stores the DB schemas of all territories. That would work,
too. The difference it that RDBMS wasn’t meant for such things.
</p>


<h4 id="forecast">Forecast</h4>

<p>I think <a href="#solution2">Solution II</a> shows that CouchDB has a big
potential in that area. At the moment it's more an idea than a solution, there
a still a view contradictions, but these will hopefully be solved.
</p>
<p>One crux are speedy retrievals of features within a certain bounding box,
this issue will be the spotlight of a future post.
</p>
]]></content:encoded>
<wfw:commentRss>http://vmx.cx/cgi-bin/blog/index.cgi/couchdb-and-geodata%3A2008-05-03%3Aen%2Cgeo%2CCouchDB/feed/</wfw:commentRss>
</item>
</channel>
</rss>
