Skip to content

Commit

Permalink
Restore tuto about mongo spatial - Merge #4 from geotribu/tutorials
Browse files Browse the repository at this point in the history
  • Loading branch information
Guts authored Mar 21, 2020
2 parents 631a515 + 3ef02b8 commit 53836b9
Show file tree
Hide file tree
Showing 4 changed files with 128 additions and 12 deletions.
18 changes: 10 additions & 8 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
# See https://pre-commit.com for more information
# See https://pre-commit.com/hooks.html for more hooks
exclude: "node_modules|migrations|.venv|tests/dev/|tests/fixtures/"
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v2.4.0
hooks:
- id: trailing-whitespace
- id: detect-private-key
- id: end-of-file-fixer
- id: check-yaml
- id: check-added-large-files
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v2.5.0
hooks:
- id: trailing-whitespace
args: [--markdown-linebreak-ext=md]
- id: detect-private-key
- id: end-of-file-fixer
- id: check-yaml
- id: check-added-large-files
Empty file added content/tutoriels/.pages
Empty file.
5 changes: 1 addition & 4 deletions content/tutoriels/index.md
Original file line number Diff line number Diff line change
@@ -1,4 +1 @@
# Interviews

!!! info
Y'a plus qu'à...
# Tutoriels
117 changes: 117 additions & 0 deletions content/tutoriels/mongo_spatial.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
# 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](http://fr.openclassrooms.com/informatique/cours/dynamisez-vos-sites-web-avec-javascript), rien de sorcier.

Je recommande vivement l'utilisation de l'excellent editeur de code open source [Brackets](http://brackets.io/).

## 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](http://sametmax.com/un-gros-troll-de-plus-sur-javacscript/), 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](http://d3js.org/) et pourquoi pas [Three.js](http://threejs.org/). 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](http://nodejs.org/ "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](http://docs.mongodb.org/manual/installation/ "docs.mongodb.org/manual/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èmemnt 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 prete.

## 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](http://geojson.org/geojson-spec.html#feature-collection-objects) 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 :

```bash
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 connection 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 connection active [`mongo`]...

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

C'est prêt :).

Guillaume

0 comments on commit 53836b9

Please sign in to comment.