Migrer un script R de QGis vers RStudio

La possibilité d’exécuter des scripts R dans QGis est bien pratique. Par contre, si on démarre avec R ce n’est pas l’environnement le plus facile. Modifier quelques instructions d’un modèle de script ne pose pas trop de problèmes, mais écrire un script plus compliqué vaut bien la peine de travailler avec un environnement plus complet, tel que R Studio. La possibilité d’exécuter les lignes pas à pas, l’accès au contenu des variables, la fenêtre des graphiques, bref, la disponibilité d’un véritable environnement de développement est un atout pour tout débutant.

Le premier problème auquel on est confronté, quand on a un modèle de script sous QGis et que l’on veut l’utiliser et modifier dans RStudio est l’accès aux données. L’interface de QGis avec les scripts R se fait à travers les lignes de code précédées par des ##:

Dans cet exemple nous avons trois catégories de lignes avec ##:

  • Des lignes propres à QGis:Basic statistics = group ou showplots, qui définissent où placer le script et s’il faut une sortie graphique. Ces lignes n’ont pas à être prises en compte dans RStudio.
  • Des lignes qui permettent de paramétrer des valeurs de variables à utiliser dans corps du script: nb_simul et nb_vois. Ces lignes sont à transformer simplement en ligne de code, au début du script, définissant une valeur à la variable (nb_simul = 100, nb_vois=10)
  • Des lignes de définition des données source à utiliser dans le script: Layer=vector et Field=Field Layer. Ces lignes vont être traduites dans le fenêtre QGis de lancement du traitement, pars des champs contenant la liste de couches chargées dans QGis et la liste des attributs de chaque couche. C’est bien pratique, mais ce sont ces lignes qui poseront problème lors du passage à RStudio.

Si vous êtes pressé, allez directement au paragraphe « Charger un shapefile dans R » qui vous donne le code pour remplacer les lignes 2 et 3 de cet exemple. Si vous voulez un panorama plus large sur l’accès aux données avec R, prenez le temps de lire les paragraphes suivants.

Les différence de terminologie entre QGis et R

Si vous n’êtes pas familier de R et que vous cherchez sur le net des informations, sachez que certains mots n’ont pas la même signification dans le domaine des SIG et dans R .

Layer=vector dans QGis indique au générateur de la fenêtre de paramétrage qu’il s’agit d’une couche chargée dans QGis. Dans R, vector indique une suite de valeurs à une dimension, par exemple la suite de valeurs contenues dans une colonne de la table d’attributs. Rien à voir avec la distinction en SIG des modes vecteur et raster.

Dans R il y a différents types d’objet contenant des données. Les connaître est indispensable pour pouvoir les utiliser dans les scripts.

L’objet VECTEUR dans R

Un vecteur c’est l’élément de base des données dans R. Il correspond à une suite de valeurs. Par exemple: 1,2,3,4,5,6,7,8,9,10 . Vous pouvez avoir trois types de vecteurs: numériques, caractères et logiques(des suites de valeurs FRAI/FAUX).

Pour des petits vecteurs nécessaires dans un script, vous pouvez tout simplement les coder en dur avec l’instruction c():

a=c( 1,2,3,4,5,6,7,8,9,10 )

Crée le vecteur a avec les valeurs indiquées.

Par contre, si vous devez lire les valeurs dans un fichier, l’instruction à utiliser est scan:

Dans cet exemple le fichier liste1.txt est de la forme:

Mais il pet aussi être de la forme:

L’instruction scan() charge les valeurs, qu’ils soient en ligne ou en colonne.

Pour plus d’information sur l’instruction scan: https://stat.ethz.ch/R-manual/R-devel/library/base/html/scan.html

L’objet DATA.FRAME dans R

Les data.frames ce sont des tables ou matrices. En réalité, ce sont des vecteurs de même longueur traités comme un ensemble.

Voici un exemple de création de tableau (df) avec l’instruction data.frame.

On crée trois vecteurs (num, minuscules, majuscules), puis l’instruction data.frame crée la matrice df. Pour plus d’informations sur l’instruction data.frame: https://www.rdocumentation.org/packages/base/versions/3.6.1/topics/data.frame.

Charger un data.frame à partir d’un fichier csv

Passons maintenant à des situations plus classiques. Vos données sont déjà des tableaux ou matrices, pas des vecteurs séparés. Un moyen classique de récupérer vos données c’est sous forme d’un fichier texte de type csv.

Voici un exemple:

L’instruction qui permet de charger un fichier csv dans un data.frame est read.csv:

L’instruction head() affiche les six premières lignes d’un data.frame. Pour plus d’informations sur l’instruction read.csv : https://stat.ethz.ch/R-manual/R-devel/library/utils/html/read.table.html

Charger un data.frame à partir d’un fichier EXCEL

Voici un exemple de chargement d’une feuille Excel dans une data.frame:

Remarquez l’appel à la librairie « readxl », indispensable pour que RStudio retrouve l’instruction read_excel. Comme cette bibliothèque n’est pas installée par défaut, il faudra que vous l’installiez (menu Tools->Install packages…).

Pour plus d’informations sur l’instruction read_excel: https://www.rdocumentation.org/packages/readxl/versions/0.1.1/topics/read_excel

Charger un data.frame à partir de la table attributaire d’un shapefile

La table attributaire d’un fihier shapefile est contenue dans un fichier de type dbf. Vous pouvez accéder directement à la table attributaire en chargeant les données avec l’instruction read.dbf. Notez bien que dans ce cas vous n’aurez pas les géométries de votre shapefile, seulement la table attributaire.

Voici un exemple ce chargement de la table attributaire d’une couche communes:

Deux remarques:

La première est que cette instruction est contenue dans la librairie « foreign » que vous devrez installer au préalable (menu Tools->Install packages…) .

La deuxième, d’ordre plus général, concerne le chemins des fichiers dans les instructions de lecture de données. Si vous regardez les exemples précédents, vous remarquerez que les chemins des fichiers sont définis en utilisant des /. Par contre dans ce dernier exemple, les chemins sont définis avec des \\. Notez donc que si vous avez des messages d’erreur avec un nom de fichier, c’est généralement parce que la bibliothèque de votre instruction utilise l’autre notation… Pourquoi faire simple si on peut faire compliqué…

Les objets SpatialDataFrame

Un autre type d’objet pour vos données est l’équivalent des couches SIG, c’est à dire des objets ayant en même temps des attributs et des géométries. Ces objets sont appelés des Spatial DataFrames (tableaux spatialisés). Il y en a de trois types, selon le type de géométrie:

  • avec des géométries de type point : SpatialPointDataFrame
  • avec des géométries de type Ligne : SpatialLineDataFrame
  • avec des géométries de type Polygone : SpatialPolygonDataFrame

Ces trois types de structure associent une table attributaire à un vecteur de géométries. Mais vous pouvez créer seulement la partie géométrique, sans table attributaire. Dans ce cas les objets seront de type:

  • avec des géométries de type point : SpatialPoints
  • avec des géométries de type Ligne : SpatialLines
  • avec des géométries de type Polygone : SpatialPolygons

La bibliothèque principale pour gérer les géométries dans R est la library(sp).

Comme dans QGis, en ce qui concerne la géométrie vous aurez deux situations différentes:

  • vous aurez un fichier de données non SIG mais contenant des coordonnées pour les géométries
  • vous aurez un fichier SIG, shapefile, par exemple.

Convertir un data.frame en Spatial*DataFrame

Ceci est l’équivalent de l’option QGis Couche->Ajouter une couche->Ajouter une couche de texte délimité ou bien Couche->Ajouter une couche->Ajouter une couche feuille de calcul.

Il faut d’abord créer le data.frame avec une des options expliquées plus haut. Prenons l’exemple d’un fichier de type csv. Il faut que ce fichier contienne deux colonnes avec les coordonnées X et Y.

Dans exemple suivant, les coordonnées de chaque enregistrement sont contenues dans les champs X_mean et Y_mean

L’instruction SpatialPointsDataFrame nécessite trois arguments:

  • coords, une matrice avec les X et Y pour chaque enregistrement
  • data avec la data.frame de la table attributaire
  • proj4string avec le système de coordonnées de référence de la couche

Vous pouvez avoir une description plus détaillée de la commande à l’adresse https://www.rdocumentation.org/packages/sp/versions/1.3-1/topics/SpatialPoints

Dans l’exemple, la commande dim() donne le nombre d’enregistrements et le nombre des colonnes attributaires de l’objet.

Charger directement une couche SIG (shapefile)

Plus simple, si vous avez déjà une couche géographique, ici shapefile, vous pouvez créer directement la Spatial*DataFrame.

Ici on ne verra que le chargement d'un shapefile, mais sachez qu'il est possible charger d'autres formats directement. A titre d'exemple,https://cran.r-project.org/web/packages/postGIStools/vignettes/postGIStools-vignette.html permet de charger des données directement à partir d'une base de données Postgresql/Postgis

La commande readOGR permet de créer automatiquement le type de SpatialDataFrame correspondant au shapefile source (Point,ligne,polygone). Pour plus d’informations sur cette commande: https://www.rdocumentation.org/packages/rgdal/versions/1.4-4/topics/readOGR

Reste un autre type de données susceptibles d’être chargées dan un script R: les rasters.

Les trois types d’objet raster

Dans R vous trouverez trois types d’objets pouvant contenir des données raster:

  • les RasterLayer
  • les RasterStack
  • les RasterBrick

RasterLayer

C’est le type d’objet le plus simple. Il comprend une matrice de valeurs (lignes,colonnes) et peut être défini comme un raster monobande.

library(raster)
test <- raster(« c:/blog/data/test.tif »)

Vous avez une description détaillée de la commande raster à l’adresse https://www.rdocumentation.org/packages/raster/versions/3.0-2/topics/raster

Si le fichier est un raster multibande, par exemple une photo aérienne, par défaut seule la première bande est chargée. Si non, l’argument band permet de sélectionne une autre bande. Mais dans tous les cas, un objet RasterLayer ne contient qu’une seule bande.

RasterStack

La commande RasterStack permet de créer un raster multibande à partir de plusieurs RasterLayers

library(raster)
test <- stack( « c:/blog/data/landsat_band2.tif », « c:/blog/data/landsat_band3.tif » , « c:/blog/data/landsat_band5.tif » )

Cette commande crée un raster avec trois bandes, correspondantes aux bandes 2,3 et 5 d’une image Landsat

Vous avez des informations détaillées sur la commande RasterStack à l’adresse https://www.rdocumentation.org/packages/utils/versions/3.6.1/topics/stack

RasterBrick

Cette commande est similaire à la précédente quant à son résultat. La différence se situe au niveau des entrées. Tandis que la commande stack peut avoir des rasterlayers situés dans différents fichiers, la commande brick n’accepte qu’un seul fichier en entrée.

ibrary(raster)
test <- brick(« c:/blog/data/photo.tif »)

créera un rasterbrick avec les trois bandes (RGB) du fichier photo.tif.

Vous avez une description détaillée de la commande brick à l’adresse: https://www.rdocumentation.org/packages/raster/versions/3.0-2/topics/brick

Si cet article vous a intéressé et que vous pensez qu'il pourrait bénéficier à d'autres personnes, n'hésitez pas à le partager sur vos réseaux sociaux en utilisant les boutons ci-dessous. Votre partage est apprécié !

3 thoughts on “Migrer un script R de QGis vers RStudio

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *