Académique Documents
Professionnel Documents
Culture Documents
Avant-propos
Apparu au milieu des annes quatre-vingt-dix, le logiciel R est en passe de devenir
la rfrence dans le monde des logiciels de statistiques. Cest maintenant un outil incontournable dans les laboratoires de recherche, relguant parfois au second plan des logiciels
comme SPSS, Systat, S-PLUS ou encore SAS. Certes, R est prsent comme un logiciel
danalyses statistiques et de reprsentation graphique, mais cest avant tout un langage
de programmation complet et extrmement puissant. Et cest probablement cette particularit qui lui confre sa trs grande popularit.
Ce systme open-source est distribu librement sous les termes de la licence publique
gnrale GNU. Cette licence fixe les conditions lgales de distribution des logiciels libres
et stipule entre autres que le code source doit tre accessible tous. Toute personne peut
ainsi accder la source du logiciel, la modifier selon ses propres besoins, et la redistribuer
librement (mais pas forcment gratuitement) sous les termes de cette mme licence. Ainsi,
un tel systme nest la proprit de personne (ou plutt la proprit de tous ; copyleft) et
encourage fortement la collaboration. Et cest l que rside la force de R : cest une trs
belle russite, fruit dune coopration internationale intensive o des chercheurs dhorizons
divers ont contribu amliorer cet environnement de travail, permettant R dacqurir
sa lettre de noblesse.
Le domaine des analyses spatiales a normment bnfici de ce projet collaboratif et
on dnombre actuellement plus dune centaine dextensions (packages) qui peuvent venir
complter lenvironnement de base du logiciel R. Certains packages dfinissent des classes
particulires dobjets spatiaux (sp, raster), dautres permettent de lire et dcrire des
objets spatiaux (rgdal, maptools), de manipuler le systme de coordonnes, ou encore
de raliser des statistiques spatiales (spatial, spdep, gstat, geoR). Cependant, R nest
pas un logiciel de SIG : il est trs efficace pour analyser les objets spatiaux, mais reste
limit quant leur reprsentation cartographique. Nous verrons cependant quil est tout
de mme possible de produire des cartes assez esthtiques sous R. Notons enfin quil peut
facilement communiquer avec des logiciels de SIG tels que GRASS ou Quantum GIS afin
de reprsenter les objets spatiaux de manire plus professionnelle (partie non aborde
dans ce document).
Mais, pourquoi utiliser le logiciel R pour manipuler des objets spatiaux quand des
outils trs puissants ont t dvelopps spcialement cet effet ? Son utilisation va trouver
toute sa justification lorsquune chane de traitements devra tre rpte un grand nombre
de fois (automatisation des tches), mais aussi pour raliser lensemble du flux de travail
(importation, modification de la gomtrie, analyse statistique, cartographie, exportation)
sur un mme support logiciel. De nos jours, ce besoin se fait dautant plus ressentir que
les donnes accessibles aux scientifiques sont nombreuses et complexes.
Cependant, plonger dans le monde fascinant des analyses spatiales sous R peut savrer
droutant, voire dcourageant pour le nophyte. Cest de ce besoin quest ne lide dune
formation en analyses spatiales sous R. Ce document est une synthse dun enseignement
i
donn aux membres du Groupe de recherche sur les environnements nordiques BORAS
lUniversit du Qubec Rimouski lhiver 2013. Il propose un survol des fonctionnalits
de R dans le domaine des analyses spatiales. Dans sa prsente version, lenseignement est
divis en trois chapitres. Le premier chapitre dtaille la structure des donnes spatiales
sous R (notamment sous le package sp). Au travers de ce chapitre, nous apprendrons
importer/exporter une couche spatiale sous forme vectorielle et matricielle, ainsi qu
modifier son systme de coordonnes. Dans le second chapitre, nous verrons comment modifier la gomtrie de couches vectorielles (jointure, dissolution, intersection, dcoupage,
etc.). Enfin, le dernier chapitre mettra lemphase sur la reprsentation cartographique
dobjets spatiaux sous R.
Il ne sagit en aucun cas dun cours de programmation, ni mme dun cours danalyses spatiales. Il existe de trs bons ouvrages ddis ces thmatiques. De mme, de
nombreux aspects ont volontairement t carts, car un seul ouvrage ne pourrait faire le
tour des possibilits de R dans ce domaine qui nous intresse aujourdhui. Une prochaine
version de ce document sera bientt disponible. Celle-ci se verra augmente dun chapitre
supplmentaire, intitul Statistiques spatiales et traitera plus prcisment des notions
dautocorrlation spatiale, dinterpolation spatiale et de modlisation spatiale.
Pour terminer, je tiens remercier le Groupe de recherche sur les environnements
nordiques BORAS, et plus particulirement Genevive Allard, pour mavoir offert lopportunit de donner cette formation. Merci pour le support financier et logistique. Je
remercie galement Kvin Jah Cazelles et Frdric Lesmerises, tous deux tudiants
au doctorat en biologie, pour leurs ateliers de travail sous R, dont les nombreux codes
mont fourni un bon point de dpart pour la rdaction de ce document. Merci aussi
Hedvig Nenzn pour ses conseils sur LATEX, Sweave et knitr. Merci enfin aux nombreux
programmeurs R du monde entier qui partagent leurs travaux librement sur le Net. La
connaissance doit tre libre, gratuite et accessible tous ! R, une philosophie lui seul ! ! !
Nicolas Casajus,
le 16 juin 2013
ii
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
1
2
2
6
13
18
23
23
27
29
29
31
32
33
35
36
38
.
.
.
.
.
.
.
.
.
.
.
39
39
43
43
46
47
49
50
50
53
61
64
3 Cartographie sous R
3.1 Cartographie dobjets vectoriels . . . . . . . . . . . . . . . . . . . . . . . .
3.1.1 Carte basique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.1.2 Ajout de graticules . . . . . . . . . . . . . . . . . . . . . . . . . . .
72
72
72
75
iii
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3.2
3.3
iv
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
77
80
81
83
83
85
85
87
88
89
89
90
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
13
20
21
22
25
26
32
35
37
Figure 2.1
Figure 2.2
Figure 2.3
Figure 2.4
Figure 2.5
Figure 2.6
Figure 2.7
Figure 2.8
Figure 2.9
Figure 2.10
Figure 2.11
Figure 2.12
Figure 2.13
Figure 2.14
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
47
48
50
53
54
55
58
59
60
62
64
67
70
71
Figure 3.1
Figure 3.2
Figure 3.3
Figure 3.4
Figure 3.5
Figure 3.6
Figure 3.7
Figure 3.8
Figure 3.9
Figure 3.10
Figure 3.11
Figure 3.12
Figure 3.13
Figure 3.14
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
74
75
77
78
80
81
82
83
84
86
87
89
90
91
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
vi
Chapitre 1
Les objets spatiaux sous R
1.1
1.2
Avant dimporter des objets spatiaux dj existants, nous allons nous intresser tudier la structure sous laquelle R gre les objets spatiaux. De nombreuses classes dobjets
spatiaux ont t dveloppes. Nous nous limiterons aux classes dobjets spatiaux introduites par le package sp car elles sont parmi les plus performantes. Ce package introduit
un type particulier dobjets sous R : les objets sp, qui, selon leur gomtrie, prendront
diffrentes dnominations (Table 1.1). Ainsi, un ensemble de points gorfrencs sans
table dattributs sera stock sous forme dun SpatialPoints.
Objet sp
SpatialPoints
SpatialPointsDataFrame
SpatialLines
SpatialLinesDataFrame
SpatialPolygons
SpatialPolygonsDataFrame
SpatialGrid
SpatialGridDataFrame
SpatialPixels
SpatialPixelsDataFrame
Gomtrie
Points gorfrencs sans table dattributs
Points gorfrencs avec table dattributs
Lignes gorfrences sans table dattributs
Lignes gorfrences avec table dattributs
Polygones gorfrencs sans table dattributs
Polygones gorfrencs avec table dattributs
Grille rgulire sans table dattributs
Grille rgulire avec table dattributs
Grille rgulire sans table dattributs
Grille rgulire avec table dattributs
## [1] "grd_A.txt"
1.2.1
"grd_B.txt"
"statesAUS.txt" "townsAUS.txt"
plus simple aborder. Nous allons importer sous R le fichier townsAUS.txt qui donne
la position gographique des capitales rgionales de lAustralie.
> # Importation des donnees
> (tab <- read.delim(file = paste(root, "/townsAUS.txt", sep = "")))
##
##
##
##
##
##
##
##
##
SpatialPoints:
Longitude Latitude
[1,]
138.6
-34.93
[2,]
133.9
-23.70
[3,]
153.0
-27.47
[4,]
149.1
-35.31
[5,]
147.3
-42.89
[6,]
145.0
-37.81
[7,]
115.9
-31.95
[8,]
151.2
-33.86
Coordinate Reference System (CRS) arguments: NA
La structure des donnes a chang et elles sont maintenant stockes sous forme dun
SpatialPoints. Nous voyons que plusieurs informations se rajoutent lors de laffichage de
lobjet, comme la classe de lobjet et le systme de coordonnes (Coordinate Reference
System, CRS). Nous avons mentionn prcdemment que les objets sp stockaient ces diffrentes informations sous forme de slots. Pour connatre le nom des slots, nous utiliserons
la fonction slotNames().
> # Affichage du nom des slots
> slotNames(dat)
## [1] "coords"
"bbox"
"proj4string"
[1,]
[2,]
[3,]
[4,]
[5,]
[6,]
[7,]
[8,]
Longitude Latitude
138.6
-34.93
133.9
-23.70
153.0
-27.47
149.1
-35.31
147.3
-42.89
145.0
-37.81
115.9
-31.95
151.2
-33.86
> coordinates(dat)
##
##
##
##
##
##
##
##
##
[1,]
[2,]
[3,]
[4,]
[5,]
[6,]
[7,]
[8,]
Longitude Latitude
138.6
-34.93
133.9
-23.70
153.0
-27.47
149.1
-35.31
147.3
-42.89
145.0
-37.81
115.9
-31.95
151.2
-33.86
4
Affichons ensuite ltendue spatiale dfinie par notre objet. Dans ce cas, la fonction
associe ce slot est bbox().
> # Affichage de l'etendue spatiale
> dat@bbox
##
min
max
## Longitude 115.86 153.0
## Latitude -42.89 -23.7
> bbox(dat)
##
min
max
## Longitude 115.86 153.0
## Latitude -42.89 -23.7
Pour terminer, affichons le systme de coordonnes contenu dans le slot @proj4string.
La fonction proj4string() permet galement daccder cette information.
> # Affichage du systeme de coordonnees
> dat@proj4string
## CRS arguments: NA
> proj4string(dat)
## [1] NA
Ce dernier slot retourne la valeur NA : notre objet spatial nest dfini par aucun systme
de coordonnes. Nous verrons plus loin comment en dfinir un.
Nous allons maintenant convertir notre data.frame initial en un objet spatial ponctuel
possdant une table dattributs : un SpatialPointsDataFrame (Table 1.1). Pour cela,
nous allons utiliser la fonction du mme nom dans laquelle nous allons spcifier la table
dattributs avec largument data .
> # Conversion en objet spatial ponctuel avec une table d'attributs
> (dat <- SpatialPointsDataFrame(coords = tab[, 2:3], data = tab[,
+
c(1, 4, 5)]))
##
##
##
##
##
##
##
##
##
1
2
3
4
5
6
7
8
coordinates
Ville Population Etat
(138.6, -34.93)
Adelaide
1187466
AM
(133.877, -23.7022) Alice Springs
27481
TN
(153.033, -27.4667)
Brisbane
2043185
QL
(149.124, -35.3083)
Canberra
323056 TCA
(147.331, -42.8858)
Hobart
202138
TA
(144.968, -37.8142)
Melbourne
4009400
VI
(115.86, -31.95)
Perth
1658992
AO
(151.192, -33.8561)
Sydney
4490662 NGS
5
"coords"
"bbox"
1
2
3
4
5
6
7
8
La structure des objets spatiaux ponctuels sous R nest pas plus complique que a.
Remarquons quelle nest pas sans rappeler lorganisation dun shapefile ESRI compos
de plusieurs fichiers : le fichier .dbf (contenant la table dattributs), le fichier .prj
(contenant le systme de coordonnes), le fichier .shp (contenant la gomtrie), etc.
1.2.2
Cration de polygones
Compliquons un peu les choses et regardons comment crer des polygones gorfrencs. Mme si la logique est la mme que pour les objets spatiaux ponctuels (sparation
des diffrentes informations en slots), la cration de polygones spatiaux est plus complexe
et seffectuera en plusieurs tapes successives :
6
Regardons cela dans le dtail. Lobjectif ici est de crer un objet spatial compos de
trois polygones : le premier sera compos dun seul polygone, le second sera form dun
polygone avec un trou lintrieur, et le dernier sera compos de deux polygones.
Procdons pas pas et crons tout dabord cinq sries de coordonnes qui vont dfinir
les sommets de cinq polygones (une srie pour le premier polygone, deux sries pour
le second, dont une dfinira le positionnement du trou, et deux sries pour le dernier
polygone form de deux polygones).
>
>
+
>
+
>
##
##
##
##
##
##
##
##
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
x1
439519
433092
455774
476566
476944
459554
439519
y1
8045280
8031293
8018439
8026756
8044902
8054731
8045280
p2
p3
p4
p5
<<<<-
Polygon(coords
Polygon(coords
Polygon(coords
Polygon(coords
=
=
=
=
c2,
c3,
c4,
c5,
hole
hole
hole
hole
=
=
=
=
F)
T)
F)
F)
Largument hole indique si le polygone servira dfinir le trou dun autre polygone
(T) ou non (F). La structure des sries de coordonnes se prsente maintenant sous forme
dun Polygon possdant plusieurs slots. Affichons le nom de ces slots.
> # Affichage du nom des slots de p1
> slotNames(p1)
## [1] "labpt"
"area"
"hole"
"ringDir" "coords"
Cinq slots ont t crs. Dcrivons ceux qui nous serons utiles par la suite :
le slot @labpt donne les coordonnes du centre du polygone ;
le slot @hole indique si le polygone servira dfinir le trou dun autre ;
8
[1,]
[2,]
[3,]
[4,]
[5,]
[6,]
[7,]
x1
439519
459554
476944
476566
455774
433092
439519
y1
8045280
8054731
8044902
8026756
8018439
8031293
8045280
Dtaillons ces trois lignes de code : le premier polygone multiple P1 est form du
polygone simple p1, le polygone multiple P2 regroupe les polygones simples p2 et p3
(avec p3 dlimitant un espace vide lintrieur de p2 ) et le polygone multiple P3 est
compos des deux polygones simples p4 et p5.
Affichons le nom des slots du polygone P2.
> # Affichage du nom des slots de P2
> slotNames(P2)
## [1] "Polygons"
"plotOrder" "labpt"
"ID"
"area"
L encore, cinq slots ont t crs. Les deux qui vont nous intresser sont @Polygons
et @ID. Ce dernier contient lidentifiant (unique) du polygone multiple.
> # Affichage l'identifiant d'un objet de type Polygons
> P2@ID
## [1] "PolygB"
Intressons-nous plus prcisment au slot @Polygons.
9
"area"
"hole"
"ringDir" "coords"
Le slot @Polygons est une liste dobjets de type Polygon, c.--d. une liste de polygones
simples. Dans notre cas, P2 contient deux polygones simples. En affichant le nom des slots
contenu dans le premier lment (le premier polygone simple), on retrouve la structure
vue prcdemment.
Regardons comment accder aux coordonnes du premier polygone simple (p2 ) contenu
dans le second polygone multiple (P2 ).
> # Acces aux coordonnees
> P2@Polygons [[1]]@coords
##
##
##
##
##
##
[1,]
[2,]
[3,]
[4,]
[5,]
x2
444929
499793
501837
417668
444929
y2
8121306
8109039
8067465
8078029
8121306
"plotOrder"
"bbox"
"proj4string"
On retrouve ici une structure en slots que nous avons vue prcdemment avec les objets
spatiaux ponctuels. Le systme de coordonnes est stock dans @proj4string, ltendue
spatiale dans @bbox. Intressons-nous plus prcisment au slot @polygons.
> # Classe du slot polygons
> class(SP@polygons )
## [1] "list"
> # Nombre d'elements contenus dans cette liste
> length(SP@polygons )
## [1] 3
> # Classe du premier element
> class(SP@polygons [[1]])
## [1] "Polygons"
## attr(,"package")
## [1] "sp"
> # Nom de ses slots
> slotNames(SP@polygons [[1]])
## [1] "Polygons"
"plotOrder" "labpt"
"ID"
"area"
[1,]
[2,]
[3,]
[4,]
[5,]
x2
444929
499793
501837
417668
444929
y2
8121306
8109039
8067465
8078029
8121306
11
##
Info Value Frequence
## 1 Simple
342
0.34
## 2
Hole
123
0.12
## 3 Double
546
0.54
Remarque importante : il est ncessaire que les noms des lignes de la table dattributs correspondent aux identifiants des polygones multiples dans lobjet spatial. De
plus, lordre des lignes doit galement correspondre lordre des polygones multiples.
Renommons donc les lignes de la table :
> # Attribution d'un nom aux lignes de la table
> rownames(mat) <- c("PolygA", "PolygB", "PolygC")
> mat
##
Info Value Frequence
## PolygA Simple
342
0.34
## PolygB
Hole
123
0.12
## PolygC Double
546
0.54
Finalement, ajoutons cette table dans lobjet sp afin de crer, en accord avec la Table
1.1, un SpatialPolygonsDataFrame.
> # Rajout d'une table d'attributs
> SPDF <- SpatialPolygonsDataFrame(Sr = SP, data = mat)
Affichons le nom des slots afin dy voir plus clair.
> # Nom des slots du polygone spatial avec table d'attributs
> slotNames(SPDF)
## [1] "data"
"polygons"
## [5] "proj4string"
"plotOrder"
"bbox"
12
1.2.3
Cration de lignes
La structure dobjets spatiaux de type polyligne suit la mme philosophie que celle des
polygones. Leur cration seffectuera en plusieurs tapes :
Conversion des coordonnes en ligne simple ;
Cration de ligne multiple ;
Cration dune ligne spatiale ;
Rajout dune table dattributs.
Regardons cela dans le dtail en construisant deux lignes, dont une sera forme de
deux segments. Dfinissons les coordonnes de ces segments.
13
>
>
>
>
##
##
##
##
##
>
>
>
>
>
>
>
>
1
2
3
4
x1
439519
433092
455774
476566
y1
8045280
8031293
8018439
8026756
14
[[2]]
An object of class "Line"
Slot "coords":
x3
y3
[1,] 450193 8120872
[2,] 430905 8082746
[3,] 493702 8074223
[4,] 493029 8109210
Slot "ID":
[1] "LineB"
La premire ligne multiple L1 est forme dun seul segment (l1 ), alors que la seconde,
L2, est compose de deux segments : l2 et l3.
Affichons le nom des slots de la ligne multiple L2.
> # Nom des slots
> slotNames(L2)
## [1] "Lines" "ID"
Les objets de type Lines sont composs de deux slots : @Lines et @ID. Bien que leur
structure ressemble celle des Polygons, leur contenu est simplifi.
15
[1,]
[2,]
[3,]
[4,]
x2
444929
417668
501837
499793
y2
8121306
8078029
8067465
8109039
"bbox"
"proj4string"
16
On retrouve ici une structure en slots qui commence nous tre familire. Ltendue
spatiale de notre objet est stocke dans le slot @bbox et le systme de coordonnes dans
lequel il est dfini se trouve dans @proj4string. Regardons de plus prs le slot @lines.
> # Classe du slot lines
> class(SL@lines )
## [1] "list"
> # Nombre d'elements contenus dans cette liste
> length(SL@lines )
## [1] 2
> # Classe du premier element
> class(SL@lines [[1]])
## [1] "Lines"
## attr(,"package")
## [1] "sp"
> # Nom de ses slots
> slotNames(SL@lines [[1]])
## [1] "Lines" "ID"
Ainsi, pour accder aux coordonnes du premier segment de la seconde ligne multiple,
nous procderons de la manire suivante :
> SL@lines [[2]]@Lines [[1]]@coords
##
##
##
##
##
[1,]
[2,]
[3,]
[4,]
x2
444929
417668
501837
499793
y2
8121306
8078029
8067465
8109039
"lines"
"bbox"
"proj4string"
La structure na pas chang par rapport au SpatialLines, mise part laddition dun
nouveau slot : @data qui contient maintenant la table dattributs. Affichons cette table :
> # Acces a la table d'attributs
> SLDF@data
##
Info Value Frequence
## LineA Enil1
342
0.74
## LineB Enil2
123
0.26
1.2.4
Cration de grilles
Les trois classes dobjet sp que nous venons de voir (points, polylignes et polygones)
sont des objets vectoriels, c.--d. des objets composs dlments gomtriques individuels.
Chacun de ces lments possde des caractristiques propres qui doivent tre stockes.
Nous allons voir maintenant comment crer des objets matriciels (plus connus sous le
nom de raster), c.--d. des grilles composes de cellules rgulirement espaces. Deux
approches peuvent tre employes pour crer ce genre dobjets : par pixellisation dobjets
ponctuels ou en gnrant une grille partir dune information de base (origine, rsolution
et nombre de cellules).
Pixellisation dobjets ponctuels
Imaginons que nous ayons une srie de points gorfrencs rgulirement rpartis
dans lespace et dfinissant le centre de cellules. Lide est de convertir ces points en un
ensemble de pixels formant une grille matricielle. Pour ce faire, nous allons utiliser la
fonction SpatialPixels() du package sp (Table 1.1).
Regardons cela de plus prs, et importons tout dabord un fichier donnant les coordonnes dun ensemble de points.
18
>
>
>
>
##
##
##
##
##
##
##
1
2
3
4
5
6
x
112.5
113.5
114.5
115.5
116.5
117.5
y
-43.5
-43.5
-43.5
-43.5
-43.5
-43.5
Avant dutiliser la fonction cite ci-dessus, nous devons convertir ces points en un objet
spatial ponctuel.
>
>
>
>
>
>
# Conversion en SpatialPoints
pts <- SpatialPoints(coords = pts)
# Conversion en SpatialPixels
SPx <- SpatialPixels(points = pts)
# Classe de l'objet cree
class(SPx)
## [1] "SpatialPixels"
## attr(,"package")
## [1] "sp"
Regardons comment se structure cet objet.
> # Nom des slots
> slotNames(SPx)
## [1] "grid"
"grid.index"
## [5] "proj4string"
"coords"
"bbox"
Ici, on retrouve des slots que nous avons dj vus : @coords, @bbox et @proj4string.
Cependant, on remarque lapparition de deux nouveaux lments, spcifiques aux objets
sp de type SpatialPixels et SpatialGrid (que nous verrons plus tard).
Le slot @grid.index donne lidentifiant des diffrentes cellules cres. Intressons-nous
maintenant au dernier slot : @grid.
> # Affichage du slot 'grid'
> SPx@grid
##
x
y
## cellcentre.offset 112.5 -43.5
## cellsize
1.0
1.0
## cells.dim
43.0 38.0
19
Pour illustrer cet aspect, importons un nouveau jeu de donnes, lequel contient un
chantillon des points prcdents et pixellisons-les.
>
>
>
>
>
>
21
# Creation de la grille
grd <- SpatialGrid(grd)
# Nom des slots
slotNames(grd)
## [1] "grid"
"bbox"
"proj4string"
On remarque que la structure de lobjet est la mme que prcdemment, sauf que
les slots relatifs aux coordonnes des cellules ont disparu : cest un avantage de travailler avec les SpatialGrid : linformation stocke est minimale, ce qui peut tre intressant dans le cas de fichiers volumineux. De la mme manire, il est possible de
rajouter une table dattributs cet objet matriciel ; pour ce faire, on utilisera la fonction
SpatialGridDataFrame().
> par(mar = c(0, 0, 0, 0))
> # Representation de la grille
> plot(grd)
22
1.3
Nous venons de voir comment crer des objets spatiaux de type vectoriel et matriciel
sous R laide du package sp. Ceci nous a permis dtudier leur structure et la faon
daccder aux diffrentes informations quils contiennent (coordonnes, table dattributs,
systme de coordonnes, etc.). Cependant, dans la plupart des cas, nous nous contenterons
de manipuler des objets spatiaux dj existants.
Plusieurs packages permettent de lire et dcrire des objets vectoriels et/ou matriciels.
Le package maptools p. ex., permet de lire des fichiers de type vectoriel (avec la fonction
readShapeSpatial()) ainsi que des rasters (fonction readAsciiGrid()). Cependant, il
prsente linconvnient majeur de ne pas pouvoir lire le fichier dcrivant le systme de
coordonnes (fichier .prj dun shapefile ESRI). De plus, il ne supporte que peu de
formats matriciels (p. ex. ESRI Arc ASCII Grid).
Heureusement, une solution a t apporte : le package rgdal, dvelopp entre autres
par Roger Bivand, le crateur du package sp, et grand contributeur aux analyses spatiales
sous R. Le package rgdal communique avec la bibliothque libre GDAL (Geospatial Data
Abstraction Library) qui permet de lire et de manipuler un trs grand nombre de formats
matriciels (GeoTIFF, ASCII Grid, etc.) au moyen de diffrents langages de programmation, dont le langage R. Sa sous-bibliothque OGR (OpenGIS Simple Features Reference
Implementation) permet quant elle la manipulation de nombreux formats vectoriels
(ESRI Shapefile, MapInfo, KML, etc.). Les fonctions gdalDrivers() et ogrDrivers()
permettent de connatre respectivement les formats de donnes matricielles et vectorielles
supports. Sans plus attendre, explorons les possibilits de ce package.
1.3.1
Couches vectorielles
Nous allons tout dabord voir comment manipuler des donnes vectorielles. Pour cela,
nous allons tlcharger des donnes fournissant les limites administratives de lAustralie
sous un format ESRI Shapefile . Le site Global Administrative Area (http://gadm.org)
met la disposition du public des donnes SIG en libre tlchargement.
Tlchargeons ces donnes vectorielles laide de R. Crons tout dabord un rpertoire
Australia dans notre rpertoire de travail actuel qui recueillera les donnes tlcharges.
>
>
>
>
## [1] "Australia"
## [5] "townsAUS.txt"
"grd_A.txt"
"grd_B.txt"
"statesAUS.txt"
# Lien du telechargement
link <- "http://gadm.org/data/shp/AUS_adm.zip"
# Destination du fichier sur le disque
dest <- paste(root, "/Australia/AUS_adm.zip", sep = "")
# Telechargement
download.file(url = link, destfile = dest, method = "internal")
23
> # Verification
> dir(paste(root, "/Australia", sep = ""))
## [1] "AUS_adm.zip"
Les donnes tlcharges sont stockes sous forme dune archive ZIP. La commande R
unzip() permet de dcompresser les fichiers contenus une archive ZIP. Voyons cela.
>
>
>
>
##
##
##
##
##
##
##
[1]
[4]
[7]
[10]
[13]
[16]
[19]
"AUS_adm.zip"
"AUS_adm0.sbn"
"AUS_adm0.shx"
"AUS_adm1.sbn"
"AUS_adm1.shx"
"AUS_adm2.sbn"
"AUS_adm2.shx"
"AUS_adm0.dbf"
"AUS_adm0.sbx"
"AUS_adm1.dbf"
"AUS_adm1.sbx"
"AUS_adm2.dbf"
"AUS_adm2.sbx"
"AUS_readme.txt"
"AUS_adm0.prj"
"AUS_adm0.shp"
"AUS_adm1.prj"
"AUS_adm1.shp"
"AUS_adm2.prj"
"AUS_adm2.shp"
Il ne nous reste plus qu charger le package rgdal dans notre session de travail.
> # Chargement du package 'rgdal'
> library(rgdal)
## [1] "SpatialPolygonsDataFrame"
## attr(,"package")
## [1] "sp"
> # Nom des slots de aus1
> slotNames(aus1)
## [1] "data"
"polygons"
## [5] "proj4string"
"plotOrder"
"bbox"
Ce shapefile est donc structur sous forme de polygones spatiaux possdant une table
dattributs (Section 1.2.2). Reprsentons graphiquement lobjet vectoriel AUS_adm1 .
> # Representation cartographique
> par(mar = c(0, 0, 0, 0))
> plot(aus1, col = "gray")
>
>
>
>
# Representation cartographique
par(mar = c(0, 0, 0, 0))
plot(aus1)
plot(Ql, col = "gray", add = T)
[1]
[4]
[7]
[10]
[13]
[16]
[19]
[22]
"AUS_adm.zip"
"AUS_adm0.sbn"
"AUS_adm0.shx"
"AUS_adm1.sbn"
"AUS_adm1.shx"
"AUS_adm2.sbn"
"AUS_adm2.shx"
"Queensland.prj"
"AUS_adm0.dbf"
"AUS_adm0.sbx"
"AUS_adm1.dbf"
"AUS_adm1.sbx"
"AUS_adm2.dbf"
"AUS_adm2.sbx"
"AUS_readme.txt"
"Queensland.shp"
"AUS_adm0.prj"
"AUS_adm0.shp"
"AUS_adm1.prj"
"AUS_adm1.shp"
"AUS_adm2.prj"
"AUS_adm2.shp"
"Queensland.dbf"
"Queensland.shx"
Notre objet a t export sous le format ESRI shapefile en quatre fichiers ( .shp ,
.dbf , .prj et .shx ). Ce fichier sera directement lisible sous nimporte quel logiciel
de SIG.
1.3.2
Couches matricielles
# Lien du telechargement
link <- "http://www.diva-gis.org/data/alt/AUS_alt.zip"
# Destination du fichier sur le disque
dest <- paste(root, "/Australia/AUS_alt.zip", sep = "")
# Telechargement
download.file(url = link, destfile = dest, method = "internal")
Dcompressons les fichiers contenus dans cette archive ZIP.
27
"grid"
"bbox"
"proj4string"
Nous nen dirons pas plus sur les rasters, car la dernire section de ce chapitre leur
sera consacre : nous verrons notamment une alternative lutilisation des packages sp
et rgdal.
Exportation dune couche matricielle
Pour terminer, regardons comment exporter ce raster au format GeoTIFF avec
le package rgdal. Nous allons utiliser la fonction writeGDAL() qui reoit les arguments
suivants :
dataset correspond au nom du raster sous R ;
fname correspond au nom dexportation avec extension ;
drivername correspond au format dexportation de lobjet matriciel (on peut utiliser la commande gdalDrivers() pour connaitre les formats disponibles).
>
>
>
>
# Fichier de destination
dest <- paste(root, "/Australia/ras_alt.tif", sep = "")
# Exportation du raster
writeGDAL(dataset = ras, fname = dest, drivername = "GTiff")
Ce fichier est directement accessible par nimporte quel logiciel de SIG supportant le
format GeoTIFF .
28
1.4
Le systme de coordonnes
Le propre des objets gographiques est de pouvoir tre reprsents dans lespace. Pour
cela, ils doivent tre dfinis dans un rfrentiel spatial, c.--d. un systme de coordonnes.
On distinguera la reprsentation en coordonnes gographiques (longitude et latitude) de
la reprsentation en coordonnes projetes (reprsentation cartographique plane).
Nous avons dj mentionn que la lecture de donnes gographiques avec le package
rgdal permettait la fois dimporter la gomtrie de ces objets, mais aussi leur rfrentiel
spatial, c.--d. le systme de coordonnes dans lequel ils sont dfinis. Pour interprter
le rfrentiel gographique, ce package se base sur la bibliothque PROJ.4. Cest une
bibliothque libre qui permet la conversion de nombreux systmes de coordonnes, le tout
en dfinissant un standard dcriture.
Dans cette section, nous allons voir comment dfinir le systme de coordonnes dobjets
vectoriels et matriciels (structurs dans le format sp), ainsi que la manire de le projeter
sous diffrentes reprsentations en coordonnes projetes.
1.4.1
Les donnes spatiales, formates sous le package sp, contiennent le systme de coordonnes dans le slot @proj4string. Regardons ce que contient cet lment pour le shapefile
aus1 .
> # Systeme de projection de 'aus1'
> aus1@proj4string
## CRS arguments:
## +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84
## +towgs84=0,0,0
Le systme de coordonnes se prsente sous forme dun objet CRS (Coordinate Reference System) dont les arguments sont crits au format PROJ.4. Que nous dit cet lment ?
Que cet objet spatial est dfini dans un rfrentiel de coordonnes gographiques, c.--d.
non projet (argument +proj ) sous le datum et lellipsode WGS84.
Dans ce cas l, le systme de coordonnes est dj identifi. Comment dfinir le rfrentiel spatial dun objet ? Illustrons cela en dfinissant le systme de coordonnes des
capitales australiennes que nous avons importes au tout dbut.
> # Rappel de la structure des donnees
> class(dat)
## [1] "SpatialPointsDataFrame"
## attr(,"package")
## [1] "sp"
> # Systeme de coordonnees
> dat@proj4string
## CRS arguments: NA
29
>
>
>
>
>
>
## CRS arguments:
## +proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0
Maintenant, la question qui se pose tout naturellement, cest comment crire un systme de coordonnes dans le standard PROJ.4 ? Dans le monde de la gographie, il existe
plusieurs standards dcriture dun systme de coordonnes. Voici les trois principaux :
le PROJ.4, dont nous avons dj parl ;
le WKT (Well-Known Text) est un format standardis utilis par de nombreux
logiciels servant dfinir le systme de coordonnes dobjets vectoriels (fichier .prj
dun ESRI Shapefile) ;
le EPSG (European Petroleum Survey Group) est un systme de codage qui attribue
un code chaque systme de coordonnes.
La fonction make_EPSG() du package rgdal permet de lister un peu plus de 3700
systmes de coordonnes sous le format PROJ.4 et le code EPSG correspondant.
>
>
>
>
##
code
note
prj4
## 2 3821
# TWD67 +proj=longlat +ellps=aust_SA +no_defs
## 5 3906 # MGI 1901 +proj=longlat +ellps=bessel +no_defs
Nous allons introduire une fonction qui va nous tre utile pour parcourir cette liste :
la fonction grep(). Celle-ci permet de chercher une expression dans un vecteur. Par
exemple, imaginons que nous cherchons crire un systme de coordonnes pour lequel
nous connaissons le code EPSG. Nous pouvons utiliser cette fonction pour chercher la
ligne de la table prjs laquelle se rencontre ce code.
Cherchons lcriture du systme de coordonnes gographiques sous lellipsode WGS84
(celui dfinissant le rfrentiel spatial de nos prcdents objets) partir de son code EPSG :
4326.
> # Recherche dans la colonne 'code' (EPSG)
> (pos <- grep(4326, prjs[, "code"]))
## [1] 249
> # Extraction de l'ecriture PROJ.4
> CRS(prjs[pos, "prj4"])
## CRS arguments:
## +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs
## +towgs84=0,0,0
30
Pour connatre le code EPSG dun systme de coordonnes particulier, le site suivant
http://prj2epsg.org permet de convertir lcriture WKT en code EPSG. Notons galement que le site http://spatialreference.org donne la correspondance entre plusieurs
formats dcriture de systmes de coordonnes.
Finalement, au lieu de recopier lcriture en PROJ.4 pour dfinir le systme de coordonnes dun objet sous R, on pourra directement utiliser le code EPSG. Voici comment
procder :
>
>
>
>
## CRS arguments:
## +init=epsg:4326 +proj=longlat +ellps=WGS84 +datum=WGS84
## +no_defs +towgs84=0,0,0
1.4.2
Nous allons voir maintenant comment projeter un systme de coordonnes gographiques en une reprsentation cartographique plane. Nous allons projeter le systme de
coordonnes du shapefile de lAustralie et des capitales australiennes (systme de coordonnes gographiques en WGS 1984) dans le systme de projection Lambert Azimuthal
Equal Area . Ce systme de projection correspond au code EPSG 3035. La fonction R
utilise sera spTransform().
>
>
>
>
## CRS arguments:
## +init=epsg:3035 +proj=laea +lat_0=52 +lon_0=10 +x_0=4321000
## +y_0=3210000 +ellps=GRS80 +units=m +no_defs
> # Projection de l'objet 'dat'
> datp <- spTransform(x = dat, CRSobj = CRS("+init=epsg:3035"))
Pour terminer cette section, reprsentons lAustralie dans le systme de coordonnes
projetes.
>
>
>
>
# Representation cartographique
par(mar = c(0, 0, 0, 0))
plot(aus1p)
plot(datp, pch = 19, add = T)
31
1.5
Prcdemment, nous avons vu que le package rgdal permettait dimporter et dexporter des donnes matricielles sous diffrents formats. Une fois importes, ces donnes
sont stockes dans R sous le format SpatialGridDataFrame (package sp). Nous allons
maintenant introduire un autre package qui offre de nombreux outils pour manipuler les
couches matricielles : le package raster. Voici les principales possibilits offertes par ce
package :
Cration, importation et exportation de couches matricielles ;
Conversion en objets sp ;
Modification de ltendue et de la rsolution spatiale ;
Interpolation et prdiction ;
Calcul de diffrentes mtriques ;
Reprsentation cartographique.
Ce package prsente la particularit de ne pas stocker dans la mmoire de R les valeurs
dun raster lors de son importation : elles ne seront lues que lorsque cela sera ncessaire
(analyse, rsum statistique, cartographie). Ceci prsente lavantage de pouvoir manipuler
des objets matriciels de trs grandes dimensions sans toutefois saturer la mmoire du
logiciel.
Approfondissons certaines fonctionnalits de ce package. Tout dabord, chargeons-le
dans la session de travail.
32
1.5.1
Nous allons importer les donnes matricielles contenues dans le raster AUS_alt
grce la fonction raster(). Remarque : cette fonction nous servira galement crer un
objet matriciel sous R (voir ci-aprs).
>
>
>
>
## [1] "RasterLayer"
## attr(,"package")
## [1] "raster"
> # Nom des elements qu'il contient
> slotNames(ras)
## [1] "file"
## [6] "extent"
## [11] "crs"
## [16] "unit"
"data"
"legend"
"rotated"
"rotation"
"layernames" "z"
"history"
"ncols"
"zname"
"title"
"nrows"
"zvalue"
Une fois import, lobjet matriciel est stock sous forme dun RasterLayer, c.--d. un
raster une couche de donnes. Le package raster permet de crer des rasters plusieurs
couches dinformation (collection de rasters de mmes dimensions et rsolution) : les objets
crs seront stocks sous forme de RasterStack ou RasterBrick.
Cet objet contient plusieurs informations rparties en diffrents slots. Pour y accder,
on aura recours loprateur @ ou aux fonctions associes ces slots. Regardons comment
accder certaines dentre elles.
> # Dimensions du raster
> ncol(ras)
## [1] 5568
> nrow(ras)
## [1] 5496
> # Nombre de cellules
> ncell(ras)
## [1] 30601728
33
class
xmin
xmax
ymin
ymax
:
:
:
:
:
Extent
112.8
159.2
-54.9
-9.1
Maintenant, nous allons voir comment accder aux valeurs contenues dans cet objet
matriciel. Pour ce faire, nous devons tablir une connexion avec le fichier source et utiliser
la commande getValues().
>
>
>
>
## [1] 278
> min(na.omit(val))
## [1] -43
> max(na.omit(val))
## [1] 3492
> sd(na.omit(val))
## [1] 198.4
Pour terminer, reprsentons une carte de laltitude de lAustralie.
> # Representation cartographique
> par(mar = c(0, 0, 0, 0))
> plot(ras)
34
1.5.2
Systme de coordonnes
Le package raster se base aussi sur la librairie libre PROJ.4 pour manipuler le systme de coordonnes des objets matriciels. La seule diffrence par rapport aux objets sp
rside simplement dans les fonctions utilises. Regardons comment dfinir le systme de
coordonnes dun raster au format RasterLayer.
> # Acces au systeme de coordonnees de 'ras'
> projection(ras)
## [1] "+proj=longlat +ellps=WGS84"
>
>
>
>
>
>
>
>
# Reinitialisation du systeme
projection(ras) <- CRS(as.character(NA))
# Definition du systeme
prj <- CRS("+proj=longlat +datum=WGS84 +ellps=WGS84")
# Attribution du systeme au raster
projection(ras) <- prj
# Verification
projection(ras)
35
1.5.3
La fonction raster() avec laquelle nous avons import les donnes matricielles dcrivant laltitude de lAustralie va galement nous servir crer des rasters sous R dans le
format RasterLayer. Tout comme dans la section 1.2.4, nous allons voir deux approches
pour crer des rasters : une construction de grille partir dinformation minimale (from
scratch) ou partir de ltendue spatiale dun autre raster.
Gnration automatique dun raster
Tout comme la construction dun objet SpatialGrid, nous allons crer un raster en
spcifiant les dimensions de la grille et les coordonnes des cellules extrmes. Regardons
cela en attribuant le systme de coordonnes gographiques du raster ras .
> # Creation d'un raster
> ras0 <- raster(nrows = 180, ncols = 360, xmn = -180, xmx = 180,
+
ymn = -90, ymx = 90, crs = projection(ras))
Affichons les caractristiques principales de notre nouveau raster.
> # Caracteristiques du raster
> projection(ras0)
## [1] "+proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0"
> ncell(ras0)
## [1] 64800
> extent(ras0)
##
##
##
##
##
class
xmin
xmax
ymin
ymax
:
:
:
:
:
Extent
-180
180
-90
90
> res(ras0)
## [1] 1 1
On remarque que la rsolution spatiale de notre nouveau raster est dtermine automatiquement partir des dimensions de la grille et des coordonnes extrmes. Rajoutons
36
maintenant des valeurs notre objet matriciel : nous allons chantillonner alatoirement
64800 valeurs (nombre de cellules de la grille) parmi des nombres allant de 1 100.
>
>
>
>
>
>
>
>
# Representation cartographique
par(mar = c(0, 0, 0, 0))
plot(ras0)
plot(aus1, add = T)
37
>
>
>
>
>
>
>
>
1.5.4
Le package raster sappuie sur son homologue, le package rgdal pour lire et crire
des donnes matricielles. Ainsi, il permet dexporter des objets matriciels sous diffrents
formats. La fonction writeFormats() permet de connaitre ces diffrents formats.
> # Liste des formats de raster disponibles en ecriture
> head(writeFormats())
##
##
##
##
##
##
##
[1,]
[2,]
[3,]
[4,]
[5,]
[6,]
name
"raster"
"SAGA"
"IDRISI"
"BIL"
"BSQ"
"BIP"
long_name
"R-raster"
"SAGA GIS"
"IDRISI"
"Band by Line"
"Band Sequential"
"Band by Pixel"
38
Chapitre 2
Modification des gomtries
2.1
Dans le premier chapitre, nous avons vu que les donnes gographiques taient stockes
sous forme dobjets sp, lesquels rpartissent les diffrentes informations (coordonnes gographiques, systme de coordonnes, tendue spatiale, table dattributs, etc.) dans des
slots distincts. La table dattributs dobjets vectoriels est contenue dans le slot @data et
se prsente sous la forme dun data.frame. Ainsi, il sera trs facile de manipuler cette
table dattributs des fins diverses : accs certaines valeurs de la table, modification de
valeurs, rajout et suppression de champs, ou encore rorganisation de la table.
Suppression de champs
Regardons tout dabord comment supprimer certaines colonnes de la table dattributs
de lobjet vectoriel aus1 .
> # Suppression de certains champs
> (aus1@data <- aus1@data [, -c(1, 2, 6, 7, 9:16)])
##
##
##
##
##
##
##
##
##
##
##
##
0
1
2
3
4
5
6
7
8
9
10
NAME_0 ID_1
NAME_1 HASC_1
Australia 151 Ashmore and Cartier Islands AU.AS
Australia 152 Australian Capital Territory AU.CT
Australia 153
Coral Sea Islands AU.CR
Australia 154
New South Wales AU.NS
Australia 155
Northern Territory AU.NT
Australia 156
Queensland AU.QL
Australia 157
South Australia AU.SA
Australia 158
Tasmania AU.TS
Australia 159
Unknown1 AU.TS
Australia 160
Victoria AU.VI
Australia 161
Western Australia AU.WA
Loprateur - permet de supprimer certaines colonnes dun data.frame. Nous aurions galement pu slectionner les colonnes que nous souhaitions conserver. Nous allons
maintenant renommer le nom des colonnes conserves.
39
0
1
2
3
4
5
Pays
Australia
Australia
Australia
Australia
Australia
Australia
ID
Etat
151 Ashmore and Cartier Islands
152 Australian Capital Territory
153
Coral Sea Islands
154
New South Wales
155
Northern Territory
156
Queensland
Code
AU.AS
AU.CT
AU.CR
AU.NS
AU.NT
AU.QL
Modification de valeurs
Nous allons maintenant voir comment modifier certaines valeurs de la table. Modifions
le contenu de la dernire colonne afin de ne conserver que labrviation des tats (sans
labrviation du pays).
> # Modification de la dernire colonne
> aus1@data [, "Code"] <- substr(aus1@data [, "Code"], 4, 5)
> aus1@data
##
##
##
##
##
##
##
##
##
##
##
##
Pays
0 Australia
1 Australia
2 Australia
3 Australia
4 Australia
5 Australia
6 Australia
7 Australia
8 Australia
9 Australia
10 Australia
ID
Etat Code
151 Ashmore and Cartier Islands
AS
152 Australian Capital Territory
CT
153
Coral Sea Islands
CR
154
New South Wales
NS
155
Northern Territory
NT
156
Queensland
QL
157
South Australia
SA
158
Tasmania
TS
159
Unknown1
TS
160
Victoria
VI
161
Western Australia
WA
Cet objet vectoriel comporte une srie de polygones dont les informations contenues
dans la table dattributs sont inconnues : il sagit du polygone multiple 8. Nous allons
donc remplacer les valeurs des deux dernires colonnes par la valeur NA. Mais avant, nous
devons convertir le type de la colonne Etat en une chane de caractres (actuellement,
cette colonne est stocke sous forme dun facteur).
>
>
>
>
>
>
>
# Conversion du type
aus1@data [, "Etat"] <- as.character(aus1@data [, "Etat"])
# Modification des valeurs
aus1@data [9, "Etat"] <- NA
aus1@data [9, "Code"] <- NA
# Verification
aus1@data
40
##
##
##
##
##
##
##
##
##
##
##
##
Pays
0 Australia
1 Australia
2 Australia
3 Australia
4 Australia
5 Australia
6 Australia
7 Australia
8 Australia
9 Australia
10 Australia
ID
Etat Code
151 Ashmore and Cartier Islands
AS
152 Australian Capital Territory
CT
153
Coral Sea Islands
CR
154
New South Wales
NS
155
Northern Territory
NT
156
Queensland
QL
157
South Australia
SA
158
Tasmania
TS
159
<NA> <NA>
160
Victoria
VI
161
Western Australia
WA
Ajout de champs
Regardons comment rajouter une colonne dans cette table dattributs. Les data.frame
sont des objets R qui prsentent lavantage de pouvoir crer, ajouter et calculer une colonne
en une seule tape. Pour ce faire, nous aurons recours loprateur $. Rajoutons donc
une colonne qui donne la population de chaque tat/territoire australien.
>
>
+
>
>
##
##
##
##
##
##
##
0
1
2
3
4
5
Pays
Australia
Australia
Australia
Australia
Australia
Australia
ID
Etat Code Population
151 Ashmore and Cartier Islands
AS
0
152 Australian Capital Territory
CT
370729
153
Coral Sea Islands
CR
4
154
New South Wales
NS
7247669
155
Northern Territory
NT
232365
156
Queensland
QL
4513009
De nombreux calculs peuvent tre effectus sur cette table dattributs. Par exemple,
rpondons cette question : quelle est la population totale de lAustralie ?
> # Population australienne
> sum(na.omit(aus1@data [, "Population"]))
## [1] 22482221
[1] "0"
"1"
"2"
"3"
"4"
"5"
"6"
"7"
"8"
"9"
"10"
"5"
"6"
"7"
"8"
"9"
"10"
[1] "0"
"1"
"2"
"3"
"4"
Lordre des lignes et des polygones est identique. Nous souhaitons maintenant modifier
lordre de ces lignes ainsi que celui des polygones, de manire ce que les attributs de la
premire ligne se rfrent bien au premier polygone.
> # Tri conditionnel
> (pos <- order(aus1@data $Population, decreasing = T))
##
>
>
>
>
[1]
4 10
6 11
# Reorganisation de l'objet
aus1 <- aus1[pos, ]
# Identifiants des polygones
sapply(aus1@polygons , function(x) slot(x, "ID"))
##
[1] "3"
"9"
"5"
"10" "6"
"7"
"1"
"4"
"2"
"0"
"8"
3
9
5
10
6
7
1
4
2
0
8
Pays
Australia
Australia
Australia
Australia
Australia
Australia
Australia
Australia
Australia
Australia
Australia
ID
Etat Code Population
154
New South Wales
NS
7247669
160
Victoria
VI
5574455
156
Queensland
QL
4513009
161
Western Australia
WA
2387232
157
South Australia
SA
1645040
158
Tasmania
TS
511718
152 Australian Capital Territory
CT
370729
155
Northern Territory
NT
232365
153
Coral Sea Islands
CR
4
151 Ashmore and Cartier Islands
AS
0
159
<NA> <NA>
NA
2.2
Nous venons de voir que la table dattributs pouvait tre manipule trs facilement.
Nous allons maintenant voir des oprations plus pousses ncessitant un rfrencement
certains attributs de cette table.
2.2.1
Id State
Capitale
1
0
AS
Canberra
2
1
CT
Canberra
3
2
CR Ile Willis
4
3
NS
Sydney
5
4
NT
Darwin
6
5
QL
Brisbane
7
6
SA
Adelaide
8
7
TS
Hobart
9
8 <NA>
<NA>
10 9
VI Melbourne
11 10
WA
Perth
Pour procder au joint par identifiant, deux conditions doivent tre remplies :
les lignes des deux tables doivent comporter les mmes identifiants (la cl sera le
nom des lignes) ;
lordre des lignes doit tre le mme dans les deux tables.
Commenons par trier de nouveau notre objet spatial aus1 par lidentifiant des
polygones.
> # Tri conditionnel
> (pos <- order(as.numeric(rownames(aus1@data )), decreasing = F))
##
[1] 10
6 11
> # Verification
> rownames(aus1@data )
##
[1] "0"
"1"
"2"
"3"
"4"
"5"
"6"
"7"
"8"
"9"
"10"
Id State
Capitale
0
0
AS
Canberra
1
1
CT
Canberra
2
2
CR Ile Willis
3
3
NS
Sydney
4
4
NT
Darwin
5
5
QL
Brisbane
6
6
SA
Adelaide
7
7
TS
Hobart
8
8 <NA>
<NA>
9
9
VI Melbourne
10 10
WA
Perth
Supprimons quelques champs dans les deux tables.
0
1
2
3
4
5
Pays
Etat Code Population
Australia Ashmore and Cartier Islands
AS
0
Australia Australian Capital Territory
CT
370729
Australia
Coral Sea Islands
CR
4
Australia
New South Wales
NS
7247669
Australia
Northern Territory
NT
232365
Australia
Queensland
QL
4513009
0
1
2
3
4
5
State
Capitale
AS
Canberra
CT
Canberra
CR Ile Willis
NS
Sydney
NT
Darwin
QL
Brisbane
Assurons-nous que lordre des lignes dans les deux tables soit identique.
44
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
Procdons maintenant la jointure par identifiant (la cl sera le nom des lignes) grce
la fonction spCbind() du package maptools.
>
>
>
>
>
>
# Chargement du package
library(maptools)
# Jointure par identifiant
aus1 <- spCbind(aus1, mat)
# Verification
head(aus1@data )
##
##
##
##
##
##
##
##
##
##
##
##
##
##
0
1
2
3
4
5
0
1
2
3
4
5
Pays
Etat Code Population State
Australia Ashmore and Cartier Islands
AS
0
AS
Australia Australian Capital Territory
CT
370729
CT
Australia
Coral Sea Islands
CR
4
CR
Australia
New South Wales
NS
7247669
NS
Australia
Northern Territory
NT
232365
NT
Australia
Queensland
QL
4513009
QL
Capitale
Canberra
Canberra
Ile Willis
Sydney
Darwin
Brisbane
Les colonnes Etat et State sont identiques, preuve que la jointure a bien fonctionn. Supprimons la colonne State de manire allger la lecture de la table.
> aus1@data <- aus1@data [, -5]
> aus1@data
##
##
##
##
##
##
##
##
##
##
##
##
0
1
2
3
4
5
6
7
8
9
10
Pays
Etat Code Population
Capitale
Australia Ashmore and Cartier Islands
AS
0
Canberra
Australia Australian Capital Territory
CT
370729
Canberra
Australia
Coral Sea Islands
CR
4 Ile Willis
Australia
New South Wales
NS
7247669
Sydney
Australia
Northern Territory
NT
232365
Darwin
Australia
Queensland
QL
4513009
Brisbane
Australia
South Australia
SA
1645040
Adelaide
Australia
Tasmania
TS
511718
Hobart
Australia
<NA> <NA>
NA
<NA>
Australia
Victoria
VI
5574455 Melbourne
Australia
Western Australia
WA
2387232
Perth
45
2.2.2
Suppression de donnes
Notre table dattributs comporte une ligne (c.--d. un polygone multiple) dont les
attributs sont manquants (NA). Nous allons donc voir comment supprimer des entits de
notre objet spatial. Supprimons tous les polygones dont les attributs sont manquants.
>
>
>
>
>
>
##
##
##
##
##
##
##
##
##
##
##
0
1
2
3
4
5
6
7
9
10
Pays
Etat Code Population
Capitale
Australia Ashmore and Cartier Islands
AS
0
Canberra
Australia Australian Capital Territory
CT
370729
Canberra
Australia
Coral Sea Islands
CR
4 Ile Willis
Australia
New South Wales
NS
7247669
Sydney
Australia
Northern Territory
NT
232365
Darwin
Australia
Queensland
QL
4513009
Brisbane
Australia
South Australia
SA
1645040
Adelaide
Australia
Tasmania
TS
511718
Hobart
Australia
Victoria
VI
5574455 Melbourne
Australia
Western Australia
WA
2387232
Perth
Non seulement ces lments ont t supprims de la table dattributs, mais ils ont
galement t limins de la gomtrie. Vrifions que lidentifiant 8 a disparu de la liste
des identifiants des polygones.
> # Identifiants des polygones
> sapply(aus@polygons , function(x) slot(x, "ID"))
##
[1] "0"
"1"
"2"
"3"
"4"
"5"
"6"
"7"
"9"
"10"
Ici, il est important de retenir que tout changement apport aux diffrents lments
(polygones) de lobjet vectoriel se rpercute la fois sur la table dattributs et sur la
gomtrie.
Reprsentons une carte avec ces objets spatiaux. En rouge, nous allons afficher le
polygone spatial avec tous les polygones initiaux, tandis quen noir nous reprsenterons
lobjet spatial auquel on aura t les polygones sans attributs. Puisque les objets sont
quasiment identiques, les lments reprsents en rouge sur la carte seront les lments
sans attributs que nous avons supprims (localiss lextrme sud-est de lAustralie).
>
>
>
>
# Representation cartographique
par(mar = c(0, 0, 0, 0))
plot(aus1, border = "red")
plot(aus, add = T)
46
2.2.3
Dans la section 1.3.1, nous avons dj extrait certains polygones dun objet spatial.
Regardons de nouveau comment procder en construisant deux nouveaux polygones spatiaux : aus_w qui comprendra tous les tats de lOuest australien et aus_e contenant les autres tats.
Identifions dans la table dattributs les lignes correspondant aux tats suivants : Australie occidentale, Territoire du Nord et Australie mridionale.
> # Identification des etats
> (pos <- which(aus@data [, "Etat"] == "Western Australia" | aus@data [,
+
"Etat"] == "Northern Territory" | aus@data [, "Etat"] == "South
Australia"))
## [1]
7 10
# Australie de l'Ouest
aus_w <- aus[pos, ]
# Australie de l'Est
aus_e <- aus[-pos, ]
47
# Representation cartographique
par(mar = c(0, 0, 0, 0))
plot(aus)
plot(aus_w, col = "black", border = "white", add = T)
plot(aus_e, col = "gray", border = "white", add = T)
##
##
##
##
##
##
##
##
0
1
2
3
5
7
9
Pays
Etat Code Population
Capitale
Australia Ashmore and Cartier Islands
AS
0
Canberra
Australia Australian Capital Territory
CT
370729
Canberra
Australia
Coral Sea Islands
CR
4 Ile Willis
Australia
New South Wales
NS
7247669
Sydney
Australia
Queensland
QL
4513009
Brisbane
Australia
Tasmania
TS
511718
Hobart
Australia
Victoria
VI
5574455 Melbourne
2.2.4
Dissolution de polygones
"plotOrder"
"bbox"
"proj4string"
La table dattributs a disparu (absence du slot @data), ce qui est normal tant entendu
que nous avons fusionn tous les tats entre eux.
Reprsentons ces deux polygones dissouts.
>
>
>
>
>
# Representation cartographique
par(mar = c(0, 0, 0, 0))
plot(aus)
plot(aus_wd, col = "gray", add = T)
plot(aus_ed, col = "black", add = T)
49
2.3
Poursuivons lexploration dobjets vectoriels, et regardons comment manipuler plusieurs couches entre elles. La plupart des fonctions qui seront abordes dans cette section
se trouvent dans le package rgeos. Nous allons voir plus particulirement comment regrouper plusieurs shapefiles entre eux, comment procder une jointure spatiale (pointspolygones et polygones-polygones) et comment intersecter des polygones. Pour terminer,
nous crirons une fonction qui permettra de dcouper une couche de polygones par une
autre (quivalent du Clip sous ArcMap).
2.3.1
Combinaison de couches
Nous allons tout dabord voir comment regrouper deux couches vectorielles en un
seul objet spatial. Nous allons combiner les deux polygones spatiaux crs prcdemment
( aus_wd et aus_ed ) entre eux. Avant cela, nous allons leur rajouter une table
dattributs.
>
>
>
>
+
>
>
>
>
>
>
## [1] "SpatialPolygonsDataFrame"
## attr(,"package")
## [1] "sp"
> aus_wd@data
##
Pays Etat Code Population
## 1 Australia West
WA
4264637
Procdons de mme pour la seconde couche vectorielle.
>
>
>
>
+
>
>
>
>
>
>
## [1] "SpatialPolygonsDataFrame"
## attr(,"package")
## [1] "sp"
> aus_ed@data
##
Pays Etat Code Population
## 1 Australia East
EA
18217584
La combinaison de polygones spatiaux ne pourra se faire qu une seule condition : les
identifiants des polygones (c.--d. le nom des lignes des tables dattributs) doivent tre
uniques dans les deux couches vectorielles. Vrifions si cest bien le cas.
> # Nom des identifiants des polygones dans 'aus_wd'
> sapply(aus_wd@polygons , function(x) slot(x, "ID"))
## [1] "1"
> # Nom des identifiants des polygones dans 'aus_ed'
> sapply(aus_ed@polygons , function(x) slot(x, "ID"))
## [1] "1"
51
Il savre que nos deux objets spatiaux sont forms dun seul polygone multiple chacun,
polygones qui portent le mme identifiant dans les deux objets (ceci est une consquence
des dissolutions prcdentes). Ainsi, nous devons renommer ces identifiants de manire
ce quils soient uniques. Nous allons devoir utiliser une fonction spciale qui permet de
changer cet identifiant la fois dans la table dattributs et dans la gomtrie : la fonction
spChFIDs() du package sp.
Changeons lidentifiant des polygones de nos couches vectorielles.
>
>
>
>
## [1] "W"
> # Verification dans la table d'attributs
> rownames(aus_wd@data )
## [1] "W"
>
>
>
>
## [1] "E"
> # Verification dans la table d'attributs
> rownames(aus_ed@data )
## [1] "E"
Nous pouvons maintenant procder la combinaison des deux couches. Pour cela,
nous allons utiliser la fonction spRbind() du package maptools qui va la fois regrouper
les gomtries ainsi que les tables dattributs.
>
>
>
>
##
Pays Etat Code Population
## W Australia West
WA
4264637
## E Australia East
EA
18217584
> # Nombre de polygones multiples
> length(aus2@polygons )
## [1] 2
52
2.3.2
Jointure spatiale
Nous allons nous intresser maintenant aux jointures spatiales, c.--d. la proximit
spatiale entre lments de couches diffrentes. En dautres termes, il sagit didentifier les
lments dune couche qui se superposent en partie (ou totalement) aux lments dune
autre couche. Sous ArcMap, cest la fonction Spatial Join. Nous allons voir deux cas de
figure : un joint spatial entre des points et des polygones, et un joint spatial entre des
polygones et des polygones.
Points-polygones
Commenons par crer une couche spatiale de points. Nous allons tirer alatoirement
50 points lintrieur de ltendue spatiale dfinie par le shapefile de lAustralie ( aus ).
Pour cela, il nous faut convertir ltendue spatiale de notre shapefile (actuellement sous
forme dune matrix) en un SpatialPolygons (Section 1.2.2).
53
>
>
+
>
+
>
>
>
>
>
>
par(mar =
plot(pol,
plot(aus,
plot(pts,
c(0, 0, 0, 0))
col = "gray")
col = "black", border = "white", add = T)
pch = 19, col = "red", add = T)
>
>
>
>
>
>
##
##
##
##
##
##
1
2
3
4
5
coordinates
(149.521, -22.7962)
(122.866, -33.1808)
(133.848, -40.6259)
(154.03, -40.4912)
(135.268, -38.1105)
ID
Random1
Random2
Random3
Random4
Random5
Maintenant, nous allons pouvoir procder la jointure spatiale entre ces points et la
couche vectorielle de lAustralie. Pour ce faire, nous allons utiliser la fonction over() du
package sp.
>
>
>
>
# Jointure spatiale
join <- over(pts, aus)
# Classe de l'objet cree
class(join)
## [1] "data.frame"
> # Dimensions de l'objet cree
> dim(join)
## [1] 50
1
2
3
4
5
6
Pays
Etat
Australia
Queensland
Australia Western Australia
<NA>
<NA>
<NA>
<NA>
<NA>
<NA>
<NA>
<NA>
Le rsultat de la jointure spatiale entre des points et des polygones se prsente sous
forme dune table dont le nombre de lignes correspond au nombre de points alatoires et le
nombre de colonnes au nombre de champs dans la table dattributs du SpatialPolygons.
Les lignes identifies comme NA correspondent aux points qui ne sont pas contenus dans les
polygones de la couche vectorielle. Par contre, les points alatoires tombant lintrieur
dun polygone se voit affecter les attributs de ce polygone.
Rajoutons les identifiants des points alatoires cette table.
56
>
>
>
>
##
##
##
##
##
##
##
1
2
3
4
5
6
ID
Pays
Etat
Random1 Australia
Queensland
Random2 Australia Western Australia
Random3
<NA>
<NA>
Random4
<NA>
<NA>
Random5
<NA>
<NA>
Random6
<NA>
<NA>
Maintenant, nous nallons conserver que les points superposant les polygones, c.--d.
que nous allons supprimer dans la table join toutes lignes prenant la valeur NA.
>
>
>
>
>
>
>
>
##
##
##
##
##
##
##
ID
Pays
Etat Code Population Capitale
1 Random1 Australia
Queensland
QL
4513009 Brisbane
2 Random2 Australia Western Australia
WA
2387232
Perth
3 Random7 Australia Western Australia
WA
2387232
Perth
4 Random14 Australia Western Australia
WA
2387232
Perth
5 Random21 Australia Northern Territory
NT
232365
Darwin
6 Random22 Australia
New South Wales
NS
7247669
Sydney
Nous pouvons convertir ce nouveau data.frame en un objet sp.
1
2
3
4
5
6
ID
Random1
Random2
Random7
Random14
Random21
Random22
Pays
Etat Code Population Capitale
Australia
Queensland
QL
4513009 Brisbane
Australia Western Australia
WA
2387232
Perth
Australia Western Australia
WA
2387232
Perth
Australia Western Australia
WA
2387232
Perth
Australia Northern Territory
NT
232365
Darwin
Australia
New South Wales
NS
7247669
Sydney
Polygones-polygones
Voyons maintenant comment raliser une jointure spatiale entre deux couches vectorielles formes de polygones. Le principe est exactement le mme que ce que nous venons
de voir. Nous allons crer un polygone spatiale de manire le joindre spatialement la
couche vectorielle aus .
58
>
>
>
+
>
>
>
>
>
>
59
3
1
4
1
5
1
6 7
1 NA
9 10
1 NA
Il est important de remarquer que la jointure spatiale entre deux polygones spatiaux
retournent un vecteur dont la longueur correspond au nombre de polygones multiples
contenus dans le premier objet spatial (dans notre cas, il sagit du nombre dtats australiens contenus dans aus ). Les tats qui ne superposent pas le polygone sont associs
la valeur NA, tandis que ceux qui touchent le polygone se voient affecter la valeur 1.
Identifions les tats superposs par ce polygone.
> # Identification des etats superposes
> pos <- which(!is.na(join))
>
>
>
>
60
2.3.3
Intersection de couches
Dans certains cas, il peut tre utile de ne conserver que la rgion intersecte entre
deux couches vectorielles, c.--d. leur partie commune. Cela sera possible avec la fonction gIntersection() du package rgeos. Regardons tout dabord comment raliser une
intersection entre deux objets vectoriels de type polylignes.
Intersection de lignes
Nous allons crer deux objets de type SpatialLines comme dans la Section 1.2.3.
Dfinissons pour commencer les coordonnes de deux lignes qui vont sentrecouper en
plusieurs points.
>
>
+
>
+
>
>
>
+
>
+
>
>
>
>
Nous allons maintenant dfinir le systme de coordonnes de ces deux lignes dans le
mme systme de coordonnes que la couche vectorielle des tats australiens.
> # Definition du systeme de coordonnees
> L1@proj4string <- aus@proj4string
> L2@proj4string <- aus@proj4string
Nous pouvons maintenant procder lintersection de nos deux lignes.
> # Intersection de lignes
> z <- gIntersection(L1, L2)
Regardons comment se structure le rsultat de cette intersection.
> # Classe de l'objet
> class(z)
## [1] "SpatialPoints"
## attr(,"package")
## [1] "sp"
61
1
1
1
1
1
x
137.5
139.7
140.9
141.4
143.2
y
-23.51
-33.27
-30.19
-27.24
-35.91
Vrifions le rsultat en reprsentant les lignes et leurs intersections sur une carte.
>
>
>
>
>
Intersection de polygones
Intersectons maintenant deux polygones entre eux. Nous allons utiliser la mme fonction que pour intersecter deux lignes, la fonction gIntersection(). Notons ds prsent
que cette fonction ne pourra seffectuer quentre deux couches de polygones, chacune forme dun seul polygone. Ce point sera important considrer pour la dernire section de
ce chapitre.
>
>
>
+
>
>
>
>
>
+
>
>
>
>
>
>
>
>
Ralisons lintersection entre ces deux polygones de manire identifier leur partie
commune.
> # Intersection de polygones
> w <- gIntersection(pol1, pol2)
Regardons la structure de cette intersection.
> # Classe de l'objet
> class(w)
## [1] "SpatialPolygons"
## attr(,"package")
## [1] "sp"
> # Nom de ses elements
> slotNames(w)
## [1] "polygons"
"plotOrder"
"bbox"
"proj4string"
Ainsi, le rsultat de lintersection de deux polygones est galement un polygone. Reprsentons le rsultat de cette intersection sur la carte de lAustralie.
63
>
>
>
>
>
2.3.4
Terminons ce chapitre en voyant comment dcouper une couche vectorielle par une
autre. Malheureusement, il nexiste pas de fonction prdfinie sous R pour faire un tel
clip dobjets spatiaux. Mais, nous allons voir quen combinant quelques fonctions vues
prcdemment, cette opration est tout fait ralisable.
Dcoupage dune couche vectorielle par un polygone
Nous allons dcouper les tats australiens par un des deux polygones prcdents,
pol2 . Voici les tapes que nous suivrons :
Jointure spatiale, afin didentifier les tats australiens superposs par le polygone ;
Extraction par attributs, afin de placer chaque tat intersect par le polygone dans
un objet spatial distinct ;
64
Intersection de chaque tat par le polygone, afin de ne conserver que la partie des
tats australiens situe lintrieur du polygone ;
Combinaison des diffrentes intersections pour crer une seule couche vectorielle
dcoupe.
Allons-y pour la premire tape : procdons la jointure spatiale entre le shapefile des
tats australiens aus et le polygone pol2 .
> # Jointure spatiale
> (join <- over(aus, pol2))
## 0 1 2
## NA NA NA
3
1
4
1
5
1
6 7
1 NA
9 10
1 NA
La jointure spatiale permettra deffectuer la suite des calculs uniquement sur les tats
dintrts. Ceci peut savrer extrmement utile, notamment dans le cas dun dcoupage
trs fin (donc avec de nombreux polygones). Conservons donc les tats superposs par le
polygone pol2 .
>
>
>
>
## [1] 4 5 6 7 9
La seconde tape consiste en la cration dun objet spatial par tat slectionn. Nous
allons donc procder une extraction par attribut de manire itrative et placer tous les
nouveaux objets extraits dans une mme list. Cette tape est ncessaire, car comme
nous lavons mentionn plus haut, la fonction gIntersection() prouve de la difficult
dterminer lintersection entre des couches composes de plusieurs polygones.
>
>
>
>
+
+
+
Maintenant, nous allons parcourir chaque SpatialPolygons contenu dans cette liste
et lintersecter avec le polygone pol2 . Le rsultat de ces intersections successives sera
contenu dans une nouvelle liste.
>
>
>
>
+
+
+
[1]
[1]
[1]
[1]
[1]
"1"
"1"
"1"
"1"
"1"
##
##
##
##
##
[1]
[1]
[1]
[1]
[1]
"1"
"2"
"3"
"4"
"5"
Pour terminer, regroupons tous ces polygones dans un objet spatial que nous appellerons clip .
>
>
>
>
+
+
>
>
>
>
>
>
>
>
# Table d'attributs
mat <- aus@data [pos, ]
# Nom des lignes
rownames(mat) <- 1:5
# Rajout de la table a l'objet
clip <- SpatialPolygonsDataFrame(clip, mat)
# Verification
clip@data
##
##
##
##
##
##
1
2
3
4
5
Pays
Etat Code Population Capitale
Australia
New South Wales
NS
7247669
Sydney
Australia Northern Territory
NT
232365
Darwin
Australia
Queensland
QL
4513009 Brisbane
Australia
South Australia
SA
1645040 Adelaide
Australia
Victoria
VI
5574455 Melbourne
67
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ }
Nous pouvons maintenant utiliser cette fonction. Pour cela, nous allons crer une
couche vectorielle compose de six polygones contigus qui viendra clipper la couche vectorielle des tats australiens. Crons cet objet spatial.
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
70
NS
NT
QL
SA
Pays
Etat Code Population Capitale
Australia
New South Wales
NS
7247669
Sydney
Australia Northern Territory
NT
232365
Darwin
Australia
Queensland
QL
4513009 Brisbane
Australia
South Australia
SA
1645040 Adelaide
71
Chapitre 3
Cartographie sous R
3.1
R nest pas un logiciel de SIG. Mais, comme nous lavons vu dans les chapitres prcdents, il peut se comporter comme tel. Nous avons tudi la structure des objets spatiaux
sous R, et explor diffrents outils permettant dimporter, exporter et manipuler la gomtrie de couches vectorielles et matricielles. Nous allons maintenant nous intresser aux
aspects cartographiques. Nous avons dj produit quelques cartes rudimentaires en affichant simplement des objets spatiaux au moyen de la fonction de base plot(). Nous allons
voir dans ce chapitre comment rendre ces cartes plus professionnelles et plus esthtiques.
R est un langage de programmation complet : ceci implique que toutes les caractristiques dune carte seront paramtrables et ajustables. Les classes dobjets spatiaux introduites par les packages sp et raster ont t construites de telle manire que la plupart
des fonctions graphiques de base peuvent tre utilises pour reprsenter ces objets. Ainsi,
les fonctions plot(), points(), rect(), text() ou encore legend() pourront servir
reprsenter des couches gographiques. De mme, la plupart des paramtres graphiques
seront modifiables grce la fonction par().
Dans cette premire section, nous allons produire une carte administrative des tats
australiens en respectant les normes et standards cartographiques. Ainsi, nous allons voir
comment ajouter la carte de base un titre, une lgende, une chelle, les graticules, ainsi
quune rose des vents. Regardons cela plus en dtails.
3.1.1
Carte basique
Commenons par importer les couches vectorielles dont nous allons avoir besoin dans
cette section. Nous allons importer deux couches vectorielles : AUS_adm0 , qui donne
les limites nationales de lAustralie, et AUS_adm1 , qui donne les dlimitations administratives des tats/territoires australiens. Nous allons galement supprimer les polygones
dans la seconde couche vectorielle qui ne possdent pas dattributs (voir section 2.2.2).
>
>
>
>
>
>
Tout dabord, paramtrons une nouvelle fentre graphique. Nous allons utiliser pour
cela la fonction R par(). Celle-ci permet de configurer un peu plus de 70 paramtres
graphiques. Pour plus dinformation sur les options graphiques, on pourra consulter laide
de cette fonction (?par). Pour cet exercice, nous nallons modifier que les paramtres
suivants :
mar permet de contrler les marges de la zone graphique ;
xaxs permet de contrler pour le style de laxe des abscisses ;
yaxs permet de contrler pour le style de laxe des ordonnes.
Voici comment modifier les paramtres dune fentre graphique.
> # Configuration de la zone graphique
> par(xaxs = "i", yaxs = "i", mar = c(2, 3, 2, 3))
Nous allons maintenant tracer la couche vectorielle des tats australiens (soustraite
des polygones inconnus). Pour linstant, nous nallons pas personnaliser cet objet : il nous
sert simplement dfinir ltendue spatiale de notre carte. Pour reprsenter cet objet
spatial, nous allons utiliser la fonction R plot() en spcifiant deux arguments :
xlim permet de dfinir les limites minimale et maximale de laxe des abscisses ;
ylim permet de dfinir les limites minimale et maximale de laxe des ordonnes.
> # Definition de l'etendue spatiale de la carte
> plot(aus1, xlim = c(110, 160), ylim = c(-50, -10))
Maintenant, nous allons rajouter un rectangle bleu pour dfinir les zones marines
bordant lAustralie. Nous allons utiliser pour cela la fonction polygon(), qui ne doit pas
tre confondue avec la fonction Polygon() du package sp qui scrit avec une majuscule.
Cette fonction accepte de nombreux arguments, dont :
x, les coordonnes en abscisse des diffrents sommets du polygone ;
y, les coordonnes en ordonne des diffrents sommets du polygone ;
col, la couleur intrieure du polygone (ici, nous allons tracer un polygone rempli
dun bleu ocan) ;
border, la couleur de la bordure du polygone.
73
3.1.2
Ajout de graticules
Nous allons voir maintenant comment rajouter des graticules cette carte, c.--d. les
mridiens et les parallles. Le package sp met notre disposition une fonction pour cela :
la fonction gridlines(). Cependant, nous nallons pas utiliser directement cette fonction,
car elle noffre que peu de paramtres pour la personnaliser. Nous allons donc crire une
fonction, qui sinspire en grande partie de celle-ci, mais qui sira mieux nos besoins.
crivons cette fonction avant de lexpliquer.
> graticules <- function(sp, WE, NS) {
+
# ==============================
+
WE.l <- NS.l <- list()
+
# Definition des longitudes
+
for (i in 1:length(WE)) {
+
x <- rep(WE[i], 20)
+
y <- seq(NS[1], NS[length(NS)], length.out = 20)
+
xy <- data.frame(x, y)
75
+
WE.l[[i]] <- Line(xy)
+
}
+
# Definition des latitudes
+
for (i in 1:length(NS)) {
+
x <- seq(WE[1], WE[length(WE)], length.out = 20)
+
y <- rep(NS[i], 20)
+
xy <- data.frame(x, y)
+
NS.l[[i]] <- Line(xy)
+
}
+
# Conversion en objet spatial
+
SL <- SpatialLines(list(Lines(NS.l, "NS"), Lines(WE.l, "WE")),
CRS(proj4string(sp)))
+
return(SL)
+ }
Cette fonction va retourner un objet de la classe SpatialLines contenant deux sries
de lignes spatiales : les mridiens, nots NS , et les parallles, nots WE . Lutilisateur
devra indiquer la valeur de trois arguments :
sp, un des objets actuellement reprsent sur la carte. Celui ne servira qu dfinir
le systme de coordonnes des graticules ;
WE, les coordonnes des latitudes pour lesquelles on souhaite tracer les parallles ;
NS, les coordonnes des longitudes pour lesquelles on souhaite tracer les mridiens.
Lavantage de cette fonction devant celle du package sp est que les graticules ne sont
pas limits ltendue spatiale de lobjet reprsent, mais ils peuvent sajuster ltendue
spatiale de la carte (tendues spatiales qui ne correspondent pas ncessairement).
Utilisons cette fonction et calculons le positionnement des parallles et des mridiens
tous les 10 degrs.
> # Calcul des graticules
> grat <- graticules(sp = aus1, WE = seq(from = 110, to = 160,
+
by = 10), NS = seq(from = -50, to = -10, by = 10))
Et rajoutons les graticules notre carte.
> # Rajout des graticules
> plot(grat, lty = 3, col = "#34bdf2", add = T)
Cette fonction ne fait que tracer les mridiens et les parallles sans indiquer leurs
valeurs sur la carte. Nous allons donc rajouter cette information grce la fonction axis().
Celle-ci accepte plusieurs arguments :
side qui indique laxe devant tre trac. Les valeurs possibles sont : 1 (axe du bas),
2 (axe de gauche), 3 (axe du haut) ou 4 (axe de droite) ;
at qui donne la graduation de laxe ;
labels qui spcifie le nom des tiquettes sur la graduation dfinie avec largument
prcdent ;
pos la coordonne sur laxe perpendiculaire laquelle doit tre trac cet axe.
Affichons les quatre axes.
76
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
l'axe inferieur
= 10), "E", sep = "")
seq(110, 160, by = 10), labels = labs)
l'axe de gauche
-10), "S", sep = "")
seq(-50, -10, by = 10), labels = labs)
l'axe superieur
= 10), "E", sep = "")
seq(110, 160, by = 10), labels = labs)
l'axe de droite
-10), "S", sep = "")
seq(-50, -10, by = 10), labels = labs)
3.1.3
Ajout de texte
Regardons maintenant comment rajouter des informations textuelles sur la carte. Commenons par ajouter les capitales des diffrents tats/territoires australiens.
77
textuelle sur plusieurs lignes, on aura recours au caractre chapp form dune barre
oblique inverse suivie de la lettre n , qui indiquera R quil devra effectuer un retour
ligne. Regardons cela.
>
>
+
>
>
+
Avant dafficher cette carte, nous allons rajouter dautres informations relatives aux
zones marines, en plaant sur la carte le nom de quatre mers bordant le continent australien. Nous allons tout dabord crer une table avec le nom de ces mers ainsi que leurs
positions gographiques.
>
>
>
>
+
>
>
>
>
##
##
##
##
##
Procdons de la mme manire que pour les ocans (appel la fonction text()) et
ajoutons sur la carte le nom de ces quatre mers.
>
>
>
>
>
>
>
+
79
3.1.4
Rendons cette carte un peu plus professionnelle, et ajoutons une chelle cartographique. Le package raster met notre disposition la fonction scalebar(). Celle-ci accepte plusieurs arguments :
d, la distance couverte par lchelle ;
xy, la position gographique laquelle lchelle doit tre trace (bord gauche) ;
type, indique le type dchelle : ligne (line) ou barre (bar) ;
below, le texte rajouter sous lchelle ;
divs, le nombre de divisions de lchelle ;
lonlat, indique si la carte est en reprsentation plane (F) ou dans un systme non
projet (T ).
> # Rajout d'une echelle
> scalebar(d = 500, xy = c(152.5, -47.5), type = "bar", below = "km",
+
lwd = 4, divs = 2, col = "black", cex = 0.75, lonlat = T)
80
3.1.5
Rajoutons maintenant une rose des vents qui nous indiquera la direction du Nord gographique. Dans le Journal of Statistical Software du mois dAvril 2007, Tanimura et al. 1
proposent plusieurs fonctions cartographiques auxiliaires, dont la fonction northarrow().
Celle-ci ntant pas implmente dans un package, recopions-l ici afin de la dfinir dans
notre session de travail.
> northarrow <- function(loc, size, bearing = 0, cex = 1) {
+
# =========================================
+
cols <- rep(c("white", "black"), 8)
+
# Coordonnees des polygones de la rose des vents
+
radii <- rep(size/c(1, 4, 2, 4), 4)
+
x <- radii[(0:15) + 1] * cos((0:15) * pi/8 + bearing) + loc[1]
+
y <- radii[(0:15) + 1] * sin((0:15) * pi/8 + bearing) + loc[2]
+
# Trace des polygones
+
for (i in 1:15) {
+
x1 <- c(x[i], x[i + 1], loc[1])
+
y1 <- c(y[i], y[i + 1], loc[2])
1. Tanimura, S. et al. (2007) Auxilary Cartographic Functions in R : North Arrow, Scale Bar, and
Label with Leader Arrow. Journal of Statistical Software, Vol.19, Code Snippet 1, 1-8.
81
+
+
+
+
+
+
+
+
+
+
+
+
+
+ }
Excutons maintenant cette fonction pour rajouter une rose des vents notre carte.
> # Ajout du Nord geographique
> northarrow(loc = c(115, -45), size = 3, cex = 0.75)
82
3.1.6
Bien que cela ne soit pas ncessaire dans notre cas, nous allons rajouter une lgende
notre carte. Pour ce faire, nous allons utiliser la fonction legend(), laquelle accepte
plusieurs arguments, dont voici les principaux :
x, la coordonne en abscisse laquelle doit tre place la lgende ;
y, la coordonne en ordonne laquelle doit tre place la lgende ;
legend, le nom des diffrents items de la lgende ;
pch, le symbole des diffrents items de la lgende ;
bg, la couleur du fond du cadre de la lgende ;
title, le titre de la lgende.
Rajoutons donc une lgende notre carte avec les villes comme unique item.
> legend(111, -10.75, legend = "Capitale rgionale", pch = 19,
+
bg = "white", cex = 0.75, title = "LGENDE")
3.1.7
Que serait une carte sans un titre ? Pour terminer cette section, nous allons rajouter
un titre notre reprsentation cartographique des limites administratives de lAustralie.
83
Nous pourrions utiliser la fonction title(), mais nous allons prfrer la fonction que nous
avons utilis prcdemment : text(). Avant de rajouter cette zone de texte, nous allons
tracer un rectangle qui servira de cadre notre titre. Pour ce faire, nous allons utiliser
la fonction rect(), qui require les coordonnes extrmes du rectangle (nous pourrions
galement utiliser la fonction polygon()).
>
>
>
>
>
+
>
>
+
# Coordonnees du titre
x <- 135
y <- -47.5
# Rajout d'un cadre blanc
rect(xleft = x - 14, ybottom = y - 2, xright = x + 14, ytop = y +
2, col = "white", border = "black")
# Rajout du titre
text(x = x, y = y, labels = "CARTE DE L'AUSTRALIE", font = 2,
cex = 1.5)
84
3.2
La carte que nous venons de raliser est complte et trs esthtique, mais le code
ncessaire sa production est assez long gnrer. Ainsi, procder de la sorte pour une
simple visualisation de couches gographiques peut savrer assez contraignant. Heureusement, dautres alternatives existent pour gnrer une carte plus rapidement. De nombreux packages ont t dvelopps pour communiquer la base de donnes de GoogleMap.
Parmi ceux-ci, le package dismo. Il sinspire en partie du package RgoogleMaps et permet de tlcharger des donnes de GoogleMap et de les stocker sous R sous la forme
dune RasterLayer (ou dun RasterBrick dans le cas dun raster tribande). Chargeons
ce package dans la session de travail.
> # Chargement du package 'dismo'
> library(dismo)
3.2.1
Regardons comment tlcharger des donnes depuis GoogleMap. Pour ce faire, nous
allons utiliser la fonction gmap() du package dismo. Celle-ci accepte plusieurs arguments :
x correspond au nom de la localit ou aux coordonnes de ltendue spatiale des
donnes souhaites ;
exp, permet de dzoomer la carte sur la zone dsire ;
type, permet de slectionner le type de donnes tlcharges. Il peut prendre les
valeurs roadmap , satellite , hybrid ou terrain ;
scale, permet daugmenter la rsolution de limage si largument prend la valeur 2.
Tlchargeons une carte satellitaire de lAustralie.
> # Acces aux donnees satellite de l'Australie
> g1 <- gmap(x = "Australia", type = "satellite")
Affichons les caractristiques de cet objet.
> # Classe de l'objet
> class(g1)
## [1] "RasterLayer"
## attr(,"package")
## [1] "raster"
> # Dimensions
> ncol(g1)
## [1] 464
> nrow(g1)
## [1] 640
85
> ncell(g1)
## [1] 296960
> # Resolution spatiale
> res(g1)
## [1] 19568 19568
> # Etendue spatiale
> extent(g1)
##
##
##
##
##
class
xmin
xmax
ymin
ymax
:
:
:
:
:
Extent
10610985
19690481
-10034704
2488738
>
>
>
>
>
>
# Etendue spatiale
ext <- extent(c(112, 160, -45, -9))
# Acces aux donnees GoogleMap
g2 <- gmap(x = ext, type = "satellite")
# Etendue spatiale
extent(g2)
##
##
##
##
##
class
xmin
xmax
ymin
ymax
:
:
:
:
:
Extent
12013482
18275203
-6053762
-202966
Ici, nous avons dtermin ltendue spatiale de la zone tlcharger dans un systme
de coordonnes gographiques (longitude et latitude en degrs), mais lobjet retourn est
dfini dans le systme Mercator : la conversion se fait automatiquement. Affichons la carte
de la nouvelle zone.
> # Visualisation du raster
> plot(g2)
3.2.2
Zoom de la carte
point issu dun clic sur une fentre graphique. La fonction drawExtent() procde de mme
(avec deux points), mais convertit les coordonnes des points slectionns par clic en une
tendue spatiale. Regardons cela.
> # Definition d'une zone de zoom
> e <- drawExtent()
Tlchargeons les donnes correspondant cette nouvelle rgion et traons la carte
associe.
>
>
>
>
3.2.3
3.3
3.3.1
Carte de base
3.3.2
Rampe de couleurs
Nous venons de voir que lors de la visualisation cartographique dun raster, lalgorithme choisissait automatiquement les classes de valeurs (discrtisation de la variable
continue) ainsi que la couleur associe chaque classe. Nous pouvons bien entendu personnaliser la rampe de couleurs.
Plusieurs types de gradients de couleurs sont prdfinis sous R, mais la fonction
colorRampPalette() permet de dfinir ses propres palettes de couleurs. Cette fonction
accepte un argument principal qui se prsente sous la forme dun vecteur de couleurs.
Cette fonction retournera une fonction qui servira interpoler un nombre donn de couleurs parmi le gradient form des couleurs choisies.
Dfinissons un gradient de couleurs passant par le vert (code hexadcimal : #acd0a5),
le jaune (code hexadcimal : #efebc0), le marron (code hexadcimal : #aa8753) et le
gris (code hexadcimal : #cac3b8). Les hautes altitudes seront reprsentes en gris. Nous
allons slectionner 100 couleurs dans cette palette de couleurs.
90
>
>
+
>
>
91