-
Notifications
You must be signed in to change notification settings - Fork 2
/
08-les-reprojections.Rmd
158 lines (103 loc) · 4.25 KB
/
08-les-reprojections.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
# Les reprojections
Dans ce chapitre, nous allons utiliser les librairies suivantes.
```{r}
library(sf)
library(tidyverse)
library(ggplot2)
library(patchwork)
library(lwgeom)
```
Pour rappel, il existe deux types de CRS, les CRS géographiques (longitude/lattitude avec pour unité de compte des degrés) et les CRS projetés (avec un datum et une unité en mètre par exemple).
La plupart des fonctions de `sf` présupposent s'appliquer sur un CRS projeté, car les fonctions de GEOS sur lesquelles elles se basent le font aussi.
## Un premier exemple de reprojection
Prenons les coordonnées de Nantes en WGS 84:
```{r}
nantes<-data.frame(lon=-1.553621,lat=47.218371) %>%
st_as_sf(coords = c("lon", "lat")) %>%
st_set_crs(4326)
```
On peut visualiser nos données
```{r}
mapview(nantes)
```
`st_is_longlat()` est une fonction de `sf` qui permet de faire un test sur la famille de CRS à laquelle on a à faire.
```{r}
st_is_longlat(nantes)
```
Essayons de créer un buffer de 1km autour de Nantes
```{r,warning=T}
nantes_buffer= st_buffer(nantes, dist = 1)
```
```{r}
mapview(list(nantes,nantes_buffer))
```
Le message est clair et indique qu'un buffer ne marchera pas correctement sur des données en projection longitude / lattitude.
Tentons une reprojection. La fonction permettant une reprojection est `st_transform()`.
On va ici passer en lambert 93 nos données.
```{r}
nantes_proj<-st_transform(nantes, 2154)
```
Le CRS lambert 93 est bien un CRS projeté :
```{r}
st_is_longlat(nantes_proj)
```
```{r,warning=T}
nantes_proj_buffer= st_buffer(nantes_proj, dist = 1)
```
```{r}
mapview(list(nantes_proj,nantes_proj_buffer))
```
## Quand reprojeter ?
Quelques cas usuels qui peuvent vous amener à reprojeter vos données :
- la manipulation de données fournies dans des CRS différents
- l'usage du package leaflet impose des données spécifiées en WGS 84
- le besoin de visualiser vos données suivant la conversion de certaines propriétés des objets à la surface de la terre.
- l'usage de fonctions demandant à utiliser des CRS projetés (comme `st_buffer()` ci-dessus)
Un exemple d'usage : la distance de Rennes à Nantes
Prenons les coordonnées WGS 84 de Rennes
```{r}
rennes<-data.frame(lon=-1.6777926,lat=48.117266) %>%
st_as_sf(coords = c("lon", "lat")) %>%
st_set_crs(4326)
```
```{r}
mapview(rennes)
```
Tentons de calculer la distance de Rennes à Nantes.
Avec la données en Lambert 93, la fonction `st_distance()` renvoie un message d'erreur.
```{r,error=T}
st_distance(rennes,nantes_proj)
```
Avec la données en WGS 84, la fonction `st_distance()` renvoie bien le résultat.
```{r,error=T}
st_distance(rennes,nantes)
```
## Quel CRS utiliser ?
A cette question, il y a rarement une bonne réponse.
En ce qui concerne les CRS géométriques, le plus simple est d'utiliser le WGS 84, qui est de loin le plus populaire, avec lequel beaucoup de données sont fournies.
En ce qui concerne les CRS projetés, utiliser par défaut le lambert 93, le CRS officiel français, pour les données nationales fait sens.
Ensuite votre choix va dépendre des propriétés que vous souhaitez conserver.
## Comment projeter ?
### Projeter des vecteurs
Reprojeter des données vecteur se fait à l'aide de la fonction `st_transform()` que nous avons vu en utilisant le code epsg que nous voulons.
### Modifier la projection d'une carte.
Parfois on souhaite pouvoir aller plus loin dans les reprojections, en adaptant le centre de la projection, pour cela on peut utiliser un `proj4string` ad hoc.
Pour cela, on va modifier l'argument `+proj` de notre crs avec `st_transform`.
Tentons par exemple de reprojeter notre carte du globe en utilisant la projection azimutale équivalente de Lambert, centrée sur Pékin.
```{r}
data("World")
World_pekin<-st_transform(World,crs = "+proj=laea +x_0=0 +y_0=0 +lon_0=116 +lat_0=40")
```
Le paramètre `+proj=laea` permet de redéfinir la projection, les paramètres `+lon_0` et `lat_0` permettent de définir le centre de la projection. `x_0` et `y_0` définissent le centre du plan pour les coordonnées.
Qu'est ce qui a changé entre nos deux cartes ?
```{r}
st_crs(World)
st_crs(World_pekin)
```
```{r,echo = F}
p1<-ggplot()+
geom_sf(data=World)
p2<-ggplot()+
geom_sf(data=World_pekin)
p1+p2+plot_layout(nrow=1)
```