Aller au contenu

Mongo Spatial#

Warning

Ce contenu est une archive. Son contenu n'est sûrement plus très frais...

Tuto GeoTribu d'introduction à MongoDB pour l'information spatiale. Nécessite de légère base de Javascript, rien de sorcier.

Je recommande vivement l'utilisation de l'excellent editeur de code open source Brackets.

Introduction#

Le but de ce tutorial est de découvrir via un exemple simple comment assembler une architecture de données spatiales avec mongodb, puis dans un second tutoriel, en y ajoutant node.js.

Mongo et node sont deux technologies qui font beaucoup parler d'elles. Beaucoup s'y opposent arguant que javascript est une abération, spécialement côté serveur. Revenir aussi sur 40 ans de maturation de SQL, simplement par effet de mode, serait pour certains une perte de temps. Ça se défend. De mon point de vue, je prends mon pieds avec ces outils et en participant au bouillaunement qui les entoure, notamment dans le domaine de la carto. Ça innove de partout. Malgrès quelques contraintes, Javascript apporte aussi une forme de simplicité et d'accessibilité. Si vous ne vous y êtes pas encore mis, les compétances que vous développerez en vous plongeant dans mongo et node vous serviront par la suite à mieux appréhender D3.js et pourquoi pas Three.js. La dynamique autour de javascript ne semble pas ralentir, bien au contraire.

Installation#

Je ne vais pas m'étendre ici, pour node, rendez vous simplement sur nodejs.org et sélectionner votre OS. Si vous utilisez Ubuntu, vous pouvez ouvrir un terminal et entrer:

sudo apt-get install python-software-properties
sudo add-apt-repository ppa:chris-lea/node.js
sudo apt-get update
sudo apt-get install nodejs

Vous pouvez ensuite lancer un node --version pour vérifier que l'instalation s'est bien passée.

Pour MongoDB, c'est la même chose, vous n'avez qu'à suivre le Guide d'installation

Configurer Mongo#

Si vous avez suivi le guide mongo, votre serveur de base de données devrait être actif. Si la commande mongo retourne Error: couldn't connect to server 127.0.0.1:27017... c'est qu'il ne l'est pas. Rien de plus simple:

mongod  # pour lancer mongodb
mongod --repair # parfois utile après avoir fermé malencontreusement mongod...

La première chose à faire est de créer une base de données. C'est extrèment simple. Toujours dans le terminal, lancer la commande mongo pour ouvrir une connection à la base de données par defaut "test":

mongo
MongoDB shell version: 2.4.9 // Ceci est le résultat de la commande mongo.
connecting to: test
>

Vous remarquerez que le curseur a changé. A partir de maintenant, mongo n'acceptera plus que du javascript, mais extrêmement simple.
Commençons par créer une base de données:

use surfdb
switched to db surfdb // Ceci est le résultat de la commande use [dbname].
>

Fermer la connection en pressant Ctrl + C.

La base de données est prête.


Insertion de données spatiales#

Passons à l'étape de l'insertion des données. De base, mongodb propose un outil pour importer les formats JSON, CSV or TSV. Même s'il gère une sorte de GEOJSON, l'objet FeatureCollection pose encore problème. Rien de grâve car il suffit juste d'extrère l'array features:

Au lieu d'utiliser ça:

{
  "type": "FeatureCollection",
  "features":
  [
    {
      "type": "Feature", "id": 0, "properties": {
        "Name": "Queensie Mini", "Lat": -33.7857729, "Long": 151.2899673
      }, "geometry": {
        "type": "Point",
        "coordinates": [ 151.2899673, -33.785772899999586 ]
      }
    }
  ]
}

Utiliser ceci:

    [
      {
        "type": "Feature", "id": 0, "properties": {
          "Name": "Queensie Mini", "Lat": -33.7857729, "Long": 151.2899673
        }, "geometry": {
          "type": "Point",
          "coordinates": [ 151.2899673, -33.785772899999586 ]
        }
      }
    ]

Nos données étant au bon format, passons à la commande mongoimport. Par defaut cette commande se connecte au serveur local, ce qui réduit dans notre cas le nombre d'arguments à passer :

mongoimport -d surfdb -c spot --type json --jsonArray --file data.json

Si tout ce passe bien, vous devriez voir ça:

connected to: 127.0.0.1
Fri Apr  4 00:13:22.965 check 9 32
Fri Apr  4 00:13:24.326 imported 32 objects

En ouvrant une connexion au serveur avec la commande mongo, nous pouvons maintenant accéder à nos données:

mongo
> use surfdb
show collections; // affiche les collections dans la base.
db.spot.stats(); // retourne les stats de la collection spot, type {Object}.
db.spot.findOne(); // retourne un document de la collection, type {Object}.
db.spot.find(); // retourne tous les documents de la collection, type [Array].
db.spot.find({'properties.Name':'Winki'}) // retourne tous les documents qui ont comme proprieté "properties.Name" = "Winki".

C'est aussi simple que ça !

C'est certes simple, mais à part stocker un pseudo geojson, ça ne sert pas à grand chose. Pour "activer" la fonction spatiale, mongo a besoin d'un index spacial. Toujours dans le terminal, serveur demarré [mongod] et connexion active [mongo]...

> db.spot.ensureIndex({'geometry':'2dsphere'}); // Explicite non ?

C'est prêt :).


Auteur#

Guillaume de Boyer#

portrait

Géomaticien de formation, j’ai rejoint l’Australie en décembre 2011 avec un WHV. Après quelques mois passés à voyager, j’ai posé mes valises à Sydney où je travaille depuis septembre 2012 comme administrateur SIG dans le secteur des telecoms. Je m'efforce de créer une architecture spatiale optimale pour visualiser, partager et éditer les éléments d'un réseau qui relie les métropoles australiennes et néo-zelandaises à l’Asie du sud-est et l’Amérique du Nord. Ma sensibilité spatiale se porte donc vers les technologies web open-sources, les bibliothèques et framework javascript et les bonnes pratiques liés à l’assemblage de ces briques logicielles.

J’aime aussi beaucoup la visualisation de données, l’open-data, le crowdsourcing et tout les concepts qui naissent de l’internet et qui nous aident à définir et réinventer notre corps de métier.

Twitter : https://twitter.com/_Geopan

Commentaires

Afin de favoriser les échanges constructifs, merci de préférer le pseudonymat à l'anonymat. Pour rappel, l'adresse mail n'est pas exposée publiquement. Consulter la page sur la confidentialité et les données personnelles.
Une version minimale de la syntaxe markdown est acceptée pour la mise en forme des commentaires.
Propulsé par Isso.

Ce contenu est sous licence Creative Commons BY-NC-SA 4.0 International Pictogramme Creative Commons Pictogramme Creative Commons BY Pictogramme Creative Commons NC Pictogramme Creative Commons SA