Objet
Les images Sentinel sont faciles d’accès et permettent d’évaluer les changements récents.
Pour le MNS et le MNT, la campagne LIDAR de l’IGN qui se termine actuellement a permis de récupérer des données beaucoup plus précises.
Concernant notre problématique spécifique (richesse / pauvreté commune et administrés), l’idée est d’examniner les mnt / mns de 3 rues importantes de votre commune (pas de départementale), pour voir si la voirie est lisse (= sans nid de poule).
Le MNT issu du Lidar permet-il de repérer les problèmes voirie ?
Définitions MNS MNT MNE
Différence entre un MNT / MNS et une image Sentinel ?
Directive européenne INSPIRE
Dans chaque cas, il faut s’interroger.
Charger les dalles correspondant à vos rues
Pour Bondy, les 3 rues sont sur 1 seule dalle (662 / 6867)
Code
dir ("data/cours5/" , pattern = "6867" )
[1] "LHD_FXX_0662_6867_MNS_O_0M50_LAMB93_IGN69.tif"
[2] "LHD_FXX_0662_6867_MNT_O_0M50_LAMB93_IGN69.tif"
Code
Code
mns <- rast ("data/cours5/LHD_FXX_0662_6867_MNS_O_0M50_LAMB93_IGN69.tif" )
mnt <- rast ("data/cours5/LHD_FXX_0662_6867_MNT_O_0M50_LAMB93_IGN69.tif" )
D’après le nom du fichier, quelle est la précision ?
Récupérer les rues
Récupérer les rues concernées avec overpass turbo, le tag est
(name ~ "anqui" or name ~ "ard Vaillant" or name ~ "arbusse") and highway <> bus_stop and highway = * in bondy
A commenter
le tilde,
la casse
les opérateurs OR et AND
les parenthèses
Couper au tampon
Tampon le plus petit possible
Quelle est la largeur d’une chaussée ?
Code
Linking to GEOS 3.13.1, GDAL 3.11.4, PROJ 9.7.0; sf_use_s2() is TRUE
Code
rue <- st_read ("data/cours5/3rues.geojson" , quiet = T)
# agréger les géométries par rues
rue <- aggregate (rue [, "name" ], by = list (rue$ name), length)
rue <- st_transform (rue, 2154 )
tampon <- st_buffer (rue,2 )
names (tampon) [1 : 2 ] <- c ("nom" , "nb" )
library (mapview)
mapview (tampon)
Code
st_write (tampon, "data/cours5.gpkg" , "tampon" , delete_layer = T, quiet = T)
Couper (= crop / mask)
Pour couper, explorer le menu imagerie / processus et raster functions, quelle est la différence ?
Dans fonctions rasters, tout est dans gestion des données
Code
MNT <- crop (mnt, tampon, mask= T)
MNS <- crop (mns, tampon, mask= T)
paramètres à appliquer :
ne pas oublier de cocher “couper la géométrie” sinon la coupure se fait par défaut au carré.
Dans Arcgis, ne pas oublier de cocher “couper la géométrie” sinon la coupure se fait par défaut au carré
Symbologie
clic droit au niveau de la fenêtre contenu / symbologie
Rechercher la palette élévation dans le mode continu, appliquer la même palette aux deux couches
Observer les différences entre les 3 rues au niveau du mnt et du mns
Statistiques
Quelle différence dans les étendues min / max ?
Code
freqMNS <- freq (MNS)
freqMNT <- freq (MNT)
head (freqMNT)
layer value count
1 1 51 4534
2 1 52 14471
3 1 53 5658
4 1 54 14964
5 1 55 6083
6 1 56 4403
Code
par (mf_row = c (1 ,2 ))
barplot (MNT, main = "MNT" )
Code
barplot (MNS, main = "MNS" )
Dans Arcgis, explorer l’outil informations image
La question !
Et surtout peut-on déjà supposer que la route n’est pas totalement lisse ?
MNH : utilisation de la calculatrice raster
Retenir la notion d’algèbre des cartes
Afin d’éliminer le problème de différence d’élévation entre les 3 rues, on va créer un MNH.
Code
MNH <- MNS - MNT
#writeRaster(MNH, "data/cours5/mnh.tif", overwrite = T)
Tester les modes de visualisation
Les rasters d’élévations sont toujours utilisés avec les mêmes outils :
Essayer notamment ombrage, pente et contour.
Code
# utilisation du contour
contour (MNH, col = "red" , border= NA )
Code
# taille pente (en degrés) et exposition
pente <- terrain (MNH, v = c ("slope" , "aspect" ), unit = "degrees" )
ombrage <- shade (slope = pente$ slope, aspect = pente$ aspect)
plot (ombrage, col = gray (0 : 50 / 50 ),legend = F)
Il apparaît très facile avec les différents outils proposés de cerner les anomalies de la voirie.
Dénombrer le nombre d’anomalies par rue
Reprendre par exemple la couche pente.
Proposition d’une méthode :
On agrège les pixels à leurs voisins selon la valeur.
Code
lissage <- focal (pente, w= 3 , fun = mean, nar.rm= T)
plot (lissage)
seuillage (reclassification) : distinguer les pentes > 30 des autres
Code
lissage <- focal (pente, w= 3 , fun = mean, nar.rm= T)
hist (lissage)
Code
reclassif <- matrix (c (0 ,5 ,1 ,
5 ,83 ,2 ),
ncol = 3 ,
byrow = TRUE )
lissage2 <- classify (lissage, rcl = reclassif)
pal <- c ("white" , "blue" )
plot (lissage2, col = pal)
Code
layer value count
1 1 0 23997
2 1 1 520
3 1 2 4774
4 2 2 870
5 2 83 11
6 2 84 20
7 2 85 104
8 2 86 9
9 2 87 10
10 2 88 7
11 2 89 5
12 2 90 24009
13 2 91 13
14 2 92 11
15 2 93 6
16 2 94 13
17 2 95 49
18 2 96 8
19 2 97 13
20 2 98 22
21 2 99 23
22 2 100 36
23 2 101 28
24 2 102 22
25 2 103 20
26 2 104 10
27 2 105 136
28 2 106 18
29 2 107 20
30 2 108 19
31 2 109 9
32 2 110 18
33 2 111 24
34 2 112 12
35 2 113 22
36 2 114 29
37 2 115 76
38 2 116 29
39 2 117 39
40 2 118 33
41 2 119 39
42 2 120 38
43 2 121 28
44 2 122 34
45 2 123 34
46 2 124 24
47 2 125 40
48 2 126 24
49 2 127 21
50 2 128 18
51 2 129 27
52 2 130 23
53 2 131 17
54 2 132 23
55 2 133 25
56 2 134 26
57 2 135 26
58 2 136 26
59 2 137 33
60 2 138 33
61 2 139 22
62 2 140 34
63 2 141 23
64 2 142 32
65 2 143 40
66 2 144 30
67 2 145 22
68 2 146 26
69 2 147 30
70 2 148 28
71 2 149 27
72 2 150 31
73 2 151 23
74 2 152 33
75 2 153 26
76 2 154 39
77 2 155 31
78 2 156 21
79 2 157 29
80 2 158 21
81 2 159 23
82 2 160 30
83 2 161 25
84 2 162 20
85 2 163 27
86 2 164 32
87 2 165 17
88 2 166 20
89 2 167 15
90 2 168 19
91 2 169 27
92 2 170 24
93 2 171 25
94 2 172 23
95 2 173 18
96 2 174 16
97 2 175 13
98 2 176 22
99 2 177 22
100 2 178 22
101 2 179 26
102 2 180 25
103 2 181 25
104 2 182 18
105 2 183 24
106 2 184 28
107 2 185 21
108 2 186 18
109 2 187 17
110 2 188 16
111 2 189 30
112 2 190 16
113 2 191 18
114 2 192 25
115 2 193 22
116 2 194 30
117 2 195 24
118 2 196 27
119 2 197 17
120 2 198 22
121 2 199 27
122 2 200 19
123 2 201 22
124 2 202 16
125 2 203 19
126 2 204 18
127 2 205 16
128 2 206 14
129 2 207 16
130 2 208 18
131 2 209 13
132 2 210 24
133 2 211 20
134 2 212 16
135 2 213 14
136 2 214 20
137 2 215 20
138 2 216 17
139 2 217 20
140 2 218 14
141 2 219 17
142 2 220 15
143 2 221 23
144 2 222 24
145 2 223 21
146 2 224 16
147 2 225 10
148 2 226 15
149 2 227 19
150 2 228 16
151 2 229 16
152 2 230 16
153 2 231 11
154 2 232 18
155 2 233 15
156 2 234 17
157 2 235 18
158 2 236 20
159 2 237 8
160 2 238 18
161 2 239 19
162 2 240 8
163 2 241 21
164 2 242 9
165 2 243 13
166 2 244 9
167 2 245 16
168 2 246 14
169 2 247 5
170 2 248 14
171 2 249 11
172 2 250 13
173 2 251 14
174 2 252 11
175 2 253 12
176 2 254 13
177 2 255 10
178 2 256 15
179 2 257 7
180 2 258 5
181 2 259 15
182 2 260 15
183 2 261 6
184 2 262 9
185 2 263 13
186 2 264 14
187 2 265 8
188 2 266 10
189 2 267 11
190 2 268 11
191 2 269 10
192 2 270 11
193 2 271 3
194 2 272 14
195 2 273 8
196 2 274 9
197 2 275 5
198 2 276 7
199 2 277 4
200 2 278 8
201 2 279 3
202 2 280 4
203 2 281 9
204 2 282 10
205 2 283 4
206 2 284 3
207 2 285 8
208 2 286 5
209 2 287 5
210 2 288 6
211 2 289 6
212 2 290 5
213 2 291 5
214 2 292 7
215 2 293 5
216 2 294 2
217 2 295 5
218 2 296 6
219 2 297 4
220 2 298 6
221 2 299 9
222 2 300 8
223 2 301 7
224 2 302 8
225 2 303 8
226 2 304 6
227 2 305 9
228 2 306 4
229 2 307 3
230 2 308 8
231 2 309 3
232 2 310 7
233 2 311 2
234 2 312 8
235 2 313 8
236 2 314 4
237 2 315 5
238 2 316 4
239 2 317 2
240 2 318 3
241 2 319 6
242 2 320 5
243 2 321 5
244 2 322 3
245 2 323 3
246 2 324 4
247 2 325 5
248 2 326 6
249 2 327 3
250 2 328 1
251 2 329 5
252 2 330 3
253 2 331 5
254 2 332 6
255 2 333 1
256 2 334 2
257 2 335 7
258 2 336 8
259 2 337 8
260 2 338 4
261 2 339 4
262 2 340 6
263 2 341 2
264 2 342 2
265 2 343 3
266 2 344 2
267 2 345 3
268 2 346 3
269 2 348 2
270 2 349 2
271 2 350 1
272 2 351 1
273 2 352 1
Convertir raster => vecteur et agréger les polygones contigus
Code
library (sf)
v <- as.polygons (lissage2)
v <- st_as_sf (v)
v <- st_cast (v, "POLYGON" )
table (v$ slope)
Code
v <- v [v$ slope == 2 ,]
mapview (v)
Comter le nombre de géométries et leur taille
Code
v$ aire <- st_area (v)
hist (v$ aire)
Code
library (mapsf)
mf_init (v [1 : 10 ,])
mf_map (v, "aire" , type = "choro" , add = T)
Une vérification sur le terrain s’impose bien sûr !