6
09 juin 2014

Vous l'avez sans doute remarqué, le passage de Qgis 1.8 à 2.X a amené son lot de bouleversements ! L'un d'eux est l'intégration nativement de sextante (a spatial data procession framework) qui était à l'origine une librairie indépendante développée par Victor Olaya. D'abord intégré dans Qgis 1.x sous la forme de plug-in, il fait maintenant partie par défaut des fonctionnalités de la version 2.

Sextante va permettre à Qgis d'interagir avec GRASS, SAGA-GIS ou encore R dans une boite à outils unifiée. L'objectif de ce tuto est de proposer aux utilisateurs de R qui veulent utiliser un SIG de prendre conscience de la simplicité du développement de petits plug-in "maison".

Cahier des charges du plug-in : Proposer dans Qgis un outil permettant de visualiser une population statistique, et de valider une méthode de classification univariée sur des données géographiques dans le but de réaliser une carte.

Pré-requis : une installation de R (dans notre cas version 3.0.3 Warm Puppy) et Qgis (ici 2.2.0.5). Et des bases dans R.

L'intégralité du code est sur gitHub dans le projet QRclassInt

Ce plug-in tente de répondre à une demande en terme de pédagogie. Il nous manquait dans le cadre des cours de géomatique pour les L2 de géographie un outil qui permette de faire le lien entre le cours de statistique sous R et le cours de géomatique (entre autres sous Qgis). Nous avons donc décidé avec J.P. Leleu et F.Cerbelaud de pallier à ce manque.

Le tour de chauffe : les dépendances de R

Avant de se lancer à proprement parler dans Qgis et la réalisation du plug-in, il faut installer dans R les dépendances qui seront utilisées par le plug-in. Nous avons utilisé classInt, une librairie bien aimée des géographes qui sert à réaliser des classifications univariées sans (trop) d'effort.
Pour visualiser les résultats de manière un peu plus lisible, nous nous sommes appuyés sur xtable qui génère des tableaux en LaTeX, mais aussi, et c'est ce qui va nous intéresser ici, en HTML à partir de data frame R.

Il vous faudra donc installer ces librairies avec les commandes suivantes :

install.packages("classInt") 
install.packages("xtable")

Et vous pouvez quiter R que nous ne rouvrirons plus d'ici la fin de ce tuto.

Qgis et R une lingua franca ?

Avant de se lancer, il est nécessaire de faire quelques petits ajustements dans Qgis, car R n'est pas intégré par défaut dans sextante. Vous pouvez vous rendre dans le menu Traitements->options

snapshop traitements->options

Et là, vous devez activer l'intégration de R. Vous pouvez également choisir dans quel dossier seront stockés vous scripts.

options de sextante

A partir de là, nous pouvons normalement y aller sans craintes!

Mathieu, un autre membre de la tribu, en avait parlé sur son blog, Sextante a une syntaxe un peu particulière. Une fois passée la stupeur, vous découvrirez que vos scripts R n'ont pas besoin d'être grandement modifiés. Alors, allons-y (Alonso!) pour quelques définitions.

De manière générale, pour définir une variable, vous aurez besoin d'un double dièse

##nom_variable = mot_clef_sextante

Si le nom de la variable "nom_variable" est libre, en revanche "mot_clef_sextante" correspond à un certain nombre de mots clef pré-définis. Il faut noter dans un coin que toute les lignes qui commenceront par le double dièse correspondront à du code sextante tandis que les autres seront du code R (ce sera sans doute plus claire avec l'exemple que vous retrouverez plus loin).

  Vous aurez besoin d'un nom de groupe, ce qui va vous permettre de regrouper vos scripts entre eux. Ce nom de groupe est obligatoirement entre crochets

##[geolab] = group

Vous pouvez choisir une couche ouverte dans Qgis avec

##nom_variable_couche = vector

ce qui, dans ce cas là, va vous permettre de choisir une couche vecteur. Vous pouvez, de la même manière, accéder à des couches raster en remplaçant vector par raster.

##champ=field nom_variable_couche

De cette manière ou peut accèder à un champ de la couhe selectionnée.

De manière assez similaire, on pourra passer des variables textuelles

##nom_variable_text = string text_par_defaut

Des variables numériques

##nom_variable_num = number 100 

des booléens

##nom_variable_bool = boolean

Et il faudra également indiquer le type de sortie que l'on attend !

On pourra demander une sortie graphique, ce qui implique d'avoir au moins un appel de fonction graphique dans le script (de type plot(), hist() etc...)

##showplot

On pourra également demander des sorties dans l'interface de Qgis sous forme de couche vectorielle, raster ou encore tabulaire (on changera vector par raster ou table dans la ligne suivante)

##nom_de_la_sortie = vector

Maintenant que nous avons vu les rudiments de communication entre R et Qgis, allons-y pour un exemple !

Utilisation du plug-in, quelques exemples concrets.

Pour créer une script R dans Qgis vous devez vous rendre dans la boite à outils sextante (normalement sur la droite de l'interface) dans R scripts > Tools > Create new R script et double cliquer sur ce dernier. Cela devrait vous ouvrir une fênetre "editeur de script"

Qgis editeur de script R

Nous commencerons par créer l'en-tête du document

<script src="https://gist.github.com/ElCep/10807630.js"></script>

Le groupe geolabR va vous permettre de classer les scripts, ce qui donnera avec cet exemple :

tools sextante in Qgis

Continuons, le reste du code est très proche de R !

<script src="https://gist.github.com/ElCep/72117b1ec0562ef7d003.js"></script>

Une fois que vous avez créé la fonction, vous pouvez l'enregistrer avec la petite disquette en haut à gauche de la fenêtre d'éditeur de script.

Et comment ça s'utilise ?

Prenons un exemple encore un peu d'actualité ! Les élections municipales à Limoges. Le site de la mairie nous permet de récupérer des données en PDF que je vous ai scrapées pour pouvoir les manipuler. Je les ai ensuite jointes à des données géographiques reprenant l'emprise des bureaux de vote pour la France entière sur le site de cartelect. Vous pouvez retrouver les données sur cet article de Blog.

Pour tester notre nouvelle fonction, il faut que vous ayez une couche vectorielle d'ouverte. J'ouvre donc ici les données du second tour des municipales à Limoges.

Vous constatez que chaque champ du "formulaire" est issu des lignes commençant par ##

Vous choisissez la couche sur laquelle vous allez faire la discrétisation, puis le champ. Ici, par exemple, nous allons nous intéresser au champ p_RODET qui représente le score du PS. Vous choisissez ensuite le nombre de classes que vous souhaitez effectuer, ainsi que la méthode de classification. Vous avez bien évidement accès à toutes les méthodes proposées par le package classInt ("fixed", "sd", "equal", "pretty", "quantile", "kmeans", "hclust","bclust", "fisher", ou "jenks").

Il faut faire attention aux méthodes de classification comme hclust ou jenks qui sont itératives et qui vont demander beaucoup de temps de calcul (cf. figure suivante) si vous effectuez cette classification sur des couches avec un grand nombre de polygones. La figure suivante vous montre comment le temps de calcul (en 'y') bondit de manière exponentielle quand le nombre de polygones (individus statistiques) augmente.

temps de calcul avec la methode de jenks en fontion du nombre de polygones

Une fois que vous avez effectué tous vos réglages, vous pouvez lancer la classification. Vous devriez obtenir 3 types de sortie différents  :

  • Une table sous forme HTML qui reprend le nombre d'individus par classe
  • Une courbe de fréquence cumulée qui vous aidera à déterminer la justesse de la classification
  • Une couche vectorielle nommée "sortie" qui contiendra une nouvelle colonne (facteur) contenant les bornes de la classification.

resultat table R qgis

courbe freq cumulée

On peut voir ici qu'une classification en 4 classes par les écart-types n'est pas forcément le type de classification le plus appropriée !

Et on peut finir par la traditionnelle analyse thématique par classe dans Qgis sur la nouvelle colonne créée (champ facteur) ! Ce champ facteur contient les bornes de classes sous forme de facteurs (d'où le nom très poétique), ce qui permet de rapidement les retrouver !

analyse thématique dans Qgis suite à la classification R

Voilà ! :-) plus d'excuses pour faire de belles classifications appuyées sur des arguments de structure de population !

 

code complet: 
##geolabR=group
##couche=vector
##champ=field couche
##class=number 4
##styleClass=string sd
##showplots
##sortie=output vector
library(classInt)
library("xtable")
 
classif = classIntervals(couche[[champ]],n=class,style=styleClass)
 
#definition des breaks
brks<-round(classif$brks,digits=2)
 
#preparation de la legende
# Create labels from break values
intLabels =matrix(1:(length(brks)-1))
for(j in 1:length(intLabels )){intLabels [j] = paste(as.character(brks[j]),"-",as.character(brks[j+1]))}
 
tab=as.data.frame(intLabels)
a=hist(classif$var,classif$brks)
tab$count=a$counts
colnames(tab)=c("interval","nombre d'individus")
 
pal1 = c("wheat1", "red3")
plot(classif,pal=pal1)
>class(intLabels)
>print(xtable(tab),type="html")
 
facteur<-cut(classif$var, classif$brks) #transformation en facteur
couche@data<-cbind(couche@data, facteur) #rajout d'une colonne
sortie=couche
A propos de l'auteur: 
Etienne DELAY

Doctorant à GEOLAB UMR 6042 CNRS (université de Limoges), , , géographie et informatique, réseau et logiciel libre ... Viticulture territoire et modélisation. Rien d'antinomique. ;-)

Commentaires

Bonjour, félicitations pour ce tutoriel très intéressant.

J'ai testé la création du script et pas de problème sauf lorsque les résultats s'affichent et que je clique sur "R Plots", j'obtiens un point d'interrogation blanc sur fond bleu. Je pense que la fenêtre Résultats n'arrive pas à aller chercher l'image.
Est-ce que vous avez déjà rencontré ce cas ?

Bonjour Pedro,

Toutes mes excuses pour le retard ! J'espère vraiment que vous avez trouvé une solution depuis le temps ! je ne peux pas vous aider ... sous quelle plateforme travaillez-vous ?

Woaw, un article de geotribu avec une référence à Doctor Who, c'est du tout bon :) Sinon, quel(-le-s) ressources / sites / tuto serait conseillés pour débuter avec R ? Pour un grand débutant :)

Bonsoir Pierre,

Mieux vaux tard que jamais... je n'avais pas vu votre commentaire ... Alors je vous conseillerais bien de commencer du côté de R pour les géographes qui a été revu et augmenté dans un framabook

Etienne

Bonjour Etienne, merci pour ce tuto !

Il m'a inspiré et m'a donné l'idée de rédiger un document détaillé avec quelques exemples d'intégration de script R dans QGIS. Voici le lien : http://www.cefe.cnrs.fr/images/Plateformes/SIE/docs/utilisation_outils_R...

Salutation d'un ancien membre de Geolab ;)
Cyril Bernard

Bonjour Cyril,

Merci beaucoup elle est super cette petite documentation ! C'est cool quand ça donne des idées les tutos!loc2Path ça me donne moi aussi des idées de traitements des données GPS ... qu'il faut que je croise avec des temps de parcours pour une étude sur les sportifs :-p

Du coup au passage je te renvois les saluations de ceux qui t'on connu à GEOLAB!