forked from OSGeo/grass-tutorials
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathGRASS_movement_pt.qmd
More file actions
558 lines (379 loc) · 20.1 KB
/
GRASS_movement_pt.qmd
File metadata and controls
558 lines (379 loc) · 20.1 KB
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
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
---
title: "Modelando Movimento no GRASS"
author: "Michael Barton, Leticia Correa, & Anna Petrasova"
date: 2025-05-09
date-modified: today
lightbox: true
engine: knitter
image: img_movement/thumbnail.webp
format:
html:
embed-resources: true
toc: true
code-tools: true
code-copy: true
code-fold: false
page-layout: article
categories: [intermediate, advanced, GUI, raster, cost surface, least cost path, Português]
description: Gerando uma superfície de custo cumulativo e um caminho de menor custo com *r.walk* e *r.path* para modelar o movimento ao caminhar por uma paisagem.
execute:
eval: false
copyright:
holder: Michael Barton, Leticia Correa, & Anna Petrasova
year: 2025
funding: "A criação deste tutorial foi parcialmente apoiada pela bolsa FAIN 2303651 da Fundação Nacional de Ciências dos EUA."
---
GRASS possui ferramentas sofisticadas para modelar o movimento pelo terreno, incluindo [r.cost](https://grass.osgeo.org/grass-stable/manuals/r.cost.html), [r.walk](https://grass.osgeo.org/grass-stable/manuals/r.walk.html), [r.drain](https://grass.osgeo.org/grass-stable/manuals/r.drain.html), e [r.path](https://grass.osgeo.org/grass-stable/manuals/r.path.html). Neste tutorial usaremos ***r.walk*** e ***r.path*** para determinar o melhor caminho percorrido para um destino que será um hospital.
::: {.callout-note title="Dataset"}
Este tutorial usa um dos conjuntos de dados de amostra padrão do GRASS: flagstaff_arizona_usa. Faremos referência a nomes de lugares nesse conjunto de dados, mas ele pode ser completado com qualquer um dos [standard sample data sets](https://grass.osgeo.org/download/data/) para qualquer região - por exemplo, [North Carolina data set](https://grass.osgeo.org/sampledata/north_carolina/nc_basic_spm_grass7.zip). Nós usaremos o DEM de elevação de Flagstaff (*elevation* DEM), o arquivo de pontos vetoriais dos *hospitals* (qualquer outro arquivo de pontos vetoriais servirá) e o mapa raster *uso do solo* (*landuse)* .
Este tutorial foi criado para que você possa concluí-lo usando a interface gráfica do usuário (GUI) do GRASS (**GRASS GUI)**, comandos GRASS do **console ou terminal** ou usando comandos GRASS em um ambiente **Jupyter Notebook**.
:::
::: {.callout-note title="Don't know how to get started?"}
Se você não tem certeza de como começar a usar o GRASS usando sua interface gráfica de usuário ou usando Python, confira os tutoriais [Get started with GRASS GUI](../get_started/fast_track.qmd) e [Get started with GRASS & Python in Jupyter Notebooks](../get_started/fast_track_grass_and_python.qmd).
:::
## O que é uma superfície de custo (cost surface)?
::::: grid
::: g-col-6
- Uma **superfície de custo** é um raster em que cada célula representa o “custo” ou a dificuldade de se mover pela paisagem.
- Uma **superfície de custo cumulativa** *(cumulative cost surface)* mostra o custo total acumulado de deslocamento de um ponto de partida até um local. Superfícies de custo cumulativo também são usadas para encontrar o **caminho de menor custo** *(least cost path)* entre um local e o ponto de partida.
- A ferramenta GRASS [r.walk](https://grass.osgeo.org/grass-stable/manuals/r.walk.html) gera uma superfície de custo cumulativo usando a regra de Naismith para tempos de caminhada, onde cada célula tem o valor em **segundos** do tempo que leva para caminhar do ponto inicial até essa célula.
:::
::: g-col-6
{fig-align="right" width="100%"}
:::
:::::
# Modelagem de movimento com uma superfície de custo cumulativa
## Visão geral
::::: grid
::: g-col-6
1. Comece com um **DEM de elevação** para topografia para determinar os custos de movimentação.
2. Crie um **mapa de atrito** *(friction map)* com um valor de 0 (ou outros valores para custos de movimentação adicionais).
3. Selecione **ponto de partida(s)** *(start point(s))*.
4. Crie uma **superfície de custo** *(cost surface)*.
5. Um caminho de **menor custo** *(least cost)* pode então ser calculado entre qualquer ponto na superfície de custo e o ponto inicial.
:::
::: g-col-6

:::
:::::
## Mapa de atrito
- O comando [map calculator](https://grass.osgeo.org/grass-stable/manuals/r.mapcalc.html) (calculadora de mapa) no GRASS permite criar, alterar ou combinar mapas usando **álgebra de mapas** *(map algebra)*. A calculadora de mapas pode ser usada a partir da interface gráfica do usuário (GUI) ou como um comando.
- Antes de fazer um mapa de fricção você faz um mapa de fricção, certifique-se de que a [**computational region**](https://grass.osgeo.org/grass-stable/manuals/g.region.html) (região computacional) corresponde ao mapa de elevação.
- Crie o mapa *friction0* com 0 em cada célula.
:::::: {.panel-tabset group="language"}
#### GUI
::::: grid
::: g-col-6
1. Adicione o raster de *elevação (elevation)* ao Gerenciador de Camadas *(Layer Manager)*.
2. Clique com o botão direito do mouse na *elevação (elevation)* no Gerenciador de Camadas*(Layer Manager)*.
3. Selecione *defina a região computacional do mapa selecionado* *(set computational region from selected map)*.
4. Abra a **Calculadora de Mapa Raster** *(Raster Map Calculator)* na barra de ferramentas superior (ícone "ábaco/*abacus*").
5. Preencha o nome do mapa de saída (*name for new raster map to create*) como *friction0* e insira 0 no campo de expressão (*expression*).
6. Pressione Executar *(Run)*.
:::
::: g-col-6

:::
:::::
#### Linha de comando
1. Defina a região para corresponder ao mapa de elevação.
2. Crie um mapa de atrito com um valor de 0 em todas as células que corresponda à extensão e resolução do mapa de elevação.
```{bash}
g.region raster=elevation
r.mapcalc "friction0 = 0"
```
#### Python
1. Defina a região para corresponder ao mapa de elevação.
2. Crie um mapa de atrito com um valor de 0 em todas as células que corresponda à extensão e resolução do mapa de elevação.
```{bash}
gs.run_command("g.region", raster="elevation")
gs.mapcalc("friction0 = 0")
```
::::::
## Escolha um ponto de partida
Agora que temos um mapa DEM para terreno e um mapa de atrito, tudo o que precisamos para uma superfície de custo cumulativo é um ponto de partida: o ponto a partir do qual calcular os custos de movimento.
- Um ponto inicial pode ser um ponto vetorial, uma célula raster ou até mesmo um par de coordenadas.
- Uma superfície de custo em *r.walk* pode ter vários pontos iniciais.
- Faremos um ponto de partida no Flagstaff Medical Center, encontrado no arquivo de pontos vetoriais do hospital *(hospitals)*.
:::::: {.panel-tabset group="language"}
#### GUI
::::: grid
::: g-col-6
Use o **Gerenciador de Tabela de Atributos** *(Attribute Table Manager)* para *hospitals*:
1. Exiba o mapa *hospitals* adicionando-o ao Gerenciador de Camadas do Catálogo de Dados.
2. Clique com o botão direito e abra o Gerenciador de Tabela de Atributos (*Attribute Table Manager*).
3. Selecione o registro "Flagstaff Medical Center".
4. Clique com o botão direito e selecione **Extraia recursos selecionados** *(Extract selected features)* do menu de contexto.
5. Nomeie o novo mapa como *FMC*.
:::
::: g-col-6

{width="60%"}
:::
:::::
#### Linha de comando
Use a ferramenta v.extract para criar um mapa de pontos vetoriais chamado *FMC* a partir do mapa de *hospitals*.
```{bash}
v.extract input=hospitals type=point where="FACILITY_N = 'FLAGSTAFF MEDICAL CENTER'" output=FMC
```
#### Python
Use the v.extract tool to create a vector point map named *FMC* from the *hospitals* map.
```{python}
gs.run_command("v.extract",
input="hospitals",
type="point",
where="FACILITY_N = 'FLAGSTAFF MEDICAL CENTER'",
output="FMC")
```
::::::
Use a ferramenta *d.vect* clicando duas vezes em FMC no gerenciador de camadas para exibir o ponto com uma cor e tamanho para vê-lo melhor.

## Gerar a superfície de custo cumulativo {#gerar-superfície-cumulativa-de-custo}
::::::::::::: {.panel-tabset group="language"}
#### GUI
Use a ferramente *r.walk* no menu **Análise Raster/Terreno** (*Raster/Terrain Analysis*)
::::: grid
::: g-col-6
1. Entre com o **mapa de elevação** (*elevation*), **mapa de atrito** (*friction0*), e dê o **nome da superfície de custo** (*name for output raster map*) a ser criada (FMC_cost_seconds).
{fig-align="left" width="100%"}
:::
::: g-col-6
2. Digite um nome para o **mapa de direções** (*FMC_directions*) a ser usado para criar um caminho de menor custo (*name for the output raster map*).
{fig-align="left" width="100%"}
:::
:::::
::::: grid
::: g-col-6
3. Insira o **ponto inicial** (*name of starting vector points in map*) que é o arquivo chamado de FMC.
{fig-align="left" width="100%"}
:::
::: g-col-6
4. Opcional: controlar a **extensão espacial** *(spatial extent)* da superfície de custo.

:::
:::::
::::: grid
::: g-col-6
5. Opcional: ajuste a configuração do **Parâmetro de movimento** *(Movement parameter)*.
{fig-align="left" width="100%"}
:::
::: g-col-6
6. Recomendado: selecione **knight's move** para calcular custo e direção.
{fig-align="left" width="100%"}
:::
:::::
::: {.callout-note title="Tip"}
Clique no botão "copiar" para copiar o comando GRASS. Você pode salvá-lo em um arquivo de texto para reutilização posterior ou para documentar seu trabalho.
:::
#### Linha de comando
- Use o comando r.walk para gerar a superfície de custo cumulativo.
```{bash}
r.walk elevation=elevation friction=friction0 output=FMC_cost_seconds outdir=FMC_directions start_points=FMC -k
```
#### Python
- Use o comando r.walk para gerar a superfície de custo cumulativo.
```{python}
gs.run_command("r.walk",
elevation="elevation",
friction="friction0",
output="FMC_cost_seconds",
outdir="FMC_directions",
start_points="FMC",
flags="k")
```
:::::::::::::
## Mapa de superfície de custo cumulativo
Cada valor de célula raster na superfície de custo é o tempo em segundos para caminhar do FMC até essa célula no terreno do DEM de Flagstaff.

::: {.callout-note title="Tip"}
Dica: Você pode exibir a superfície de custo cumulativo sobre um mapa de relevo sombreado no **gerenciador de camadas** *(layer manager)* usando a ferramenta [d.shade](https://grass.osgeo.org/grass-stable/manuals/d.shade.html) e um mapa de relevo de elevação feito com [r.relief](https://grass.osgeo.org/grass-stable/manuals/d.shade.html).
:::
## Movimento através de uma superfície de custo cumulativo {#movement-across-cost-surface}
Você pode transformar o tempo de caminhada em segundos em horas dividindo o mapa por 3600 usando a calculadora de mapas.
:::::: {.panel-tabset group="language"}
#### GUI
::::: grid
::: g-col-6
1. Abra a calculadora de mapa *(map calculator)*.
2. Digite o nome do novo mapa de tempo de caminhada em horas: *FMC_cost_hours*.
3. Digite FMC_cost_seconds / 3600 no campo de expressões.
4. Pressione Executar *(Run)*.
:::
::: g-col-6
{fig-align="left" width="100%"}
:::
:::::
#### Linha de Comando
```{bash}
r.mapcalc "FMC_cost_hours = FMC_cost_seconds / 3600"
```
#### Python
```{python}
gs.mapcalc("FMC_cost_hours = FMC_cost_seconds / 3600")
```
::::::
------------------------------------------------------------------------
::::: grid
::: g-col-6
- Podemos consultar ou filtrar essa superfície de custo cumulativo por hora para áreas de tempo de caminhada equivalente.
- Por exemplo, no **gerenciador de camadas** *(layer manager)*, podemos usar a ferramenta *d.rast* para mostrar a área dentro de uma caminhada de 2 horas do FMC e, em seguida, definir a opacidade da superfície de custo para 50% para ver o terreno subjacente.
:::
::: g-col-6

:::
:::::

# Caminhos de menor custo {#least-cost-path}
## Visão geral
- Também podemos traçar um **caminho de menor custo** (LCP), que é a rota menos custosa (com menor tempo de viagem) entre qualquer ponto na superfície de custo cumulativo e o FMC.
- Imagine um caminhante perdido a nordeste de Flagstaff que precisa caminhar até o FMC.
- Qual caminho levaria menos tempo?

## Gerando um caminho de menor custo
Para criar um LCP no GRASS, usaremos [r.path](https://grass.osgeo.org/grass-stable/manuals/r.path.html) (também no menu Análise Raster/Terreno - "*Raster/Terrain"*).
:::::::: {.panel-tabset group="language"}
#### GUI
::::: grid
::: g-col-6
1. Insira o **mapa de direções** (FMC_directions) que também criamos quando criamos a superfície de custo cumulativo.

:::
::: g-col-6
2. Insira as **coordenadas do caminhante** *(starting point)* como ponto de partida para o LCP. (Também podemos usar um ponto vetorial predefinido).

:::
:::::
:::: grid
::: g-col-6
3. Especifique o **nome do mapa de caminho do vetor de saída** *(name of the output vector)* que será LCP_cumulative.

:::
::::
#### Linha de comando
```{bash}
r.path input=FMC_directions format=auto vector_path=LCP_cumulative start_coordinates=477476,13914951
```
#### Python
```{python}
gs.run_command("r.path",
input="FMC_directions",
format="auto",
vector_path="LCP_cumulative",
start_coordinates=[477476, 13914951])
```
::::::::
## Caminho de menor custo gerado
Aqui está o resultado do LCP.

# Adicionando um mapa de atrito aos custos de movimentação
## Visão geral
- Um **mapa de atrito** *(friction map)* pode ser usado para incorporar outros fatores além do terreno na criação de uma superfície de custo cumulativo e na modelagem de movimento.
- O valor de cada célula em um raster de mapa de atrito é a quantidade de tempo de caminhada, em segundos/metro, *além do tempo necessário* devido ao terreno.
- Podemos **reclassificar** *(reclassify)* o mapa de *uso do solo* para criar um mapa de atrito da quantidade de tempo extra que levaria para caminhar por diferentes tipos de cobertura do solo.

## Reclassificando o *uso do solo* para criar um mapa fictício
Uma velocidade padrão de caminhada em terreno plano é de cerca de 5 km/h = 0,72 s/m.
Podemos então estimar que levaria mais:
- 3 s/m para caminhar por uma densa floresta de pinheiros e zimbros
- 1 s/m para atravessar uma floresta de coníferas
- 2 s/m para vagar pela área urbana de Flagstaff
- 5 s/m para escalar campos de lava
- 10 s/m para tentar atravessar a água
Podemos criar este mapa de atrito reclassificando o mapa de *uso do solo* usando [*r.reclass*](https://grass.osgeo.org/grass-stable/manuals/r.reclass.html) para atribuir novos valores de atrito às categorias de cobertura do solo existentes.
:::::: {.panel-tabset group="language"}
## GUI
A ferramenta [r.reclass](https://grass.osgeo.org/grass-stable/manuals/r.reclass.html) pode ser encontrada no menu Raster/Alterar (Raster/Change).
::::: grid
::: g-col-6
1. Insira com raster o *uso do solo* (*landuse)* que será reclassificado.
2. Insira *friction_reclassified* para o mapa de saída (output) reclassificado.
3. Insira as regras de reclassificação diretamente na caixa de texto ou a partir de um arquivo de texto salvo. Use o símbolo \* para representar tudo o que não estiver coberto pelas regras de reclassificação específicas.
> 11 90 95 = 10 water\
> 21 thru 24 = 2 urban\
> 31 = 5 lava\
> 41 thru 43 = 1 conifer forest\
> 52 = 3 pinyon juniper woodland\
> \* = 0 no friction
:::
::: g-col-6
- Isso cria um novo mapa de atrito denominado *friction_landcover*.

:::
:::::
## Linha de comando
```{bash}
r.reclass input=landuse output=friction_landcover rules=- << EOF
11 90 95 = 10 water
21 thru 24 = 2 urban
31 = 5 lava
41 thru 43 = 1 conifer forest
52 = 3 pinyon juniper woodland
* = 0 no friction
EOF
```
## Python
```{python}
rules = """\
11 90 95 = 10 water
21 thru 24 = 2 urban
31 = 5 lava
41 thru 43 = 1 conifer forest
52 = 3 pinyon juniper woodland
* = 0 no friction
"""
gs.write_command("r.reclass",
input="landuse",
output="friction_landcover",
rules="-",
stdin=rules)
```
::::::
O mapa de atrito reclassificado (friction_landcover).

## Modificando uma superfície de custo cumulativo com um mapa de atrito.
Agora podemos criar uma nova superfície de custo cumulativo usando esse novo mapa de atrito e convertê-lo de segundos para horas, como fizemos antes:
::: {.panel-tabset group="language"}
#### GUI
1. Siga os procedimentos na seção Gerar a superfície de custo cumulativo e substitua o novo mapa friction_landcover pelo mapa friction0 usado anteriormente.
2. Siga os procedimentos em e substitua o novo mapa friction_landcover pelo mapa friction0 usado anteriormente.
3. Converta a superfície de custo cumulativo em horas em vez de segundos seguindo os procedimentos na seção Movimento em uma superfície de custo cumulativo.
#### Linha de comando
```{bash}
r.walk elevation=elevation friction=friction_landcover output=FMC_vegcost_seconds outdir=FMC_vegcost_directions start_points=FMC -k
r.mapcalc "FMC_vegcost_hours = FMC_vegcost_seconds / 3600"
```
#### Python
```{python}
gs.run_command("r.walk",
elevation="elevation",
friction="friction_landcover",
output="FMC_vegcost_seconds",
outdir="FMC_vegcost_directions",
start_points="FMC",
flags="k")
gs.mapcalc("FMC_vegcost_hours = FMC_vegcost_seconds / 3600")
```
:::

## Caminhos de menor custo e atrito
Podemos criar um novo LCP do caminhante encalhado para o FMC em terrenos onde a cobertura do solo também afeta o custo do movimento.
::: {.panel-tabset group="language"}
#### GUI
1. Siga os procedimentos na seção Caminho de menor custo, substituindo o novo mapa de direção feito junto com a superfície de custo cumulativo pelo mapa de atrito da cobertura do solo.
2. Dê a este novo LCP o nome *LCP_vegcost* para diferenciá-lo do LCP anterior.
#### Linha de comando
```{bash}
r.path input=FMC_vegcost_directions format=auto vector_path=LCP_vegcost start_coordinates=477476,13914951
```
#### Python
```{python}
gs.run_command("r.path",
input="FMC_vegcost_directions",
format="auto",
vector_path="LCP_vegcost",
start_coordinates=[477476, 13914951])
```
:::
- Leva mais tempo para chegar ao FMC se o caminhante tiver que navegar por vegetação densa, além do terreno.
- No mapa abaixo, o terreno colorido pela cobertura do solo; o LCP original com apenas terreno é mostrado pela linha azul. O LCP com um mapa de atrito de cobertura do solo é mostrado pela linha amarela mais grossa.
