generated from jtr13/bookdown-template
-
Notifications
You must be signed in to change notification settings - Fork 24
/
15_geoespacial.Rmd
3458 lines (2669 loc) · 204 KB
/
15_geoespacial.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
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
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
# Dados geoespaciais {#cap15}
## Pré-requisitos do capítulo {-}
Pacotes e dados que serão utilizados neste capítulo.
```{r}
## Pacotes
library(ecodados)
library(here)
library(tidyverse)
library(sf)
library(raster)
library(rgdal)
library(spData)
library(rnaturalearth)
library(geobr)
library(ggplot2)
library(ggspatial)
library(tmap)
library(tmaptools)
library(grid)
library(mapview)
library(leaflet)
library(viridis)
library(knitr)
library(sidrar)
library(landscapetools)
## Dados
# world <- world
# volcano <- volcano
# geo_anfibios_locais <- ecodados::geo_anfibios_locais
# geo_anfibios_especies <- ecodados::geo_anfibios_especies
# geo_vetor_nascentes <- ecodados::geo_vetor_nascentes
# geo_vetor_hidrografia <- ecodados::geo_vetor_hidrografia
# geo_vetor_cobertura <- ecodados::geo_vetor_cobertura
# geo_vetor_rio_claro <- ecodados::geo_vetor_rio_claro
# geo_vetor_brasil <- ecodados::geo_vetor_brasil
# geo_vetor_brasil_anos <- ecodados::geo_vetor_brasil_anos
# geo_vetor_am_sul <- ecodados::geo_vetor_am_sul
# geo_vetor_biomas <- ecodados::geo_vetor_biomas
# geo_vetor_mata_atlantica <- ecodados::geo_vetor_mata_atlantica
# geo_raster_srtm <- ecodados::geo_raster_srtm
# geo_raster_bioclim <- ecodados::geo_raster_bioclim
# geo_raster_globcover_mata_atlantica <- ecodados::geo_raster_globcover_mata_atlantica
```
## Contextualização
Nesta seção, vamos fazer uma breve introdução aos principais conceitos sobre a manipulação e visualização de dados geoespaciais no R. Iremos abordar temas de forma teórica e prática, utilizando a linguagem R, focando em: i) formatos de dados vetoriais e dados raster, ii) Sistemas de Referências de Coordenadas e unidades (geográficas e projetadas), iii) fontes de dados, iv) importar e exportar dados, v) descrição de objetos geoespaciais e vi) principais operações (atributos, espaciais e geométricas). Num segundo momento, criaremos mapas com seus principais elementos como mapas principal e secundário, título, legenda, barra de escala, indicador de orientação (Norte), gride de coordenadas, descrição do Sistema de Referência de Coordenadas e informações de origem dos dados. Por fim, apresentaremos exemplos de aplicações de análises geoespaciais para dados ecológicos, focadas em: i) agregar informações sobre a biodiversidade, ii) preparar dados para compor variáveis preditoras, e iii) como fazer predições espaciais de distribuição de uma espécie e riqueza de espécies.
Esse capítulo segue parte da estrutura organizada por Lovelace et al. [-@lovelace2019], principalmente os Capítulos 2 a 8, sendo adaptado para atender aos principais requisitos que julgamos necessários a estudos ecológicos. Entretanto, não foi possível cobrir todos os assuntos sobre o uso de dados geoespaciais no R, sendo um tema muito extenso que requer a leitura de livros especializados na área como: i) Mas et al. [-@mas2019] [Análise espacial com R](https://bit.ly/2KpSI7C), ii) Wegmann, Leutner & Dech [-@wegmann2016] *Remote Sensing and GIS for Ecologists: Using Open Source Software*, iii) Wegmann, Schwalb-Willmann & Dech [-@wegmann2020] *An Introduction to Spatial Data Analysis Remote Sensing and GIS with Open Source Software*, e iv) Fletcher & Fortin [-@fletcher2018] *Spatial ecology and conservation modeling: Applications with R*. Outros livros sobre a análise geoespacial no R podem ser consultados no Capítulo [11 - Geospatial](https://www.bigbookofr.com/geospatial.html) do [Big Book of R](https://www.bigbookofr.com/index.html).
## Vetor
Dados vetoriais são usados para mapear fenômenos ou objetos espacialmente explícitos que possuem localização ou dimensões bem definidas, representado a partir de formas geométricas (como pontos, linhas e polígonos) e possuem a possibilidade de ter associado a eles informações tabulares. A tabela de atributos é uma tabela que inclui dados geoespaciais e dados alfanuméricos. Os dados geoespaciais são representados por feições geolocalizadas espacialmente (ponto, linha ou polígono), e os dados alfanuméricos (tabela de dados). Dessa forma, a tabela de atributos reúne informações sobre cada feição e pode ser utilizada para realizar filtros ou agregações dos dados de cada feição (Figura \@ref(fig:fig-vetor-tipos)).
```{r fig-vetor-tipos, echo=FALSE, fig.cap="Representação das geometrias de ponto, linha e polígono e atributos. Adaptado de: Olaya [-@olaya2020]."}
knitr::include_graphics("img/cap15_fig01.png")
```
### sf: principal pacote no R para dados vetoriais
Atualmente o principal pacote para trabalhar com dados vetoriais no R é o [`sf`](https://r-spatial.github.io/sf/), que implementou o *Simple Feature* [@sf2018]. Entretanto, outro pacote pode ser tão versátil quanto o `sf`, no caso o [`terra`](https://rspatial.org/terra/index.html), com algumas mudanças na sintaxe que não abordaremos nesse livro por questões de redução de espaço.
Os tipos de geometrias apresentadas são representados por diferentes classes: `POINT`, `LINESTRING` e `POLYGON` para apenas uma feição de cada tipo de geometria; `MULTIPOINT`, `MULTILINESTRING` e `MULTIPOLYGON` para várias feições de cada tipo de geometria e; `GEOMETRYCOLLECTION` para várias feições e tipos de geometrias e classes.
Ao olharmos as informações de um objeto da classe `sf`, podemos notar diversas informações que descrevem o mesmo, numa espécie de cabeçalho:
- **resumo do vetor**: indica o número de feições (linhas) e campos (colunas)
- **tipo da geometria**: umas das sete classes (ou mais outras) listadas anteriormente
- **dimensão**: número de dimensões, geralmente duas (XY)
- **bbox (bordas)**: coordenadas mínimas e máximas da longitude e latitude
- **informação do CRS**: `epsg` ou `proj4string` indicando o CRS (*Coordinate Reference System*)
- **tibble**: tabela de atributos, com destaque para a coluna `geom` ou `geometry` que representa cada feição ou geometria
```{r}
## Dados vetoriais de polígonos do mundo
data(world)
world
```
Podemos fazer um mapa simples utilizando a função `plot()` desse objeto. Para facilitar, escolheremos apenas a primeira coluna `[1]` (Figura \@ref(fig:fig-vetor-mundo)). Caso não escolhermos apenas uma coluna, um mapa para cada coluna será plotado.
::: {.alert .alert-info}
<strong> 📝 Importante </strong>\
Faremos mapas mais elaborados na seção de visualização de dados geoespaciais deste capítulo.
:::
```{r fig-vetor-mundo, fig.cap="Mapa vetorial do mundo."}
## Plot dos polígonos do mundo
plot(world[1], col = viridis::viridis(100), main = "Mapa do mundo")
```
## Raster
Os dados no formato raster consistem em uma matriz (com linhas e colunas) em que os elementos representam células, geralmente igualmente espaçadas (pixels; Figura \@ref(fig:fig-raster)). As células dos dados raster possuem duas informações: i) identificação das células (IDs das células) para especificar sua posição na matriz (Figura \@ref(fig:fig-raster) A) e; ii) valores das células (Figura \@ref(fig:fig-raster) B), que geralmente são coloridos para facilitar a interpretação da variação dos valores no espaço (Figura \@ref(fig:fig-raster) C). Além disso, valores ausentes ou não amostrados são representados por `NA`, ou seja, *not available* (Figura \@ref(fig:fig-raster) B e C).
```{r fig-raster, echo=FALSE, fig.cap="Raster: (A) IDs das células, (B) valores das células, (C) células coloridas. Adaptado de: Lovelace et al. [-@lovelace2019]."}
library(gridExtra)
# Dados
set.seed(42)
small_ras <- raster(matrix(1:16, 4, 4, byrow = TRUE))
small_ras_val <- raster(matrix(sample.int(100, 16), 4, 4, byrow = TRUE))
small_ras_val[c(10, 15)] <- NA
polys <- rasterToPolygons(small_ras, na.rm = FALSE)
# ids das células
p_1 <- spplot(small_ras, colorkey = FALSE, col.regions = "white",
main = "A. IDs das células",
sp.layout = list(
list("sp.polygons", polys, first = FALSE),
list("sp.text", xyFromCell(small_ras_val, 1:ncell(small_ras)),
1:ncell(small_ras))
)
)
# valor das células
p_2 <- spplot(small_ras_val, colorkey = FALSE, col.regions = "white",
main = "B. Valores das céluas",
sp.layout = list(
list("sp.polygons", polys, first = FALSE),
list("sp.text", xyFromCell(small_ras_val,
1:ncell(small_ras_val)),
values(small_ras_val))
)
)
# mapa colorido
p_3 <- spplot(small_ras_val,
col.regions = viridis::viridis(16),
colorkey = FALSE,
main = "C. Valores coloridos")
grid.arrange(p_1, p_2, p_3, ncol = 3)
```
Podemos ainda fazer uma comparação com as representações de dados vetoriais vistos na Figura \@ref(fig:fig-vetor-tipos), mas agora no formato raster (Figura \@ref(fig:fig-raster-tipos)).
```{r fig-raster-tipos, echo=FALSE, fig.cap="Representação das geometrias de ponto, linha e polígono no formato raster. Adaptado de: Olaya [-@olaya2020]."}
knitr::include_graphics("img/cap15_fig02.png")
```
### raster: principal pacote no R para dados raster
Atualmente, o principal pacote para trabalhar com dados raster é o [*raster*](https://rspatial.org/raster/index.html), apesar de existir outros dois: [*terra*](https://rspatial.org/terra/index.html) e [*stars*](https://r-spatial.github.io/stars/), com algumas mudanças na sintaxe que não abordaremos neste livro.
O pacote `raster` fornece uma ampla gama de funções para criar, importar, exportar, manipular e processar dados raster no R. O objeto raster criado à partir do pacote `raster` pode assumir três classes: `RasterLayer`, `RasterStack` e `RasterBrick`.
A classe `RasterLayer` representa apenas uma camada raster. Para criar ou importar um raster no R podemos utilizar a função `raster::raster()`. Observando essa classe, podemos notar as seguintes informações:
- **class**: classe raster do objeto raster
- **dimensions**: número de linhas, colunas e células
- **resolution**: largura e altura da célula
- **extent**: coordenadas mínimas e máximas da longitude e latitude
- **crs**: Sistema de Referência de Coordenadas (*CRS*)
- **source**: fonte dos dados (memória ou disco)
- **names**: nome das camadas
- **values**: valores máximos e mínimos das células
Vamos utilizar os dados `volcano`, que possui informações topográficas (elevação) do vulcão Maunga Whau de Auckland na Nova Zelândia.
```{r}
## Dados de altitude de um vulcão
volcano[1:5, 1:5]
```
Vamos transformar essa matriz de dados em um raster com a função `raster::raster()`.
```{r}
## Rasterlayer
raster_layer <- raster::raster(volcano)
raster_layer
```
Um mapa simples do objeto raster pode ser obtido utilizando a função `plot()`, do próprio pacote `raster` (Figura \@ref(fig:fig-raster-layer)).
```{r fig-raster-layer, fig.cap="Mapa simples de um `RasterLayer`."}
## Plot raster layers
plot(raster_layer, col = viridis::viridis(n = 100))
```
Além da classe `RasterLayer`, há mais duas classes que trabalham com múltiplas camadas: `RasterBrick` e `RasterStack`. Elas diferem em relação ao formato dos arquivos suportados, tipo de representação interna e velocidade de processamento.
A classe `RasterBrick` geralmente corresponde à importação de um único arquivo de imagem de satélite multiespectral (multicamadas) ou a um único objeto com várias camadas na memória. A função `raster::brick()` cria um objeto `RasterBrick`.
```{r}
## Raster layers
raster_layer1 <- raster_layer
raster_layer2 <- raster_layer * raster_layer
raster_layer3 <- sqrt(raster_layer)
raster_layer4 <- log10(raster_layer)
## Raster brick
raster_brick <- raster::brick(raster_layer1, raster_layer2,
raster_layer3, raster_layer4)
raster_brick
```
Ao utilizarmos a função `plot()` do pacote `raster`, podemos visualizar os raster contidos no objeto `RasterBrick` (Figura \@ref(fig:fig-raster-brick)).
```{r fig-raster-brick, fig.cap="Mapas simples de um raster `RasterBrick`."}
## Plot raster brick
plot(raster_brick, col = viridis::viridis(n = 25), main = "")
```
Já a classe `RasterStack` permite conectar vários objetos raster armazenados em arquivos diferentes ou vários objetos no ambiente do R. Um `RasterStack` é uma lista de objetos `RasterLayer` com a mesma extensão, resolução e CRS. Uma maneira de criá-lo é com a junção de vários objetos geoespaciais já existentes no ambiente do R ou listar vários arquivos raster em um diretório armazenado no disco. A função `raster::stack()` cria um objeto `RasterStack`.
Outra diferença é que o tempo de processamento, para objetos `RasterBrick` geralmente é menor do que para objetos `RasterStack`. A decisão sobre qual classe `Raster` deve ser usada depende principalmente do caráter dos dados de entrada.
```{r}
## Raster layers
raster_layer1 <- raster_layer
raster_layer2 <- raster_layer * raster_layer
raster_layer3 <- sqrt(raster_layer)
raster_layer4 <- log10(raster_layer)
## Raster stack
raster_stack <- raster::stack(raster_layer1, raster_layer2,
raster_layer3, raster_layer4)
raster_stack
```
Da mesma forma, ao utilizar a função `plot()` do pacote `raster`, podemos visualizar os raster contidos no objeto `RasterStack` (Figura \@ref(fig:fig-raster-stack)).
```{r fig-raster-stack, fig.cap="Mapas simples de um raster `RasterStack`."}
## Plot raster stack
plot(raster_stack, col = viridis::viridis(n = 25), main = "")
```
## Sistema de Referência de Coordenadas e Unidades
Os dados geoespaciais (vetor e raster) possuem ainda um outro componente fundamental que é o Sistema de Referência de Coordenadas, ou do inglês *Coordinate Reference System (CRS)*. Esse componente define a referência espacial dos elementos geoespaciais (vetor e raster) na superfície da Terra. Ele é composto por dois principais conceitos: primeiro, que tipos de unidades estão sendo utilizadas para a representação geográfica, podendo assumir dois tipos - ângulos ou metros, que definem o Sistema de Coordenadas Geográficas e o Sistema de Coordenadas Projetadas, respectivamente. O segundo componente é o *datum*, que é a relação do sistema de coordenadas (geográfica ou projetada) com a superfície da Terra. Esse último componente faz parte de uma área da Cartografia denominada Geodésia que estuda a forma e dimensões da Terra, campo gravitacional e a localização de pontos fixos e sistemas de coordenadas. O livro de Lapaine & Usery [-@lapaine2017] é um excelente material para se aprofundar nesse assunto.
### Sistema de Coordenadas Geográficas
O Sistema de Coordenadas Geográficas utiliza ângulos (graus) para representar feições na superfície da Terra através de dois valores: longitude e latitude. A longitude representa o eixo Leste-Oeste e a latitude o eixo Norte-Sul. Nesse sistema, a superfície da Terra é representada geralmente por uma superfície elipsoidal, pois a Terra é ligeiramente achatada nos polos devido ao movimento de rotação.
### Sistema de Coordenadas Projetadas
O Sistema de Coordenadas Projetadas utiliza um Sistema Cartesiano de Coordenadas em uma superfície plana. Dessa forma, a partir de uma origem traçam-se eixos X e Y e uma unidade linear é utilizada, como o metro. Todos as projeções feitas de sistemas geoespaciais convertem uma superfície tridimensional em uma superfície plana bidimensional. Sendo assim, essa conversão traz consigo algum tipo de distorção em relação à porção real, podendo ser distorções em: i) formas locais, ii) áreas, iii) distâncias, iv) flexão ou curvatura, v) assimetria ou vi) lacunas de continuidade. Dessa forma, um sistema de coordenadas projetadas pode preservar somente uma ou duas dessas propriedades.
Existem três grandes grupos de projeções: i) cilíndricos, ii) cônicos e iii) planares. Na projeção cilíndrica, a superfície da Terra é mapeada em um cilindro, criada tocando a superfície da Terra ao longo de uma ou duas linhas de tangência, sendo utilizada com mais frequência para mapear todo o globo tendo como exemplo mais conhecido a Projeção Universal Transversa de Mercator (UTM). Na projeção cônica, a superfície da Terra é projetada em um cone ao longo de uma linha ou duas linhas de tangência, de modo que as distorções são minimizadas ao longo das linhas e aumentam com a distância das mesmas sendo, portanto, mais adequada para mapear áreas de latitudes médias, tendo como exemplo mais conhecido a Projeção Cônica Equivalente de Albers e a Projeção Cônica Conforme de Lambert. E na projeção plana, também denominada Projeção Azimutal, o mapeamento toca o globo em um ponto ou ao longo de uma linha de tangência, sendo normalmente utilizado no mapeamento de regiões polares, sendo a mais comum a Projeção Azimutal Equidistante, a mesma utilizada na bandeira da ONU.
### Datum
Como dito anteriormente, o *datum* é a relação do sistema de coordenadas com a superfície da Terra. Ele representa o ponto de intersecção do elipsoide de referência com a superfície da Terra (geoide, a forma verdadeira da Terra), compensando as diferenças do campo gravitacional da Terra. Existem dois tipos de datum: i) local e ii) geocêntrico. Em um *datum* local, como o SAD69 - *South American Datum 1969*, o elipsoide de referência é deslocado para se alinhar com a superfície em um determinado local, por exemplo, na América do Sul. Já em um *datum* geocêntrico, como WGS84 - *World Geodetic System 1984*, o centro do elipsoide é o centro de gravidade da Terra e a precisão das projeções não é otimizada para um local específico do globo.
No Brasil, desde 2015, o [Instituto Brasileiro de Geografia e Estatística (IBGE)](https://www.ibge.gov.br/) ajudou a desenvolver e reafirmou o uso do *datum* SIRGAS2000 - *Sistema de Referencia Geocéntrico para las Américas 2000* para todos os mapeamentos realizados no Brasil, um esforço conjunto para adotar o mesmo *datum* em toda a América. Mais sobre esse *datum* pode ser lido aqui: [SIRGAS2000](http://www.sirgas.org/pt/sirgas-realizations/sirgas2000/).
### Sistema de Referência de Coordenadas (CRS) no R
No R, há duas formas principais de representar um Sistema de Referência de Coordenadas: i) código `epsg` e ii) `proj4string`. O código EPSG (*European Petroleum Survey Group*) é uma sequência de números curta, referindo-se apenas a um CRS. O site [epsg.io](http://epsg.io/) permite consultar diversas informações como procurar por um código, representação de mapas e fazer transformações de CRS.
Já o `proj4string` permite mais flexibilidade para especificar diferentes parâmetros, como o tipo de projeção, *datum* e elipsoide. Dessa forma, é possível especificar muitas projeções, ou mesmo modificar as projeções existentes, tornando a representação `proj4string` mais complexa e flexível.
Além disso, ainda é possível consultar uma extensa lista de CRSs no site [spatialreference.org](https://spatialreference.org/), que fornece descrições em diversos formatos, baseados em GDAL e Proj.4. Essa abordagem permite consultar uma URL que pode produzir uma referência espacial em um formato que seu software SIG ou o R pode utilizar como referência.
Os pacotes (geo)espaciais no R suportam uma ampla variedade de CRSs e usam a biblioteca [PROJ](https://proj.org/index.html#). A função `rgdal::make_EPSG()` retorna um `data frame` das projeções disponíveis, com informações dos códigos `epsg` e `proj4string` numa mesma tabela, facilitando a busca e uso de CRSs (Tabela \@ref(tab:tab-epsg)).
```{r eval=FALSE}
## Listagem dos Sistemas de Referências de Coordenadas no R
crs_data <- rgdal::make_EPSG()
head(crs_data)
```
```{r tab-epsg, echo=FALSE}
knitr::kable(
head(rgdal::make_EPSG()),
caption = "Listagem de Sistemas de Referências de Coordenadas disponíveis no R, com informações dos códigos `epsg` e `proj4string`"
)
```
## Principais fontes de dados geoespaciais
Existem diversas fontes de dados geoespaciais em diferentes bases de dados disponíveis gratuitamente. Geralmente essas bases de dados são disponibilizadas separadamente em apenas dados vetoriais e dados raster. Para dados vetoriais, grande parte dos dados disponibilizados são utilizados em mapas como limites políticos, limites de biomas ou distribuição de espécies para polígonos; estradas e rios para dados lineares, ou ainda pontos de ocorrência de espécies ou comunidades, ou medidas tomadas em campo sobre condições naturais como clima ou relevo, como pontos. Entretanto, é sempre recomendado o uso de bases oficiais, principalmente em relação a dados vetoriais de limites políticos. Para tanto, é fundamental buscar as bases oficiais de cada país, entretanto, há bases que podem ser utilizadas globalmente, como veremos.
Sobre as bases de dados raster, há uma infinidade de dados para diferentes objetivos, mas grande parte deles são relativos a condições ambientais, representando uma variável de interesse de forma contínua no espaço, como temperatura, precipitação, elevação, etc.
Há uma compilação de dados geoespaciais vetoriais e raster feita por Marcus Vinícius Alves de Carvalho e Angelica Carvalho Di Maio, chamada [GeoLISTA](http://www.clickgeo.com.br/wp-content/uploads/2018/05/GeoLISTA.pdf). Entretanto, como as bases de dados tendem a ser muito dinâmicas, é possível que muitas bases tenham surgido e desaparecido desde a listagem realizada.
Além das bases de dados, há pacotes específicos no R que fazem o download de dados vetoriais e rasters, facilitando a aquisição e reprodutibilidade. Para conferir uma listagem completa de pacotes para diversas análises espaciais, veja [CRAN Task View: Analysis of Spatial Data](https://cran.r-project.org/web/views/Spatial.html).
### Vetor
Dentre as bases vetoriais, destacamos as seguintes na Tabela \@ref(tab:tab-vetor-bases).
```{r tab-vetor-bases, echo=FALSE}
knitr::kable(
tibble(
`Bases de dados` = c("[IBGE](https://www.ibge.gov.br/geociencias/downloads-geociencias.html)",
"[FBDS](http://geo.fbds.org.br/)",
"[GeoBank](http://geosgb.cprm.gov.br/)",
"[Pastagem.org](http://maps.lapig.iesa.ufg.br)",
"[CanaSat](http://www.dsr.inpe.br/laf/canasat/)",
"[CSR Maps](http://maps.csr.ufmg.br)",
"[Ecoregions](https://ecoregions2017.appspot.com/)",
"[UN Biodiversity Lab](https://www.unbiodiversitylab.org/)",
"[Biodiversity Hotspots](https://zenodo.org/record/3261807#.YA8lpPv0nOY)",
"[IUCN Red List of Threatened Species](https://www.iucnredlist.org/resources/spatial-data-download)",
"[Map of Life (MOL)](https://mol.org/)",
"[Key Biodiversity Areas](http://www.keybiodiversityareas.org/kba-data/request)",
"[HydroSHEDS](https://www.hydrosheds.org/)",
"[Global Roads Inventory Project (GRIP)](https://www.globio.info/download-grip-dataset)",
"[Database of Global Administrative Areas (GADM)](https://gadm.org/)",
"[Natural Earth](https://www.naturaleatoriorthdata.com/)",
"[Protected Planet](https://www.protectedplanet.net)",
"[Global Biological Information Facility (GBIF)](http://www.gbif.org)",
"[Species Link](http://www.splink.cria.org.br)",
"[Global Invasive Species Information Network (GISIN)](http://www.gisin.org)"),
Descrição = c("Limites territoriais e censitários do Brasil",
"Uso da terra, APP e hidrografia - Mata Atlântica e Cerrado",
"Dados geológicos do Brasil",
"Dados de pastagens e gado para o Brasil",
"Dados de cana-de-açúcar para o Brasil",
"Diversos dados vetoriais e raster para o Brasil",
"Dados de biorregiões e biomas do mundo",
"Diversas bases de dados para o mundo",
"Dados dos limites dos Hotspots de Biodiversidade",
"Dados dos limites das distribuições das espécies para o mundo",
"Dados da distribuição de espécies e outros dados para o mundo",
"Dados dos limites das Key Biodiversity Areas",
"Informações hidrológicas do mundo",
"Dados de estradas do mundo todo",
"Limites de áreas administrativas do mundo",
"Diversos limites para o mundo",
"Limites de áreas protegidas para o mundo",
"Dados de ocorrências de espécies para o mundo",
"Dados de ocorrências de espécies para o Brasil",
"Dados de ocorrências de espécies invasoras para o Mundo")),
caption = "Principais bases de dados vetoriais para o Brasil e o Mundo.",
booktabs = TRUE
)
```
### Raster
Dentre as bases raster, destacamos as seguintes na Tabela \@ref(tab:tab-raster-bases).
```{r tab-raster-bases, echo=FALSE}
knitr::kable(tibble(
`Bases de dados` = c("[MapBiomas](https://mapgeo_vetor_biomas.org/)",
"[Bahlu](ftp://madeira.dea.ufv.br/bdados/bhalu/)",
"[USGS](https://www.usgs.gov/)",
"[SRTM](http://srtm.csi.cgiar.org/)",
"[Geoservice Maps](https://geoservice.dlr.de/web/maps)",
"[Global Forest Watch](https://www.globalforestwatch.org/)",
"[GlobCover](http://due.esrin.esa.int/page_globcover.php)",
"[Landcover](https://www.earthenv.org/landcover)",
"[Global Human Footprint](https://wcshumanfootprint.org/)",
"[GHSL - Global Human Settlement Layer](https://ghsl.jrc.ec.europa.eu/download.php)",
"[Land-Use Harmonization (LUH2)](https://luh.umd.edu/)",
"[ESA Climate Change Initiative](https://climate.esa.int/en/odp/#/dashboard)",
"[WorldClim](https://www.worldclim.org/)",
"[CHELSA](https://chelsa-climate.org/)",
"[EarthEnv](https://www.earthenv.org/)",
"[SoilGrids](https://soilgrids.org/)",
"[Global Wetlands](https://www2.cifor.org/global-wetlands/)",
"[Global Surface Water Explorer](https://global-surface-water.appspot.com/#)",
"[MARSPEC](http://www.marspec.org/)",
"[Bio-ORACLE](http://www.oracle.ugent.be/)"),
Descrição = c("Uso e cobertura da terra para o Brasil, Panamazonia Legal, Chaco e Mata Atlântica de 1985 a 2020",
"Distribuições históricas de terras agrícolas e pastagens para todo o Brasil de 1940 a 2012",
"Dados de diversos satélites livres para o mundo",
"Dados de elevação para o mundo",
"Dados de elevação e florestas para o mundo",
"Dados de florestas para o mundo",
"Dados de uso e cobertura da terra para todo o planeta",
"Dados de uso e cobertura da terra para todo o planeta",
"Dados de pegada ecológica para o mundo",
"Dados e ferramentas abertos e gratuitos para avaliar a presença humana no planeta",
"Dados atuais e previsões de uso da terra",
"Arquivos globais de observação da Terra nos últimos 30 anos da Agência Espacial Europeia (ESA)",
"Dados climáticos para o mundo",
"Dados climáticos para o mundo",
"Dados de cobertura da terra, nuvens, relevo e hidrografia",
"Dados de solo para o mundo",
"Dados de áreas úmidas para o mundo",
"Dados de águas superficiais para o mundo",
"Dados de condições do oceano para o mundo",
"Dados de condições do oceano para o mundo")),
caption = "Principais bases de dados raster para o Brasil e o Mundo.",
booktabs = TRUE
)
```
### Pacotes do R
Dentre os pacotes no R para download de dados geoespaciais, destacamos os seguintes na Tabela \@ref(tab:tab-packages-bases).
```{r tab-packages-bases, echo=FALSE}
knitr::kable(
tibble(
Pacotes = c("[geobr](https://cran.r-project.org/web/packages/geobr/index.html)",
"[rnaturalearth](https://cran.r-project.org/web/packages/rnaturalearth/index.html)",
"[geodata](https://cran.r-project.org/web/packages/geodata/index.html)",
"[rworldmap](https://cran.r-project.org/web/packages/rworldmap/index.html)",
"[spData](https://cran.r-project.org/web/packages/spData/index.html)",
"[OpenStreetMap](https://cran.r-project.org/web/packages/OpenStreetMap/index.html)",
"[osmdata](https://cran.r-project.org/web/packages/osmdata/index.html)",
"[geonames](https://cran.r-project.org/web/packages/geonames/index.html)",
"[rgbif](https://cran.r-project.org/web/packages/rgbif/index.html)",
"[maptools](https://cran.r-project.org/web/packages/maptools/index.html)",
"[marmap](https://cran.r-project.org/web/packages/marmap/index.html)",
"[oce](https://cran.r-project.org/web/packages/oce/index.html)",
"[envirem](https://cran.r-project.org/web/packages/envirem/index.html)",
"[sdmpredictors](https://cran.r-project.org/web/packages/sdmpredictors/index.html)",
"[metScanR](https://cran.r-project.org/web/packages/metScanR/index.html)",
"[ClimDown](https://cran.r-project.org/web/packages/ClimDown/index.html)",
"[rWBclimate](https://cran.r-project.org/web/packages/rWBclimate/index.html)",
"[rnoaa](https://cran.r-project.org/web/packages/rnoaa/index.html)",
"[RNCEP](https://cran.r-project.org/web/packages/RNCEP/index.html)",
"[smapr](https://cran.r-project.org/web/packages/smapr/index.html)"),
Descrição = c("Carrega Shapefiles de Conjuntos de Dados Espaciais Oficiais do Brasil",
"Dados do mapa mundial da Natural Earth",
"Diversas bases de dados para o mundo",
"Visualização de dados globais",
"Conjuntos de dados para análise espacial",
"Acesso para abrir imagens raster de mapas de ruas",
"Baixa e importa dados do OpenStreetMap",
"Interface para o serviço da Web de consulta espacial 'Geonames'",
"Interface para o Global 'Biodiversity' Information Facility API",
"Ferramentas para lidar com objetos geoespaciais",
"Importar, traçar e analisar dados batimétricos e topográficos",
"Fonte e processamento de dados oceanográficos",
"Geração de variáveis ENVIREM",
"Conjuntos de dados preditor de modelagem de distribuição de espécies",
"Encontra, mapeia e coleta dados e metadados ambientais",
"Biblioteca de redução de escala do clima para a produção diária do modelo climático",
"Acessa dados climáticos do Banco Mundial",
"Dados meteorológicos 'NOAA' de R",
"Obtém, organiza e visualiza dados meteorológicos NCEP",
"Aquisição e processamento de dados ativos-passivos (SMAP) de umidade do solo da NASA")),
caption = "Principais pacotes no R para download de dados vetoriais e raster.",
booktabs = TRUE
)
```
## Importar e exportar dados geoespaciais
Agora que sabemos o que são dados geoespaciais e em quais bases de dados podemos buscar e baixar esses dados, veremos seus principais formatos e como importá-los e exportá-los do R.
### Principais formatos de arquivos geoespaciais
Há diversos formatos de arquivos geoespaciais, alguns específicos para dados vetoriais e raster, e outros no formato de banco de dados geoespaciais, como [PostGIS](https://postgis.net/), que podem armazenar ambos os formatos.
Entretanto, todos os formatos para serem importados para o R usam o [GDAL (*Geospatial Data Abstraction Library*)](https://gdal.org/), uma interface unificada para leitura e escrita de diversos formatos de arquivos geoespaciais, sendo utilizado também por uma série de softwares de GIS como QGIS, GRASS GIS e ArcGIS.
Dentre esses formatos, destacamos os seguintes na Tabela \@ref(tab:tab-formatos).
```{r tab-formatos, echo=FALSE}
knitr::kable(
tibble::tibble(
Nome = c("ESRI Shapefile", "GeoJSON", "KML", "GPX", "GeoTIFF", "Arc ASCII", "NetCDF", "BIL", "R-raster", "SQLite/SpatiaLite", "ESRI FileGDB", "GeoPackage"),
extensão = c(".shp (arquivo principal)", ".geojson", ".kml", ".gpx", ".tif/.tiff", ".asc", ".nc", ".bil/.hdr", ".gri/ .grd", ".sqlite", ".gdb", ".gpkg"),
Descrição = c("Formato popular que consiste em pelo menos quatro arquivos: .shp (feição), .dbf (tabela de atributos), .shx (ligação entre .shp e .dbf) e .prj (projeção)", "Estende o formato de troca JSON incluindo um subconjunto da representação de recurso simples", "Formato baseado em XML para visualização espacial, desenvolvido para uso com o Google Earth. O arquivo KML compactado forma o formato KMZ", "Esquema XML criado para troca de dados de GPS", "Formato raster popular. Um arquivo TIFF contendo metadados espaciais adicionais.", "Formato de texto em que as primeiras seis linhas representam o cabeçalho raster, seguido pelos valores das células raster organizadas em linhas e colunas", "NetCDF (Network Common Data Form) é um conjunto de bibliotecas de software e formatos de dados independentes que suportam a criação, acesso e compartilhamento de dados científicos orientados a arrays", "BIL (Banda intercalada por linha) são métodos comuns de organização para imagens multibanda, geralmente acompanhados por um arquivo .hdr, descrevendo atributos específicos da imagem", "Formato raster nativo do raster do pacote R", "Banco de dados relacional autônomo", "objetos geoespaciais e não espaciais criados pelo ArcGIS. Permite: várias classes de recursos; topologia", "Contêiner de banco de dados leve baseado em SQLite permitindo uma troca fácil e independente de plataforma de geodados"),
Tipo = c("Vetor", "Vetor", "Vetor", "Vetor", "Raster", "Raster", "Raster", "Raster", "Raster", "Vetor e raster", "Vetor e raster", "Vetor e raster"),
Modelo = c("Parcialmente aberto", "Aberto", "Aberto", "Aberto", "Aberto", "Aberto", "Aberto", "Aberto", "Aberto", "Aberto", "Proprietário", "Aberto")),
caption = "Principais formatos de arquivos geoespaciais. Adaptado de: Lovelace et al. [-@lovelace2019]."
)
```
O formato mais comum para arquivos vetoriais é o [ESRI Shapefile](https://doc.arcgis.com/en/arcgis-online/reference/shapefiles.htm); para arquivos raster é o [GeoTIFF](https://gdal.org/drivers/raster/gtiff.html); e para dados climáticos em múltiplas camadas, geralmente há a disponibilização de dados no formato [NetCDF](https://www.unidata.ucar.edu/software/netcdf/). Entretanto, recentemente tivemos o surgimento do [GeoPackage](https://www.geopackage.org/), que possui diversas vantagens em relação aos formatos anteriores, podendo armazenar em apenas um arquivo, dados no formato vetorial, raster e também dados não-espaciais (e.g., tabelas), além de possuir uma grande integração com diversos softwares e bancos de dados.
### Importar dados
As principais funções para importar dados no R são: i) para vetores a função `sf::st_read()`, e ii) para raster a função `raster::raster()` e suas variações `raster::brick()` e `raster::stack()` para múltiplas camadas. Essas funções atribuem objetos ao seu espaço de trabalho, armazenando-os na memória RAM disponível em seu hardware, sendo essa a maior limitação para trabalhar com dados geoespaciais no R. Por exemplo, se um arquivo raster possui mais de 8 Gb de tamanho, e seu computador possui exatamente 8 Gb de RAM, é muito provável que ele não seja importado ou mesmo criado como um objeto dentro do ambiente R. Existem soluções para esses problemas, mas não as abordaremos neste capítulo.
**Vetor**
Como vimos, os arquivos vetoriais são disponibilizados em diversos formatos. Para sabermos se um determinado formato pode ser importado ou exportado utilizando o pacote `sf`, podemos utilizar a função `sf::st_drivers()`. Uma amostra desses formatos é apresentado na Tabela \@ref(tab:tab-vetor-formatos).
```{r eval=FALSE}
## Formatos vetoriais importados e exportados pelo pacote sf
head(sf::st_drivers())
```
```{r tab-vetor-formatos, echo=FALSE}
da <- head(st_drivers())
rownames(da) <- NULL
knitr::kable(
da,
caption = "Alguns formatos vetoriais importados e exportados pelo pacote `sf`."
)
```
**Importar dados vetoriais existentes**
Para importar vetores existentes para o R, utilizaremos a função `sf::st_read()`. A estrutura é semelhante para todos os formatos descritos na Tabela \@ref(tab:tab-vetor-formatos), de modo que sempre preencheremos o argumento `dsn` (*data source name*) com o nome do arquivo a ser importado. Entretanto, para banco de dados, como *GeoPackage*, pode ser necessário especificar a camada que se tem interesse com um segundo argumento chamado `layer`, com o nome da camada.
Para quase todas as operações vetoriais nesse capítulo, usaremos os dados disponíveis para o município de Rio Claro/SP. Primeiramente, baixaremos esses dados da [FBDS (Fundação Brasileira para o Desenvolvimento Sustentável)](https://www.fbds.org.br/), através desse [repositório de dados](http://geo.fbds.org.br/). Em 2013, a FBDS deu início ao Projeto de Mapeamento em Alta Resolução dos Biomas Brasileiros, mapeando a cobertura da terra, hidrografia (nascentes, rios e lagos) e Áreas de Preservação Permanente (APPs). O mapeamento foi concluído para os municípios dos Biomas Mata Atlântica e Cerrado, e mais recentemente para os outros biomas. Para fazer o download dos arquivos de interesse, utilizaremos o R, através da função `download.file()`.
Primeiramente, criaremos um diretório com a função `dir.create()`, usando a função `here::here()` para indicar o repositório (ver o Capítulo \@ref(cap5)).
```{r eval=TRUE}
## Criar diretório
dir.create(here::here("dados"))
dir.create(here::here("dados", "vetor"))
```
Em seguida, vamos fazer o download de pontos de nascentes, linhas de hidrografia e polígonos de cobertura da terra para o município de Rio Claro/SP.
```{r eval=FALSE}
## Aumentar o tempo de download
options(timeout = 1e3)
## Download
for(i in c(".dbf", ".prj", ".shp", ".shx")){
# Pontos de nascentes
download.file(
url = paste0("http://geo.fbds.org.br/SP/RIO_CLARO/HIDROGRAFIA/SP_3543907_NASCENTES", i),
destfile = here::here("dados", "vetor", paste0("SP_3543907_NASCENTES", i)), mode = "wb")
# Linhas de hidrografia
download.file(
url = paste0("http://geo.fbds.org.br/SP/RIO_CLARO/HIDROGRAFIA/SP_3543907_RIOS_SIMPLES", i),
destfile = here::here("dados", "vetor", paste0("SP_3543907_RIOS_SIMPLES", i)), mode = "wb")
# Polígonos de cobertura da terra
download.file(
url = paste0("http://geo.fbds.org.br/SP/RIO_CLARO/USO/SP_3543907_USO", i),
destfile = here::here("dados", "vetor", paste0("SP_3543907_USO", i)), mode = "wb")
}
```
Caso o download não funcione ou haja problemas com a importação, disponibilizamos os dados também no pacote `ecodados`.
```{r eval=FALSE}
## Importar os dados pelo pacote ecodados
ecodados::geo_vetor_nascentes
ecodados::geo_vetor_hidrografia
ecodados::geo_vetor_cobertura
```
Agora podemos importar esses dados para o R. Primeiro vamos importar as nascentes (Figura \@ref(fig:fig-vetor-nascentes)).
```{r}
## Importar nascentes
geo_vetor_nascentes <- sf::st_read(
here::here("dados", "vetor", "SP_3543907_NASCENTES.shp"), quiet = TRUE)
```
```{r fig-vetor-nascentes, fig.cap="Mapa de nascentes de Rio Claro/SP."}
## Plot
plot(geo_vetor_nascentes[1], pch = 20, col = "blue", main = NA,
axes = TRUE, graticule = TRUE)
```
Agora vamos importar a hidrografia (Figura \@ref(fig:fig-vetor-hidrografia)).
```{r}
## Importar hidrografia
geo_vetor_hidrografia <- sf::st_read(
here::here("dados", "vetor", "SP_3543907_RIOS_SIMPLES.shp"), quiet = TRUE)
```
```{r fig-vetor-hidrografia, fig.cap="Mapa da hidrografia de Rio Claro/SP."}
## Plot
plot(geo_vetor_hidrografia[1], col = "steelblue", main = NA, axes = TRUE, graticule = TRUE)
```
E por fim, vamos importar a cobertura da terra (Figura \@ref(fig:fig-vetor-cobertura)).
```{r}
## Importar cobertura da terra
geo_vetor_cobertura <- sf::st_read(
here::here("dados", "vetor", "SP_3543907_USO.shp"), quiet = TRUE)
```
```{r fig-vetor-cobertura, fig.cap="Mapa de cobertura da terra de Rio Claro/SP."}
## Plot
plot(geo_vetor_cobertura[5],
col = c("blue", "orange", "gray30", "forestgreen", "green"),
main = NA, axes = TRUE, graticule = TRUE)
legend(x = .1, y = .3, pch = 15, cex = .7, pt.cex = 2.5,
legend = (geo_vetor_cobertura$CLASSE_USO),
col = c("blue", "orange", "gray30", "forestgreen", "green"))
```
**Importar utilizando pacotes**
Além de dados existentes, podemos importar dados vetoriais de pacotes, como listado anteriormente na Tabela \@ref(tab:tab-packages-bases). Para o Brasil, o pacote mais interessante trata-se do [`geobr`](https://ipeagit.github.io/geobr/), do [Instituto de Pesquisa Econômica Aplicada (IPEA)](https://www.ipea.gov.br/portal/), que possui dados oficiais do [Instituto Brasileiro de Geografia e Estatística (IBGE)](https://www.ibge.gov.br/).
É possível listar todos os dados disponíveis no pacote através da função `geobr::list_geobr()`. Na Tabela \@ref(tab:tab-vetor-dados-geobr) é possível ver alguns desses dados.
```{r eval=FALSE}
## Listar todos os dados do geobr
geobr::list_geobr()
```
```{r tab-vetor-dados-geobr, echo=FALSE}
knitr::kable(
head(geobr::list_geobr()),
caption = "Alguns dados disponíveis no pacote `geobr`."
)
```
Como exemplo, vamos fazer o download o limite do município de Rio Claro/SP, utilizando o código do município (3543907) (Figura \@ref(fig:fig-vetor-rio-claro)).
::: {.alert .alert-info}
<strong> 📝 Importante </strong>\
Para saber todos os códigos dos municípios do Brasil, recomendamos a verificação no [site do IBGE](https://www.ibge.gov.br/explica/codigos-dos-municipios.php).
:::
```{r}
## Polígono do limite do município de Rio Claro
geo_vetor_rio_claro <- geobr::read_municipality(code_muni = 3543907,
year = 2020, showProgress = FALSE)
```
Caso o download não funcione ou haja problemas com a importação, disponibilizamos os dados também no pacote `ecodados`.
```{r eval=FALSE}
## Importar os dados pelo pacote ecodados
ecodados::geo_vetor_rio_claro
```
```{r fig-vetor-rio-claro, fig.cap="Limite do município de Rio Claro/SP."}
## Plot
plot(geo_vetor_rio_claro[1], col = "gray", main = NA, axes = TRUE, graticule = TRUE)
```
Já para o mundo, o pacote mais interessante trata-se do [`rnaturalearth`](https://docs.ropensci.org/rnaturalearth/), que faz o download de dados do [Natural Earth](https://www.naturaleatoriorthdata.com/). Vamos fazer o download do limite do Brasil (Figura \@ref(fig:fig-vetor-brasil)).
```{r}
## Polígono do limite do Brasil
geo_vetor_brasil <- rnaturalearth::ne_countries(scale = "large",
country = "Brazil", returnclass = "sf")
```
Caso o download não funcione ou haja problemas com a importação, disponibilizamos os dados também no pacote `ecodados`.
```{r eval=FALSE}
## Importar os dados pelo pacote ecodados
ecodados::geo_vetor_brasil
```
```{r fig-vetor-brasil, fig.cap="Limite do Brasil."}
## Plot
plot(geo_vetor_brasil[1], col = "gray", main = NA, axes = TRUE, graticule = TRUE)
```
**Criar um objeto espacial de uma tabela de coordenadas**
É muito comum em coletas de campo ou bases de dados, ter coordenadas de locais de estudo ou de ocorrências de espécies organizadas em tabelas. Essas tabelas devem possuir duas colunas: longitude e latitude, ou X e Y para dados UTM, por exemplo. Ao importá-las para o R, o formato que assumem pode ser de uma das classes: `matrix`, `data frame` ou `tibble`, ou seja, ainda não são da classe vetorial `sf`. Nesta seção iremos ver como fazer essa conversão.
Para tanto, vamos usar os dados de comunidades de anfíbios da Mata Atlântica (Atlantic Amphibians, Vancine et al. [-@vancine2018]). Faremos o download diretamente do site da fonte dos dados. Antes vamos criar um diretório.
```{r eval=TRUE}
## Criar diretório
dir.create(here::here("dados", "tabelas"))
```
Em seguida, vamos fazer o download de um arquivo `.zip` e vamos extrair usando a função `unzip()` nesse mesmo diretório.
```{r eval=FALSE}
## Download
download.file(url = "https://esajournals.onlinelibrary.wiley.com/action/downloadSupplement?doi=10.1002%2Fecy.2392&file=ecy2392-sup-0001-DataS1.zip",
destfile = here::here("dados", "tabelas", "atlantic_amphibians.zip"), mode = "wb")
## Unzip
unzip(zipfile = here::here("dados", "tabelas", "atlantic_amphibians.zip"),
exdir = here::here("dados", "tabelas"))
```
Agora podemos importar a tabela de dados com a função `readr::read_csv()`.
```{r}
## Importar tabela de locais
geo_anfibios_locais <- readr::read_csv(
here::here("dados", "tabelas", "ATLANTIC_AMPHIBIANS_sites.csv"),
locale = readr::locale(encoding = "latin1")
)
geo_anfibios_locais
```
Caso o download não funcione ou haja problemas com a importação, disponibilizamos os dados também no pacote `ecodados`.
```{r eval=FALSE}
## Importar os dados pelo pacote ecodados
ecodados::geo_anfibios_locais
```
Por fim, podemos facilmente criar um objeto espacial do tipo `MULTIPOINT` utilizando a função `sf::st_as_sf()`. Podemos ver essas coordenadas plotadas no mapa simples da Figura \@ref(fig:fig-vetor-pontos-atlantic-amphibians) [@vancine2018].
É necessário antes se ater ao argumento `coords` que deve indicar as colunas de longitude e latitude, nessa ordem; e também ao argumento `crs` para indicar o CRS correspondente dessas coordenadas, que aqui sabemos se tratar de coordenadas geográficas e datum WGS84. Então podemos facilmente utilizar o código EPSG 4326. Entretanto, se as coordenadas estiverem em metros, por exemplo, teremos de nos ater a qual CRS as mesmas foram coletadas, ou seja, se forem coordenadas de GPS, é preciso saber como o GPS estava configurado (projeção e datum).
```{r}
## Converter dados tabulares para sf
geo_anfibios_locais_vetor <- geo_anfibios_locais %>%
sf::st_as_sf(coords = c("longitude", "latitude"), crs = 4326)
geo_anfibios_locais_vetor
```
```{r fig-vetor-pontos-atlantic-amphibians, fig.cap="Coordenadas das comunidades do Atlantic Amphibians."}
## Plot
plot(geo_anfibios_locais_vetor[1], pch = 20, col = "black",
main = NA, axes = TRUE, graticule = TRUE)
```
**Converter dados espaciais sp para sf**
O pacote `sf` é mais recente e mais fácil de manipular objetos vetoriais no R. Seu predecessor, o pacote `sp` possui uma classe própria e homônima. Entretanto, muitos pacotes de análises espaciais ainda utilizam essa classe em suas funções, apesar dessa migração ter ocorrido rapidamente recentemente. Dessa forma, a conversão entre essas classes pode ser necessária em alguns momentos.
Abaixo, veremos como podemos fazer essa conversão facilmente. Primeiramente, vamos importar dados `sp`.
```{r}
## Polígonos países sp
co110_sp <- rnaturalearth::countries110
class(co110_sp)
```
Agora, podemos converter facilmente com a função `sf::st_as_sf()`.
```{r}
## Polígonos países sf
co110_sf <- sf::st_as_sf(co110_sp)
class(co110_sf)
```
Podemos facilmente converter esse objeto novamente para a classe `sp` com a função `sf::as_Spatial()`.
```{r}
## Polígonos países sp
co110_sp <- sf::as_Spatial(co110_sf)
class(co110_sp)
```
**Raster**
Para importar dados raster no R, utilizaremos a função `raster::raster()`, `raster::brick()` ou `raster::stack()`. Para apenas uma camada raster, usaremos a função `raster::raster()`, com o argumento `x` sendo o nome do arquivo. Já para mais camadas, usaremos `raster::brick()` para um arquivo que possua múltiplas camadas, ou ainda a função `raster::stack()` para vários arquivos em diferentes camadas também no argumento `x`, sendo necessário listar os arquivos no diretório, geralmente utilizando a função `dir()` ou `list.files()`. Entretanto, para especificar uma camada, podemos utilizar o argumento `band` ou `layer` e o nome dessa camada.
**Raster Layer**
Primeiramente, vamos criar um diretório para os dados raster que fazeremos o download.
```{r eval=TRUE}
## Criar diretório
dir.create(here::here("dados", "raster"))
```
Em seguida, vamos fazer o download de dados de elevação, na verdade dados de Modelo Digital de Elevação (*Digital Elevation Model* - DEM), localizados também para o município de Rio Claro. Utilizaremos os dados do [*Shuttle Radar Topography Mission - SRTM*](https://srtm.csi.cgiar.org/). Para saber mais sobre esses dados, recomendamos a leitura do artigo de Farr et al. [-@farr_shuttle_2007].
```{r eval=FALSE}
## Aumentar o tempo de download
options(timeout = 1e3)
## Download
download.file(url = "https://srtm.csi.cgiar.org/wp-content/uploads/files/srtm_5x5/TIFF/srtm_27_17.zip",
destfile = here::here("dados", "raster", "srtm_27_17.zip"), mode = "wb")
## Unzip
unzip(zipfile = here::here("dados", "raster", "srtm_27_17.zip"),
exdir = here::here("dados", "raster"))
```
Caso o download não funcione ou haja problemas com a importação, disponibilizamos os dados também no pacote `ecodados`.
```{r eval=FALSE}
## Importar os dados pelo pacote ecodados
ecodados::geo_raster_srtm
```
Agora podemos importar essa camada para o R, e visualizá-la em relação ao limite do município de Rio Claro/SP (Figura \@ref(fig:fig-raster-dem)).
```{r}
## Importar raster de altitude
geo_raster_srtm <- raster::raster(here::here("dados", "raster", "srtm_27_17.tif"))
geo_raster_srtm
```
```{r fig-raster-dem, fig.cap="Camada raster do DEM em relação ao limite do município de Rio Claro/SP."}
## Plot
plot(geo_raster_srtm, col = viridis::viridis(10))
plot(geo_vetor_rio_claro$geom, col = NA, border = "red", lwd = 2, add = TRUE)
```
**Raster Stack**
Além dos dados de elevação, dados de temperatura e precipitação podem ser obtidos do [WorldClim](https://www.worldclim.org/). Para saber mais sobre esses dados, recomendamos a leitura do artigo Fick & Hijmans [-@fick_worldclim_2017].
```{r eval=FALSE}
## Aumentar o tempo de download
options(timeout = 1e3)
## Download
download.file(url = "https://biogeo.ucdavis.edu/data/worldclim/v2.1/base/wc2.1_10m_bio.zip",
destfile = here::here("dados", "raster", "wc2.0_10m_bio.zip"), mode = "wb")
## Unzip
unzip(zipfile = here::here("dados", "raster", "wc2.0_10m_bio.zip"),
exdir = here::here("dados", "raster"))
```
Caso o download não funcione ou haja problemas com a importação, disponibilizamos os dados também no pacote `ecodados`.
```{r eval=FALSE}
## Importar os dados pelo pacote ecodados
ecodados::geo_raster_bioclim
```
Para importar essa série de camadas, primeiramente listaremos os arquivos e depois importaremos no formato `RasterStack` (Figura \@ref(fig:fig-raster-wc)).
```{r}
## Listar arquivos
arquivos_raster <- dir(path = here::here("dados", "raster"), pattern = "wc") %>%
grep(".tif", ., value = TRUE)
arquivos_raster
## Importar vários rasters como stack
geo_raster_bioclim <- raster::stack(here::here("dados", "raster", arquivos_raster))
geo_raster_bioclim
```
```{r fig-raster-wc, fig.cap="Camadas rasters do WorldClim (BIO01 e BIO12) para o mundo."}
## Plot
plot(geo_raster_bioclim[[c(1, 4)]], col = viridis::viridis(10))
```
### Exportar dados
Saber a melhor forma de exportar dados geoespaciais de objetos recém-criados no R é fundamental, principalmente porque essa ação dependerá do tipo de dado (vetor ou raster), classe do objeto (por exemplo, `MULTIPOINT` ou `RasterLayer`) e tipo e quantidade de informações armazenadas (por exemplo, tamanho do objeto, intervalo de valores, etc.).
**Vetor**
Para dados vetoriais, a principal função utilizada é a `sf::st_write()`. Essa função permite gravar objetos `sf` em vários formatos de arquivos vetoriais, como `.shp`, `.gpkg` ou `.geojson`. O formato a ser exportado vai influenciar na velocidade do processo de gravação.
Os argumentos dessa função será o `obj` que é o objeto `sf` criado no ambiente R, e o `dsn` (*data source name*), ou seja, o nome que o arquivo terá ao ser exportado do R, de modo que o complemento `.shp` no nome de saída, por exemplo, definirá que o arquivo terá a extensão `ESRI Shapefile`. Entretanto, essa extensão pode ser definida também utilizando o argumento `driver`, com as possibilidades listadas nesse [site](https://gdal.org/drivers/vector/index.html).
```{r eval=FALSE}
## Exportar o polígono de Rio Claro na extensão ESRI Shapefile
sf::st_write(obj = geo_vetor_rio_claro,
dsn = here::here("dados", "vetor", "geo_vetor_rio_claro.shp"))
```
Ou podemos ainda exportar o objeto vetorial na extensão `GeoPackage`. Entretanto, aqui é interessante acrescentar um argumento chamado `layer` para definir o nome das camadas a serem exportadas no mesmo arquivo `GeoPackage`, por exemplo.
```{r eval=FALSE}
## Exportar o polígono de Rio Claro na extensão Geopackage
sf::st_write(obj = geo_vetor_rio_claro,
dsn = here::here("dados", "vetor", "vetores.gpkg"),
layer = "rio_claro")
```
Ainda sobre o formato `GeoPackage`, há algo muito interessante que podemos fazer: podemos acrescentar outros arquivos vetoriais ao mesmo arquivo já criado. Como exemplo, exportaremos o limite do Brasil para o mesmo arquivo.
```{r eval=FALSE}
## Exportar o polígono do Brasil na extensão Geopackage
sf::st_write(obj = geo_vetor_brasil,
dsn = here::here("dados", "vetor", "vetores.gpkg"),
layer = "brasil")
```
**Raster**
Para exportar dados raster utilizamos geralmente a função `raster::writeRaster()`. Exportar dados raster é um pouco mais complexo que exportar dados vetoriais. Teremos de definir se exportaremos arquivos em uma ou várias camadas, quantidade de informações por pixel, e ainda diferentes extensões de saída.
::: {.alert .alert-info}
<strong> 📝 Importante </strong>\
Arquivos raster escritos em discos geralmente ocupam bastante espaço, e dessa forma, há parâmetros específicos para certos tipos de dados, que detalharemos a seguir para contornar esse problema e comprimir os arquivos.
:::
Na função `raster::writeRaster()`, o argumento `x` diz respeito ao objeto raster no ambiente R. O argumento `filename` é nome do arquivo que será exportado do R, podendo ou não possuir a extensão que se pretende que o arquivo tenha. O argumento `format` é o formato do arquivo, sendo as principais possibilidades resumidas na Tabela \@ref(tab:tab-raster-formatos), e para saber das possibilidades suportadas, use a função `raster::writeFormats()`. O argumento `bylayer` diz se múltiplas camadas serão exportadas em arquivos diferentes ou em apenas um arquivo.
```{r tab-raster-formatos, echo=FALSE}
knitr::kable(
tibble(
`Tipo de arquivo` = c("raster", "ascii", "SAGA", "IDRISI", "CDF", "GTiff", "ENVI", "EHdr", "HFA"),
`Nome longo` = c("Formato pacote raster", "ESRI Ascii", "SAGA GIS", "IDRISI", "netCDF (requer ncdf4)", "GeoTiff (requer rgdal)", "ENVI .hdr", "ESRI .hdr", "Erdas imagem (.img)"),
Extensão = c(".grd", ".asc", ".sdat", ".rst", ".nc", ".tif", ".envi", ".bil", ".img"),
`Suporte a múltiplas camadas` = c("Sim", "Não", "Não", "Não", "Sim", "Sim", "Sim", "Sim", "Sim")),
caption = "Principais formatos de arquivos raster exportados do R.")
```
Dentre os argumentos adicionais, temos ainda o `datatype`, que faz referência a um dos nove tipos de formato de dados detalhados na Tabela \@ref(tab:tab-raster-tipos), sendo que o tipo de dado determina a representação em bits (quantidade de informação) na célula do objeto raster exportado e depende da faixa de valores do objeto raster em cada pixel. Quanto mais valores um tipo de dado puder representar, maior será o arquivo exportado no disco. Dessa forma, é interessante utilizar um tipo de dado que diminua o tamanho do arquivo a ser exportado, dependendo do tipo de dado em cada pixel. Para a função `raster::writeRaster()`, o default é `FLT4S`, o que pode ocupar mais espaço em disco do que o necessário.
```{r tab-raster-tipos, echo=FALSE}
knitr::kable(
tibble(
`Tipo de dado` = c("LOG1S", "INT1S", "INT1U", "INT2S", "INT2U", "INT4S", "INT4U", "FLT4S", "FLT8S"),
`Valor mínimo` = c("FALSE (0)", "-127", "0", "-32.767", "0", "-2.147.483.647", "0", "-3,4e+38", "-1,7e+308"),
`Valor máximo` = c("TRUE (1)", "127", "255", "32.767", "65534", "2.147.483.647", "42.94.967.296", "3,4e+38", "1,7e+308")),
caption = "Tipos de dados suportados pelo pacote `raster`."
)
```
Outros argumentos de suporte são: `overwrite` para sobrescrever um arquivo que já exista, `progress` para mostrar uma barra de progresso da exportação como "text" ou "window", e `options` que permite opções do GDAL. Para esse último, quando exportar especificamente na extensão `GeoTIFF`, podemos utilizar `options = c("COMPRESS=DEFLATE", "TFW=YES")` para que haja compressão do arquivo, diminuindo consideravelmente seu tamanho (cerca de um terço), aliado à criação de um arquivo auxiliar `.tfw`, para ser carregado em softwares específicos de SIG, como o ArcGIS.
Para exportar apenas uma camada `RasterLayer`, podemos utilizar a função `raster::writeRaster()` em um formato mais simples.
```{r eval=FALSE}
## Criar diretório
dir.create(here::here("dados", "raster", "exportados"))
## Exportar raster layer
raster::writeRaster(geo_raster_srtm,
filename = here::here("dados", "raster", "exportados", "elevation"),
format = "GTiff",
datatype = "INT2S",
options = c("COMPRESS=DEFLATE", "TFW=YES"),
progress = "text",
overwrite = TRUE)
```
Para mais de uma camada `RasterBrick` ou `RasterStack`, podemos utilizar a função `raster::writeRaster()` com o `bylayer = TRUE`.
```{r eval=FALSE}
## Exportar raster stack
raster::writeRaster(x = geo_raster_bioclim,
filename = here::here("dados", "raster", "exportados", names(geo_raster_bioclim)),
bylayer = TRUE,
format = "GTiff",
datatype = "INT2S",
options = c("COMPRESS=DEFLATE", "TFW=YES"),
progress = "text",
overwrite = TRUE)
```
## Descrição de objetos geoespaciais
Muitas vezes precisaremos verificar as informações dos objetos geoespaciais importados para o R. Apesar de chamar o objeto trazer grande parte das informações que precisamos consultar, existem funções específicas que nos auxiliam nesse processo de descrição dos objetos.
### Vetor
Podemos acessar as informações geoespaciais e a tabela de atributos de um objeto importado como vetor simplesmente chamando o nome do objeto no R.
```{r}
## Município de Rio Claro
geo_vetor_rio_claro
```
Mas também podemos acessar informações geoespaciais com funções específicas, como tipo de geometria, limites geoespaciais do vetor (extensão), sistema de referência de coordenadas (CRS), e a tabela de atributos.
```{r}
## Tipo de geometria
sf::st_geometry_type(geo_vetor_rio_claro)
## Extensão
sf::st_bbox(geo_vetor_rio_claro)
## CRS
sf::st_crs(geo_vetor_rio_claro)
## Acessar a tabela de atributos
geo_vetor_rio_claro_tab <- sf::st_drop_geometry(geo_vetor_rio_claro)
geo_vetor_rio_claro_tab
```
### Raster
Da mesma forma, podemos acessar as informações objetos raster chamando o nome do objeto.
```{r}
## Raster layer
geo_raster_srtm
```
Além disso, podemos selecionar informações desse objeto com funções específicas, tanto para `RasterLayer`, quanto para `RasterBrick` ou `RasterStack` como: classe, dimensões (número de linhas, colunas e camadas), número de camadas, número de linhas, número de colunas, número de células, resolução (largura e altura do tamanho do pixel), extensão (limites geoespaciais), sistema de referência de coordenadas (CRS), nome das camadas e extrair os valores de todos os pixels.
```{r}
## Classe
class(geo_raster_srtm)
## Dimensões
dim(geo_raster_srtm)
## Número de camadas
nlayers(geo_raster_srtm)
## Número de linhas
nrow(geo_raster_srtm)
## Número de colunas
ncol(geo_raster_srtm)
## Número de células
ncell(geo_raster_srtm)
## Resolução
res(geo_raster_srtm)
## Extensão
extent(geo_raster_srtm)
## Projeção ou CRS
projection(geo_raster_srtm)
## Nomes
names(geo_raster_srtm)
## Valores
getValues(geo_raster_srtm) %>% head
values(geo_raster_srtm) %>% head
geo_raster_srtm[] %>% head
```
## Reprojeção de dados geoespaciais