Skip to Content

Le NoSQL dans le domaine géospatial : CouchDB et GeoCouch (Couchbase), shp2geocouh, importation de shapefiles et serveur cartographique


python

Après avoir examiné MongoDB (« Le NoSQL dans le domaine géospatial : MongoDB avec JavaScript ou Python, ArcGIS et Quantum Gis »), nous allons nous intéresser à CouchDB. OpenSource, et projet officiel de la Fondation Apache. Elle est aussi très intéressante pour les sigistes car elle possède une extension spatiale, GeoCouch. Elle permet de traiter toutes les géométries de l'OGC (grâce au module Python Shapely) et les projections (pour rappel MongoDB ne sait que traiter les points xy, sans projection).

La procédure pour installer GeoCouch n'est pas simple, aussi je vous conseille d'utiliser l'implémentation de la société CouchBase, née de la fusion de deux entités NoSQL (CouchDB et Membase). Deux versions sont disponibles, l'une avec un support commercial (Entreprise Edition) et l'autre, libre (Community Edition). J'utilise Couchbase Simple Server qui intègre CouchDB et GeoCouch (www.couchbase.com/downloads).

Présentation

Tout comme MongoDB, CouchDB est une base de données orientée documents. (voir Le NoSQL dans le domaine géospatial, approche préliminaire en Python avec SimpleGeo). Écrite en Erlang, elle est disponible sur toutes les plateformes, mais aussi les smartphones, Ipad et compagnie. Elle permet de manipuler des objets structurés en JSON, sans schéma, ni table. Elle est accessible via une API REST HTTP/JSON. Elle se veut simple d'utilisation puisque son slogan, au démarrage, est :

« Apache CouchDB has started – Time to relax »

(Très) Rapide introduction aux principes

Ce sont pratiquement les mêmes que ceux de MongoDB (lien), avec des documents (représentés lors des échanges par un objet JSON) et des collections. Chaque document est identifié par un identifiant unique créé automatiquement par CouchDB lors de son insertion.

Les principales caractéristiques sont :

  • l'accès aux données :
    • CouchDB utilise une API HTTP/REST pour communiquer avec une base de données. Tout langage qui permet l'utilisation de REST peut être utilisé.
  • les requêtes :
    • CouchDB (comme MongoDB) exploite des fonctions map (subdiviser) et reduce (agréger) dans un style connu sous le nom de MapReduce. La combinaison de ces fonctions offre une grande souplesse, car elles peuvent s’adapter aux variations de la structure d’un document. En pratique ce sont des fonctions plus ou moins simples en JavaScript qui vont être exploitées dans les vues.
  • les vues (view) etc. :
    • CouchDB permet la création de documents spéciaux contenant ces fonctions en JavaScript (ou autre langage suivant les versions). Ce sont les design documents. CouchDB va exécuter ces fonctions sur chacun des documents pour générer une vue (view) pour afficher les données, les filtrer, les classer ou effectuer des requêtes, par exemple. Ces vues sont construites dynamiquement et ne modifient pas le document original. Il est possible d'avoir de multiples vues pour chaque document. Les vues sont stockées dans ces documents design.
  • gestion des pièces jointes (attachment)
    • CouchDB permet très facilement d'attacher des fichiers externes (images, pdf, etc, sous forme binaire) dans un document. Cela signifie que CouchDB peut servir de l'HTML, du JavaScript, des images et n'importe quel document (comme des shapefiles).
  • création d'applications complètes :
    • l'utilisation de ces fonctions JavaScript et les attachments permettent de construire des applications complètes fonctionnant directement dans CouchDB. Nous en verrons un exemple avec shp2geocouch. Le processus utilise un document design qui contient le code de l'applications en JavaScript (guide.couchdb.org/editions/1/en/standalone.html).
  • réplications :
    • CouchDB permet très facilement la réplication des données. La réplication consiste à synchroniser n copies d'une même base de données sur n serveurs différents situés sur des ordinateurs ou des smartphones. Si une modification est apportée aux données sur une instance, la réplication transmettra ce changement à ses homologues, en gérant les conflits. Il est donc très facile de partager une base et/ou de la distribuer.

Tout ça peut paraitre complexe au premier regard, mais un peu de pratique éclaire le tout. La lecture de www.unixgarden.com/index.php/web/couchdb-la-base-de-donnees-qui-change-tout est aussi conseillée.

Accès aux bases

Interface graphique : Futon

CouchDB (et donc Couchbase) fournit une interface graphique nommée Futon (en JavaScript). Elle est accessible via l'URL :

http://localhost:5984/_utils 

C'est la méthode la plus simple pour gérer ses différentes bases de données, création de bases, de documents, de vues, insertion des données, insertion des requêtes, réplication d'une base, etc.

En lignes de commandes

Il n'y a pas de Shell CouchDB natif, comme MongoDB, et vous devez interagir avec le serveur avec n'importe quel langage permettant d'effectuer des requêtes HTTP. Il y a des solutions pour tous les langages (wiki.apache.org/couchdb/Related_Projects).

Internet

Il est possible d'utiliser Ruby on Rails ou Django (lethain.com/an-introduction-to-using-couchdb-with-django/, par exemple).

Démarrage

Avec Couchbase Simple Server, il suffit de lancer l'application. Avec CouchDB, il faut le faire depuis le Shell ou l'invite de commandes.

Entrée des données

Le livre en ligne  « CouchDB Le guide authentique » ( guide.couchdb.org/editions/1/fr/tour.html) constitue une très bonne introduction.

avec Futon

Tout est très intuitif, il suffit de cliquer :

en ligne de commande

La commande basique permettant d'interagir avec l'API REST de CouchDB est la commande Bash curl (standard sur Linux ou Mac OS X) :

connexion et création d'une base de données (mabase)

L'entrée des données se fait au format JSON, suivant la syntaxe de curl (post, put, get, etc.)

Ici, je rentre un élément dans mabase (PUT) et je récupère l'entrée (GET). L'identifiant unique rev a bien été créé par CouchDB

avec les autres langages

Je vous invite à consulter les tutoriels des autres langages disponibles à wiki.apache.org/couchdb/Related_Projects. Comme vous savez que j'aime bien Python, je ne résiste pas (avec le module Couchdbkit qui est un ORM, voir « Python : les bases de données géospatiales - 2) mapping objet-relationnel (ORM, SQLAlchemy, SQLObject, GeoAlchemy, Django-GeoDjango, TurboGears ou MapFish) ») :

avec couchdbkit

  1. from couchdbkit import *
  2.  
  3. # connexion au serveur
  4. server = Server()
  5. # création ou connexion à une base
  6. base = server.get_or_create_db("Articles")
  7.  
  8. # ORM
  9. class Articles(Document):
  10. auteur=StringProperty()
  11. titre=StringProperty()
  12.  
  13. # lien entre Articles et base
  14. Articles.set_db(base)
  15.  
  16. # entrée d'un élément
  17. article = Articles(
  18. auteur="Martin Laloux",
  19. titre="CouchDB et GeoCouch")
  20. article.save()
  21.  
  22. # update éventuel
  23. article.titre = u"CouchDB et GeoCouch, Couchbase"
  24. article.save()

Requêtes

Comme souligné, les requêtes se font en créant des vues (view) en JavaScript. C'est un peu difficile à comprendre au premier abord, mais l'explication est donnée en utilisant Futon :

En choisissant View:Temporary view, apparait un cadre où figure la fonction par défaut pour afficher les valeurs des éléments. Les requêtes vont être faites de cette manière. En créant de nouvelles vues il est possible de créer les requêtes désirées.

Les traiter dépasse le cadre du sujet. C'est très bien expliqué dans guide.couchdb.org/editions/1/fr/views.html  de même que la fonction d’agrégat (reduce). Il y a même un livre consacré à ce sujet « Writing and Querying MapReduce Views in CouchDB » (oreilly.com/catalog/0636920018247). Tout ce que l'on peut retenir est que tout se fait en JavaScript (et autres langages suivant les versions).

Il est facile de trouver sur le Net des sites qui comparent les requêtes SQL classiques avec les fonctions en JavaScript comme guide.couchdb.org/draft/cookbook.html, blog.mattwoodward.com/string-matching-in-couchdb-views,

avec les autres langages

Ici encore, je vous invite à consulter les tutoriels des autres langages (wiki.apache.org/couchdb/Related_Projects). J'utilise Couchdbkit sans aucun problème. Il y a beaucoup plus que ce qu'indique la référence officielle (voir rien que pour Python pypi.python.org/pypi).

applications complètes

CouchApp  est un module Python qui permet de créer des applications complètes en JavaScript et HTML5  fonctionnant directement à partir de CouchDB.

CouchApp utilise le document Design (guide.couchdb.org/editions/1/fr/design.html) qui contient les codes des applications en JavaScript.

élement design dans une base

Il est aussi possible d'installer une application complète.

GeoCouch

GeoCouch est l'extension spatiale de CouchDB. Elle est intégrée dans Couchbase Simple Server (sans devoir l'installer).

Insertion d'éléments

Le principe est le suivant

  1. ajout de la fonction spatiale (document avec une fonction JavaScript : spatial)
  2. insertion des objets dans une base sous forme de tableaux x,y

Création de la Base et ajout de la fonction spatiale avec curl dans un document design :

insertion d'un lieu :

fonction spatiale dans Futon

Requêtes spatiales et géométries de l'OGC

Comme MongoDB, les requêtes spatiales sont obtenues à partir de :

  • bbox de recherche
  • polygone de recherche
  • rayon de recherche

exemple de requêtes brutes avec bbox (voir gitorious.org/geocouch/pages/Queries) :

curl -X GET 'http://localhost:5984/places/_design/main/_spatial/points?bbox=0,0,180,90'

GeoCouch utilise aussi des fonctions en JavaScript pour traiter les données, mais elles sont insérées dans des documents appelés  lists (en non pas view mais en pratique, c'est la même chose).

C'est ce qui est fait dans l'exemple suivant pour afficher les points  au format WKT :

La fonction wkt vue dans lists avec Futon :

L'intérêt de ces fonctions est qu'elles permettent de doter GeoCouch de la possibilité d'utiliser  toutes les géométries de l'OGC ainsi que les projections (gitorious.org/geocouch/pages/GeometryDefinition)

exemple de geo property permettant d'encoder des polygones avec un srs EPSG 31370

Les changements de projection ne sont pas encore implémentés, mais il serait possible de l'imaginer en utilisant la librairie JavaScript Proj4js (www.portailsig.org/content/proj4js-la-conversion-de-coordonnees-xy-points-pour-les-nuls-proj4-en-javascript-et-le-site-).

Shapefiles etc.

Comme GeoCouch supporte les géométries de l'OGC, il est possible d'importer tous les shapefiles comme des objets spatiaux (ce qui n'était pas le cas avec MongoDB). Il y deux solutions :

GDAL/OGR

La version 1.9 dispose d'un pilote pour se connecter à CouchDB (gdal.gloobe.org/ogr/formats/couchdb.html). Il est alors possible d'importer un shapefile dans CouchDB ou d'échanger les données avec PostGIS, par exemple.

ogr2ogr -f couchdb "couchdb:http://127.0.0.1:5984" shapefile.shp

application complète : shp2geocouch

Il s'agit d'un exécutable RubyGem (www.rubyfrance.org/documentations/rubygem---introduction/) qui permet de créer des bases de données complètes à partir de shapefiles. Il  crée aussi une application complète au sein de CouchDB qui permet de servir les données sur un fond OpenStreetMap.

Sur Linux ou Mac OS X, Ruby et RubyGem sont installés d'office, l'installation se fait par :

sudo gem update --system (mise à jour de gem)
sudo gem install shp2geocouch

Ensuite, en ligne de commande :

crée la base et insère les données du shapefile. L'application créée dans GeoCouch permet ensuite de les visualiser, quelle que soit la géométrie des shapefiles (points, lignes et polygones) :


L'URL utilisée indique bien un design. Un examen de ce design avec Futon, montre toutes les fonctions JavaScript basées sur les librairies Polymaps, Jquery, etc., placées par shp2geocouch pour créer l'application. Il n'y a donc pas besoin de serveur cartographique indépendant, tout est fait par CouchDB.

Des exemples d'application sont fournis par skipperkongen.dk/2011/07/12/using-shp2geocouch-to-push-osm-data-into-geocouch/  et skipperkongen.dk/2011/07/20/sticking-bicycle-paths-in-couchdb/

Liaisons avec d'autres SIGs

Contrairement à MongoDB, je n'ai rien trouvé en ce qui concerne la liaison avec Quantum GIS ou ArcGIS mais je suppose que la présence du pilote dans la version 1.9 de GDAL/OGR va bientôt modifier les choses. Il n'y a malheureusement aucun moyen d'exporter de manière simple des données provenant de CouchDB/GeoCouch.

Conclusions

CouchDB constitue un monde en soi. Tout est codé à l'intérieur des bases, leur permettant de fonctionner comme des applications autonomes et portables (réplication). Elle est très différente de MongoDB ou SimpleGeo (Cassandra) où seules les données sont stockées et où les traitements sont faits de l'extérieur.

There’s something almost subversive about CouchDB; it’s completely language-, platform-, and OS-agnostic" de  Jacob Kaplan-Moss, Createur de Django. jacobian.org/writing/of-the-web/

En pratique, je la vois un peu comme une espèce de jeu Meccano où l'on peut construire ce que l'on veut, en ajoutant des éléments (codes, pièces jointes, etc.). La future possibilité d'utiliser Python ou Ruby en lieu et place de JavaScript ne fera qu'accentuer cet aspect.

Mais la communication avec l'API HTTP/REST n'est pas, au premier abord, aussi évidente que ça (on se perd vite dans tous les URLs nécessaires). 

"Let me tell you something: Django may be built for the Web, but CouchDB is built of the Web. I’ve never seen software that so completely embraces the philosophies behind HTTP. CouchDB makes Django look old-school in the same way that Django makes ASP look outdated. jacobian.org/writing/of-the-web/

Du point de vue géospatial, Couch/GeoCouch me semble plus complète que MongoDB du simple fait qu'elle peut traiter toutes les géométries définies par l'OGC. Elle est encore pénalisée par l'absence de possibilités d'exportation simples.

MongoDB et CouchDB semblent encore loin des bases spatiales comme PostGIS. Elles sont néanmoins beaucoup plus légères et rapides pour ce qu'elles savent faire (c'est pourquoi elles sont utilisées dans les smartphones pour la géolocalisation, par exemple) mais elles évoluent très vite. Avec CouchDB/GeoCouch, pas besoin non plus de serveur géospatial indépendant. Il est aussi possible de créér des applications géospatiales autonomes. Mais, je laisse aux spécialistes le soin des discussions sur les comparaisons entre CouchDB et MongoDB et les autres bases NoSQL (nombreuses sur le NET) ou la comparaison avec les bases de données classiques.

Ces présentations simples (SimpleGeo (Cassandra), MongoDB, CouchDB/GeoCouch) ne peuvent illustrer  la richesse et  les possibilités de ces bases NoSQL que je vous invite  à découvrir (je constate que je m'amuse beaucoup en le faisant).

Pour terminer, je vous propose quelques livres sur CouchDB que j'ai consultés :

  • Beginning CouchDB (2009), Lennon, Joe, Apress, 294 p.
  • CouchDB: The Definitive Guide: Time to Relax (Animal Guide)(2010), Anderson, J. Chris, Lehnardt, Jan, Slater,Noah, O'Reilly, 245 p.
  • Getting started with GEO, CouchDB and Node.js (2011), Thompson, Mick, O'Reilly Media, 64 p.
  • CouchDB, le guide authentique, Anderson, J. Chris, Lehnardt, Jan, Slater, Noah, libre et gratuit sur guide.couchdb.org/editions/1/fr/index.html

et le site :

 

Tous les traitements ont été effectués sur Mac OS X avec CouchBase Simple Server 1.1.3


Site officiel : Apache CouchDB
Site officiel : GeoCouch
Site officiel : Couchbase
Site officiel : CouchDB The Definitive Guide
Site officiel : Coudbkit
Site officiel : CouchApp
Site officiel : shp2geocouch
Site officiel : Proj4js
Autres Liens : Le NoSQL dans le domaine géospatial : MongoDB avec JavaScript ou Python, ArcGIS et Quantum Gis
Autres Liens : Le NoSQL dans le domaine géospatial, approche préliminaire en Python avec SimpleGeo.
Autres Liens : « Python : les bases de données géospatiales - 2) mapping objet-relationnel (ORM, SQLAlchemy, SQLObject, GeoAlchemy, Django-GeoDjango, TurboGears ou MapFish) »)


Creative Commons License
licence Creative Commons Paternité-Pas d'Utilisation Commerciale-Pas de Modification 2.0 France

Commentaires

Excellent article. "Il n'y a

Excellent article.

"Il n'y a malheureusement aucun moyen d'exporter de manière simple des données provenant de CouchDB/GeoCouch."

Il existe FME Desktop 2013 pour exporter des données provenant d'une base couchdb.

merci pour la remarque

merci pour la remarque

Génération de GeoJSON

Comme indiqué dans l'article
http://skipperkongen.dk/2011/07/12/using-shp2geocouch-to-push-osm-data-i...

GeoCouch est capable de retourner les données au format GeoJSON standard qui peut ensuite être visualisable dans QGIS ou transformé dans un autre format avec ogr2ogr.

Exemple :
http://gd.iriscouch.com/cphosm/_design/geo/_rewrite/data?bbox=12.53%2C55...

Sachant qu'il est possible d'utiliser directement l'URL pour ogr2ogr mais aussi QGIS!

Poster un nouveau commentaire

Le contenu de ce champ sera maintenu privé et ne sera pas affiché publiquement.