4.2 Exercices

Dans cette section, vous mettrez en pratique certains concepts vus dans la section leçon de ce module. Bien que la réponse à chaque question soit disponible, il est très important de tenter d’y répondre par vous-même!


Question 1

Créer une géométrie simple de type polygone qui a la forme d’un carré de 10 unités de long avec un trou en son centre qui a la forme d’un carré de 4 unités de long.

Réponse

Définir deux matrices de coordonnées, une pour le grand et l’autre pour le petit carré. Les coordonnées exactes peuvent prendre n’importe quelles valeurs du moment que la taille de chaque carré respecte les dimensions demandées.

matrice_carre_grand  <- rbind(c(1,1), c(1,11), c(11,11), c(11,1), c(1,1))
matrice_carre_petit <- rbind(c(4,4),c(4,8),c(8,8),c(8,4),c(4,4))


Créer une liste avec ces deux matrices et créer le polygone en utilisant la fonction st_polygon()

polygone <- st_polygon(list(matrice_carre_grand, matrice_carre_petit))
polygone
POLYGON ((1 1, 1 11, 11 11, 11 1, 1 1), (4 4, 4 8, 8 8, 8 4, 4 4))


Visualiser le polygone pour confirmer votre réponse:

mapview(polygone)


Question 2

a) Créer 3 géométries simples de type ligne en utilisant les matrices de coordonnées suivantes:

matrice_ligne1 <- rbind(c(1,1), c(2,2), c(3,1), c(4,2), c(5,1), c(6,2), c(7,1))
matrice_ligne2 <- rbind(c(1,5), c(3,3), c(7,5), c(3,5), c(4,4))
matrice_ligne3 <- rbind(c(1,3), c(3,7), c(7,8), c(10,10))
Réponse

Utiliser la fonction st_lignestring() pour créer les 3 géométries simples de type ligne.

ligne1 <- st_linestring(matrice_ligne1)
ligne2 <- st_linestring(matrice_ligne2)
ligne3 <- st_linestring(matrice_ligne3)


b) Définir une couche de données vectorielles comprenant ces 3 lignes, et lui attribuer la projection Web de Mercator.

Réponse

Créer d’abord un objet sfc, c’est-à-dire une simple feature column, en utilisant la fonction st_sfc():

lignes <- st_sfc(ligne1, ligne2, ligne3)


Ajouter maintenant le SCR demandé. La projection Web de Mercator possède le code EPSG 3857 (revoir le Module 3 pour trouver cette information).

lignes <- st_sfc(ligne1, ligne2, ligne3, crs = 3857)
lignes
Geometry set for 3 features 
Geometry type: LINESTRING
Dimension:     XY
Bounding box:  xmin: 1 ymin: 1 xmax: 10 ymax: 10
Projected CRS: WGS 84 / Pseudo-Mercator
LINESTRING (1 1, 2 2, 3 1, 4 2, 5 1, 6 2, 7 1)
LINESTRING (1 5, 3 3, 7 5, 3 5, 4 4)
LINESTRING (1 3, 3 7, 7 8, 10 10)


c) Ajouter deux attributs à cette couche de données. Le premier attribut correspond à un nom de votre choix pour désigner chaque ligne, et le deuxième attribut correspond au nombre d’extrémités dans chaque ligne.

Réponse

Créer une table d’attribut en utilisant la fonction data.frame().

lignes_att <- data.frame(
  nom = c("Zigzag", "Tourbillon", "Tordu"),
  nombre = c(nrow(matrice_ligne1), nrow(matrice_ligne2), nrow(matrice_ligne3))
)
lignes_att
         nom nombre
1     Zigzag      7
2 Tourbillon      5
3      Tordu      4


Créer un objet sf, c’est-à-dire un simple feature, en utilisant la fonction st_sf() pour unir la table d’attributs des lignes à leur composante spatiale.

lignes_sf <- st_sf(lignes, lignes_att)
lignes_sf
Simple feature collection with 3 features and 2 fields
Geometry type: LINESTRING
Dimension:     XY
Bounding box:  xmin: 1 ymin: 1 xmax: 10 ymax: 10
Projected CRS: WGS 84 / Pseudo-Mercator
         nom nombre                         lignes
1     Zigzag      7 LINESTRING (1 1, 2 2, 3 1, ...
2 Tourbillon      5 LINESTRING (1 5, 3 3, 7 5, ...
3      Tordu      4 LINESTRING (1 3, 3 7, 7 8, ...


d) Visualiser cette couche de données vectorielles. Assurez-vous d’avoir une légende identifiant chaque ligne par son nom.

Réponse

Utiliser la fonction mapview() et spécifier que l’argument z correspond à l’attribut “nom” de l’objet lignes_sf.

mapview(lignes_sf, z="nom", layer.name = "Nom des lignes")


Question 3

Pour cette question, vous utiliserez les données vectorielles décrivant les régions administratives de la Nouvelle-Zélande. Ces données se nomment nz et sont disponibles dans la bibliothèque spData.

library(spData) 
To access larger datasets in this package,
install the spDataLarge package with:
`install.packages('spDataLarge',
repos='https://nowosad.github.io/drat/',
type='source')`
data(nz)


a) Combien d’éléments spatiaux contient la couche nz et de quel type de géométrie sont ces éléments ?

Réponse

Pour répondre à cette question, nous pouvons simplement repérer l’information demandée dans l’affichage général de l’objet nz

nz
Simple feature collection with 16 features and 6 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: 1090000 ymin: 4749000 xmax: 2090000 ymax: 6192000
Projected CRS: NZGD2000 / New Zealand Transverse Mercator 2000
First 10 features:
                Name Island Land_area Population
1          Northland  North     12501     175500
2           Auckland  North      4942    1657200
3            Waikato  North     23900     460100
4      Bay of Plenty  North     12071     299900
5           Gisborne  North      8386      48500
6        Hawke's Bay  North     14138     164000
7           Taranaki  North      7254     118000
8  Manawatu-Wanganui  North     22221     234500
9         Wellington  North      8049     513900
10        West Coast  South     23245      32400
   Median_income Sex_ratio
1          23400    0.9425
2          29600    0.9443
3          27900    0.9521
4          26200    0.9280
5          24400    0.9350
6          26100    0.9238
7          29100    0.9569
8          25000    0.9388
9          32700    0.9336
10         26900    1.0139
                             geom
1  MULTIPOLYGON (((1745493 600...
2  MULTIPOLYGON (((1803822 590...
3  MULTIPOLYGON (((1860345 585...
4  MULTIPOLYGON (((2049387 583...
5  MULTIPOLYGON (((2024489 567...
6  MULTIPOLYGON (((2024489 567...
7  MULTIPOLYGON (((1740438 571...
8  MULTIPOLYGON (((1866732 566...
9  MULTIPOLYGON (((1881590 548...
10 MULTIPOLYGON (((1557042 531...


Nous pouvons y lire qu’il y a 16 éléments (features) et que la géométrie est de type multipolygone. Nous pouvons également trouver les réponses en utilisant les deux fonctions spécifiques suivantes:

nrow(nz)
[1] 16


Effectivement, nz étant un data.frame, nous pouvons utiliser les manipulations usuelles pour cette classe d’objet. Chaque élément dans un data.frame occupe une rangée.

st_geometry_type(nz)
 [1] MULTIPOLYGON MULTIPOLYGON MULTIPOLYGON
 [4] MULTIPOLYGON MULTIPOLYGON MULTIPOLYGON
 [7] MULTIPOLYGON MULTIPOLYGON MULTIPOLYGON
[10] MULTIPOLYGON MULTIPOLYGON MULTIPOLYGON
[13] MULTIPOLYGON MULTIPOLYGON MULTIPOLYGON
[16] MULTIPOLYGON
18 Levels: GEOMETRY POINT LINESTRING ... TRIANGLE


Cette commande nous confirme que la couche nz contient bien des multipolygones.



b) Trouver le nombre d’attributs de nz et leur nom.

Réponse

Pour trouver le nombre d’attributs, nous pouvons nous référer à l’affichage général de nz (voir plus haut) qui nous informe que l’objet contient 6 attributs (ou champs, fields en anglais).

Nous pouvons également utiliser la fonction ncol() qui donne le nombre de colonnes dans le data.frame.

ncol(nz)
[1] 7


L’objet nz contient bel et bien 7 colonnes. Cependant, la dernière colonne correspond à la géométrie de chaque élément de nz (qui est en fait, un attribut spatial). Ainsi, le nombre d’attribut est 6.

Pour trouver le nom des attributs, nous pouvons encore s’appuyer sur le fait que nz est un data.frame et utiliser la fonction names():

names(nz)
[1] "Name"          "Island"        "Land_area"    
[4] "Population"    "Median_income" "Sex_ratio"    
[7] "geom"         



c) Trouver le code EPSG, le nom et l’unité de mesure de la projection utilisée.

Réponse

Ces trois informations se trouvent en utilisant les fonctions suivantes:

st_crs(nz)$epsg
[1] 2193
st_crs(nz)$Name
[1] "NZGD2000 / New Zealand Transverse Mercator 2000"
st_crs(nz)$units
[1] "m"


La projection utilisée est le New Zealand Transverse Mercator 2000. NZGD 2000 réfère au datum utilisé, appelé le New Zealand Geodetic Datum.



d) Transformer la projection de nz pour la projection conique conforme de Lambert (LCC).

Réponse

La projection conique conforme de Lambert est donnée par le code EPSG 32198.

nz_lcc <- st_transform(nz, crs = 32198)


Vérifions que notre transformation est correcte.

st_crs(nz_lcc)$proj4string
[1] "+proj=lcc +lat_0=44 +lon_0=-68.5 +lat_1=60 +lat_2=46 +x_0=0 +y_0=0 +datum=NAD83 +units=m +no_defs"


e) Chaque polygone de la couche nz correspond à une région. Visualiser la couche nz en illustrant chaque région avec une couleur différente.

Réponse

mapview(nz, zcol = "Name", layer.name = "Régions")


f) Importer le fichier nz_capitales.cvs contenu dans le dossier Module4_donnees. Ce fichier donne le nom et la localisation des capitales de chaque région de la Nouvelle-Zélande. Créer une carte illustrant les frontières des régions ainsi que la position de leur capitale respective.

Réponse

Tout d’abord, vous devez importer le fichier nz_capitales.cvs dans votre session de travail R. Utiliser la fonction de base read.table() afin de stocker les coordonnées des capitales dans un object de classe data.frame.

nz_capitales <- read.table("Module4/Module4_donnees/nz_capitales.csv", header = TRUE, sep = ",")
nz_capitales
          Capitales Longitude Latitude
1          Auckland     174.8   -36.85
2        Wellington     174.8   -41.29
3      Christchurch     172.6   -43.53
4          Hamilton     175.3   -37.78
5           Dunedin     170.5   -45.87
6  Palmerston North     175.6   -40.35
7            Napier     176.9   -39.48
8         Whangarei     174.3   -35.73
9      Invercargill     168.4   -46.43
10           Nelson     173.2   -41.29
11         Gisborne     178.0   -38.66
12         Blenheim     173.9   -41.52
13         Richmond     173.2   -41.33
14        Whakatane     177.0   -37.96
15        Greymouth     171.2   -42.47
16        Stratford     174.3   -39.34


Nous observons que les coordonnées sont en format longitude/latitude.

Utiliser la fonction st_as_sf() pour transformer cette table de coordonnées en données vectorielles de type points. Puisque les coordonnées sont en format longitude/latitude, nous ne pouvons pas assigner un système de coordonnées projetées cartésien. Utilisons simplement le datum WGS 84 pour définir le SCR. Ce dernier est associé au code EPSG 4326.

nz_capitales_points <- st_as_sf(x = nz_capitales, 
                        coords = c("Longitude", "Latitude"),
                        crs = 4126)


Utiliser la fonction mapview() pour visualiser les polygones des régions et les points correspondants aux capitales de ces régions.

mapview(nz, col.regions = "blue", legend = FALSE) + mapview(nz_capitales_points)


Notez que nous n’avons pas besoin de nous assurer que les deux couches soient dans le même SCR puisque la fonction mapview() représente par défaut toutes données spatiales dans la projection Mercator Web.