UFPE
Geoprocessamento é a área da ciência que utiliza um conjunto de métodos e tecnologias para coletar, armazenar, processar, analisar dados espaciais sobre o mundo real (Burrough, 1986).
Nosso foco será nos SIGs (Sistemas de Informação Geográfica), que são tecnologias do Geoprocessamento, em que é possível:
Os Sistemas de Informação Geográfica englobam tecnologias como:

A primeira utilização de um SIG foi em Londres - Inglaterra, no ano de 1854, quando uma epidemia de cólera assolava a cidade e ninguém sabia o motivo para tal. Então o médico John Snow decidiu pegar um mapa do local, e localizar os poços de águas (principal fonte de água dos habitantes) e os locais de moradias do doentes, e ele visualizou uma forte correlação espacial entre as pessoas que doentes e o poço de água da Broad Street.

Alguns conceitos importantes sobre o SIG são:
É a coleção de localizações na superfície da Terra onde ocorrem os fenômenos geográficos. O espaço geográfico se define em relação a suas coordenadas, sua altitude e sua posição relativa. Vale relembrar que os dados geográficos não estão sozinhos no espaço, ou seja, possuem relação com outros dados.
O espaço geográfico é composto por entidades distintas (diferentes) e identificáveis, estes são definidos como geo-campos e os geo-objetos;
Os geo-campos possuem uma distribuição espacial de uma variável com valores em todos os pontos pertencentes a uma região do Espaço Geográfico.
Os geo-objetos são dados que possuem localizações e identificação que compõem uma determinada região, do espaço geográfico.
São as informações obtidas de um espaço geográfico que depende da localização do geo-objeto (ou de pontos do geo-campo).
Os dados espaciais são compostos em duas partes (dois componentes distintos):
Parte Gráfica: responsável pela parte que representa o geo-objeto ou o geo-campo na visualização da região.
Parte não gráfica: responsável pela características, ou seja, os dados quantitativos e os qualitativos dos geo-campos ou geo-objetos que podem ser utilizados para fazer análises.
No SIG os dados espaciais são armazenados em Banco de Dados, e esta organização varia de acordo com o tipo do software utilizado.
Geralmente os Bancos de dados do SIG são divididos em Projetos, cujo estes estão divididos em níveis, camadas ou Planos de Informação - PIs.
Os Planos de Informações (PIs) armazenam os dados geográficos de uma determinada região. Cada plano representa a mesma área, porém contendo informações geográficas diferentes. Por exemplo PIs de rodovias, classificação climática, etc. O cruzamento das informações existentes nesses PIs, formarão a cartografia básica, ou seja, mapa da integração desses dados como produto final.


Esses dados dos Planos de Informações, são incorporados em um SIG, advindos de diversas fontes, dentre as quais, podem-se destacar:
Esses dados dos Planos de Informações, são incorporados em um SIG, advindos de diversas fontes, dentre as quais, pode-se destacar:

O R é uma linguagem de programação inicialmente desenvolvida para computação estatística. É licenciada como Software Livre.
O R vai proporcionar a liberdade para fazer qualquer tipo de Análise Espacial.
Como assim? O que isso significa?
Vamos supor que temos os seguintes problemas:
Em geral, trabalhamos com quatro tipos de dados:

Em geral, trabalhamos com quatro tipos de dados:

Em geral, trabalhamos com quatro tipos de dados:

Em geral, trabalhamos com quatro tipos de dados:

Essa flexibilidade para desenvolver pesquisa e implementar novos métodos de análise espacial, é um dos pontos que torna o R uma ferramenta poderosa para o Geoprocessamento.

Como dito anteriormente, o R é uma linguagem de programação de código aberto e licenciada como Software Livre.
Isso não é no nível de utilizar o R para fazer scripts, mas você pode ir a um nível mais profundo, ou seja, você pode pegar o R, fazer uma nova linguagem de programação baseada nele e distribuir para a comunidade, sem ter que pagar nada por isso, entretanto, vai precisar respeitar a licença do R, esta deve ser a mesma na sua modificação.
Para obter o R, acesse o link: https://cloud.r-project.org/
O CRAN (Comprehensive R Archive Network) é um conjunto de servidores-espelho distribuídos pelo mundo e é utilizado para distribuir o R e os pacotes do R.
Uma nova grande versão do R é lançada uma vez por ano, e há dois ou três pequenos lançamentos por ano.
É interessante manter o R sempre atualizado, pois as novas versões do R trazem melhorias de desempenho em relação aos hardware mais recentes, novas funcionalidades e correções de bugs. tware para o R.
No momento da criação desse minicuroso, o R encontrava-se na versão 4.4.2 lançada em 31.10.2024.
IDE padrão do R no Windows, é instalada juntamente com a linguagem no sistema.
O uso R no Linux é através do terminal do sistema.
Um conceito importante no R são os pacotes.
Um pacote no R é uma colação de funções, dados e documentação que estende as capacidades do R base.
ou
e as funções do pacote podem ser usadas de duas formas:
ou
# Exemplo de utilização de função de pacote
datasets::iris |>
dplyr::filter(Species == "setosa") |>
utils::head() Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
relembrando a estrutura anterior novamente…
c().list().[[1]]
[1] 1
[[2]]
[1] "a"
[[3]]
[1] TRUE
[].Vale uma observação, de que os índices em R começam em 1, e não em 0, como em algumas outras linguagens de programação.
dplyr é um pacote do R que fornece uma gramática para manipulação de dados, e é muito útil para transformar, filtrar e resumir dados.dplyr fornece um conjunto de funções que são fáceis de usar e que permitem realizar operações comuns de manipulação de dados de forma eficiente, dessa forma, para essa parte inicial de tratamento de dados, vamos focar na utilização desse pacote.pacote::funcao() para evitar conflitos de funções com o mesmo nome em diferentes pacotes.dplyr:# A tibble: 13 × 19
year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
<int> <int> <int> <int> <int> <dbl> <int> <int>
1 2013 1 1 517 515 2 830 819
2 2013 1 1 533 529 4 850 830
3 2013 1 1 542 540 2 923 850
4 2013 1 1 544 545 -1 1004 1022
5 2013 1 1 554 600 -6 812 837
6 2013 1 1 554 558 -4 740 728
7 2013 1 1 555 600 -5 913 854
8 2013 1 1 557 600 -3 709 723
9 2013 1 1 557 600 -3 838 846
10 2013 1 1 558 600 -2 753 745
11 2013 1 1 558 600 -2 849 851
12 2013 1 1 558 600 -2 853 856
13 2013 1 1 558 600 -2 924 917
# ℹ 11 more variables: arr_delay <dbl>, carrier <chr>, flight <int>,
# tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>,
# hour <dbl>, minute <dbl>, time_hour <dttm>
Conseguimos fazer filtragem de dados utilizando a função filter()
# A tibble: 13 × 19
year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
<int> <int> <int> <int> <int> <dbl> <int> <int>
1 2013 11 1 5 2359 6 352 345
2 2013 11 1 35 2250 105 123 2356
3 2013 11 1 455 500 -5 641 651
4 2013 11 1 539 545 -6 856 827
5 2013 11 1 542 545 -3 831 855
6 2013 11 1 549 600 -11 912 923
7 2013 11 1 550 600 -10 705 659
8 2013 11 1 554 600 -6 659 701
9 2013 11 1 554 600 -6 826 827
10 2013 11 1 554 600 -6 749 751
11 2013 11 1 555 600 -5 847 854
12 2013 11 1 555 600 -5 839 846
13 2013 11 1 555 600 -5 929 943
# ℹ 11 more variables: arr_delay <dbl>, carrier <chr>, flight <int>,
# tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>,
# hour <dbl>, minute <dbl>, time_hour <dttm>
Para usar filtragens de forma eficaz, você precisa saber como utilizar operadores de comparação e operadores lógicos.
Alguns operadores são:
== igual a!= diferente de> maior que< menor que
& e| ou! não# A tibble: 5 × 19
year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
<int> <int> <int> <int> <int> <dbl> <int> <int>
1 2013 11 1 5 2359 6 352 345
2 2013 11 1 35 2250 105 123 2356
3 2013 11 1 455 500 -5 641 651
4 2013 11 1 539 545 -6 856 827
5 2013 11 1 542 545 -3 831 855
# ℹ 11 more variables: arr_delay <dbl>, carrier <chr>, flight <int>,
# tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>,
# hour <dbl>, minute <dbl>, time_hour <dttm>
# A tibble: 5 × 19
year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
<int> <int> <int> <int> <int> <dbl> <int> <int>
1 2013 11 1 5 2359 6 352 345
2 2013 11 1 35 2250 105 123 2356
3 2013 11 1 455 500 -5 641 651
4 2013 11 1 539 545 -6 856 827
5 2013 11 1 542 545 -3 831 855
# ℹ 11 more variables: arr_delay <dbl>, carrier <chr>, flight <int>,
# tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>,
# hour <dbl>, minute <dbl>, time_hour <dttm>
filter() só considera as linhas em que a condição é verdadeira (TRUE), e descarta as linhas em que a condição é falsa (FALSE) ou NA. Se deseja preservar os valores faltantes, peça eles explicitamente:# A tibble: 10 × 19
year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
<int> <int> <int> <int> <int> <dbl> <int> <int>
1 2013 1 1 NA 1630 NA NA 1815
2 2013 1 1 NA 1935 NA NA 2240
3 2013 1 1 NA 1500 NA NA 1825
4 2013 1 1 NA 600 NA NA 901
5 2013 1 2 NA 1540 NA NA 1747
6 2013 1 2 NA 1620 NA NA 1746
7 2013 1 2 NA 1355 NA NA 1459
8 2013 1 2 NA 1420 NA NA 1644
9 2013 1 2 NA 1321 NA NA 1536
10 2013 1 2 NA 1545 NA NA 1910
# ℹ 11 more variables: arr_delay <dbl>, carrier <chr>, flight <int>,
# tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>,
# hour <dbl>, minute <dbl>, time_hour <dttm>
arraange(), que serve para ordenar os dados.filter(), mas ao invés de filtrar, ele ordena.# A tibble: 10 × 19
year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
<int> <int> <int> <int> <int> <dbl> <int> <int>
1 2013 10 30 2400 2359 1 327 337
2 2013 11 27 2400 2359 1 515 445
3 2013 12 5 2400 2359 1 427 440
4 2013 12 9 2400 2359 1 432 440
5 2013 12 9 2400 2250 70 59 2356
6 2013 12 13 2400 2359 1 432 440
7 2013 12 19 2400 2359 1 434 440
8 2013 12 29 2400 1700 420 302 2025
9 2013 2 7 2400 2359 1 432 436
10 2013 2 7 2400 2359 1 443 444
# ℹ 11 more variables: arr_delay <dbl>, carrier <chr>, flight <int>,
# tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>,
# hour <dbl>, minute <dbl>, time_hour <dttm>
arrange().# A tibble: 10 × 19
year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
<int> <int> <int> <int> <int> <dbl> <int> <int>
1 2013 1 1 517 515 2 830 819
2 2013 1 1 533 529 4 850 830
3 2013 1 1 542 540 2 923 850
4 2013 1 1 544 545 -1 1004 1022
5 2013 1 1 554 600 -6 812 837
6 2013 1 1 554 558 -4 740 728
7 2013 1 1 555 600 -5 913 854
8 2013 1 1 557 600 -3 709 723
9 2013 1 1 557 600 -3 838 846
10 2013 1 1 558 600 -2 753 745
# ℹ 11 more variables: arr_delay <dbl>, carrier <chr>, flight <int>,
# tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>,
# hour <dbl>, minute <dbl>, time_hour <dttm>
desc().select() é utilizada para selecionar colunas de um data frame.select().# A tibble: 15 × 16
dep_time sched_dep_time dep_delay arr_time sched_arr_time arr_delay carrier
<int> <int> <dbl> <int> <int> <dbl> <chr>
1 517 515 2 830 819 11 UA
2 533 529 4 850 830 20 UA
3 542 540 2 923 850 33 AA
4 544 545 -1 1004 1022 -18 B6
5 554 600 -6 812 837 -25 DL
6 554 558 -4 740 728 12 UA
7 555 600 -5 913 854 19 B6
8 557 600 -3 709 723 -14 EV
9 557 600 -3 838 846 -8 B6
10 558 600 -2 753 745 8 AA
11 558 600 -2 849 851 -2 B6
12 558 600 -2 853 856 -3 B6
13 558 600 -2 924 917 7 UA
14 558 600 -2 923 937 -14 UA
15 559 600 -1 941 910 31 AA
# ℹ 9 more variables: flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
# air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
mutate() é utilizada para criar novas colunas a partir de colunas existentes.# A tibble: 15 × 20
year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
<int> <int> <int> <int> <int> <dbl> <int> <int>
1 2013 1 1 517 515 2 830 819
2 2013 1 1 533 529 4 850 830
3 2013 1 1 542 540 2 923 850
4 2013 1 1 544 545 -1 1004 1022
5 2013 1 1 554 600 -6 812 837
6 2013 1 1 554 558 -4 740 728
7 2013 1 1 555 600 -5 913 854
8 2013 1 1 557 600 -3 709 723
9 2013 1 1 557 600 -3 838 846
10 2013 1 1 558 600 -2 753 745
11 2013 1 1 558 600 -2 849 851
12 2013 1 1 558 600 -2 853 856
13 2013 1 1 558 600 -2 924 917
14 2013 1 1 558 600 -2 923 937
15 2013 1 1 559 600 -1 941 910
# ℹ 12 more variables: arr_delay <dbl>, carrier <chr>, flight <int>,
# tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>,
# hour <dbl>, minute <dbl>, time_hour <dttm>, speed <dbl>
summarise(), que é utilizada para resumir os dados.summarise() é muito útil para resumir os dados e obter estatísticas descritivas.# A tibble: 1 × 2
mean_distance mean_air_time
<dbl> <dbl>
1 1040. NA
air_time o resultado foi NA, isso ocorreu porque a função mean() não sabe o que fazer com valores faltantes. Nesse caso, devemos passar como argumento para remover os valores faltantes.group_by() é utilizada para agrupar os dados por uma ou mais variáveis.dados |>
dplyr::group_by(month) |>
dplyr::summarise(mean_distance = mean(distance),
mean_air_time = mean(air_time, na.rm = TRUE)) # A tibble: 12 × 3
month mean_distance mean_air_time
<int> <dbl> <dbl>
1 1 1007. 154.
2 2 1001. 151.
3 3 1012. 149.
4 4 1039. 153.
5 5 1041. 146.
6 6 1057. 150.
7 7 1059. 147.
8 8 1062. 148.
9 9 1041. 143.
10 10 1039. 149.
11 11 1050. 155.
12 12 1065. 163.
n().Também conseguimos agrupar por múltiplas variáveis, basta passar mais argumentos para a função group_by()

O ggplot2 (https://ggplot2.tidyverse.org/) é um sistema para a criação declarativa de gráficos, baseado na Gramática de Gráficos. Você fornece os dados, informa ao ggplot2 como mapear as variáveis para os atributos estéticos, quais primitivas gráficas usar, e ele cuida dos detalhes1.
Em resumo, a gramática de gráficos nos diz que um gráfico mapeia os dados para atributos estéticos (cor, forma, tamanho) de objetos geométricos (pontos, linhas, barras). Além disso, o gráfico também pode incluir transformações estatísticas nos dados e informações sobre o sistema de coordenadas.
Todos os gráficos são compostos pelos dados, a informação que você deseja visualizar, e um mapeamento, a descrição de como as variáveis dos dados são mapeadas para os atributos estéticos.
Existem cinco componentes de mapeamento:
Todo gráfico em ggplot2 será iniciado com a função ggplot e, em seguida, adicionaremos dados, e demais informações. Uma dessas opções que podem ser adicionadas na função ggplot é o aes().
aes(): são mapeamentos estéticos que descrevem como as variáveis dos dados são mapeadas para propriedades visuais (estéticas).library(ggplot2)
# Usando o dataset 'milhas' do pacote 'dados'
milhas <- dados::milhas
# Criando o gráfico com os 5 componentes
ggplot(milhas, aes(cilindrada, rodovia, colour = classe)) +
# Camada de pontos geométricos
geom_point() +
# Escala de cor manual
scale_colour_manual(values = c("2 assentos" = "red", "compacto" = "blue",
"médio" = "green", "minivan" = "purple",
"pickup" = "orange", "subcompacto" = "brown",
"suv" = "pink")) +
# Sistema de coordenadas polar para um efeito diferenciado
coord_cartesian()+
# Facetando (subdividindo) o gráfico por tipo de tração (drv)
facet_wrap(~ tracao) +
# Tema minimalista para controlar os detalhes visuais
theme_minimal(base_size = 15, base_family = "Arial") +
# Título do gráfico
labs(title = "Consumo na Rodovia vs Cilindrada",
x = "Cilindrada do motor (litros)",
y = "Consumo na rodovia (mpg)",
colour = "Classe do veículo")library(ggplot2)
milhas <- dados::milhas
ggplot(milhas, aes(cilindrada, rodovia, colour = classe)) +
geom_point() +
scale_colour_manual(values = c("2 assentos" = "red", "compacto" = "blue",
"médio" = "green", "minivan" = "purple",
"pickup" = "orange", "subcompacto" = "brown",
"suv" = "pink")) +
coord_cartesian()+
facet_wrap(~ tracao) +
theme_minimal(base_size = 15, base_family = "Arial")library(ggplot2)
milhas <- dados::milhas
ggplot(milhas, aes(cilindrada, rodovia, colour = classe)) +
geom_point() +
scale_colour_manual(values = c("2 assentos" = "red", "compacto" = "blue",
"médio" = "green", "minivan" = "purple",
"pickup" = "orange", "subcompacto" = "brown",
"suv" = "pink")) +
coord_cartesian()+
facet_wrap(~ tracao) +
theme_minimal(base_size = 15, base_family = "Arial")library(ggplot2)
milhas <- dados::milhas
ggplot(milhas, aes(cilindrada, rodovia, colour = classe)) +
geom_point() +
scale_colour_manual(values = c("2 assentos" = "red", "compacto" = "blue",
"médio" = "green", "minivan" = "purple",
"pickup" = "orange", "subcompacto" = "brown",
"suv" = "pink")) +
coord_cartesian()+
facet_wrap(~ tracao) +
theme_minimal(base_size = 15, base_family = "Arial")library(ggplot2)
milhas <- dados::milhas
ggplot(milhas, aes(cilindrada, rodovia, colour = classe)) +
geom_point() +
scale_colour_manual(values = c("2 assentos" = "red", "compacto" = "blue",
"médio" = "green", "minivan" = "purple",
"pickup" = "orange", "subcompacto" = "brown",
"suv" = "pink")) +
coord_cartesian()+
facet_wrap(~ tracao) +
theme_minimal(base_size = 15, base_family = "Arial")Abrir o RStudio;
Abrir um novo arquivo R:
File > New File > R ScriptCtrl + Shift + N;# A tibble: 3 × 11
fabricante modelo cilindrada ano cilindros transmissao tracao cidade rodovia
<chr> <chr> <dbl> <int> <int> <chr> <chr> <int> <int>
1 audi a4 1.8 1999 4 auto(l5) d 18 29
2 audi a4 1.8 1999 4 manual(m5) d 21 29
3 audi a4 2 2008 4 manual(m6) d 20 31
# ℹ 2 more variables: combustivel <chr>, classe <chr>
tibble [234 × 11] (S3: tbl_df/tbl/data.frame)
$ fabricante : chr [1:234] "audi" "audi" "audi" "audi" ...
$ modelo : chr [1:234] "a4" "a4" "a4" "a4" ...
$ cilindrada : num [1:234] 1.8 1.8 2 2 2.8 2.8 3.1 1.8 1.8 2 ...
$ ano : int [1:234] 1999 1999 2008 2008 1999 1999 2008 1999 1999 2008 ...
$ cilindros : int [1:234] 4 4 4 4 6 6 6 4 4 4 ...
$ transmissao: chr [1:234] "auto(l5)" "manual(m5)" "manual(m6)" "auto(av)" ...
$ tracao : chr [1:234] "d" "d" "d" "d" ...
$ cidade : int [1:234] 18 21 20 21 16 18 18 18 16 20 ...
$ rodovia : int [1:234] 29 29 31 30 26 26 27 26 25 28 ...
$ combustivel: chr [1:234] "p" "p" "p" "p" ...
$ classe : chr [1:234] "compacto" "compacto" "compacto" "compacto" ...
Quem desejar entender o que significa cada variável da base pode executar
?dados::milhasno console.
cilindrada e rodoviaVamos separar as observações por tipo do carro
Uma segunda forma de fazer, é:
Utilizando facetamento por tipo do carro:
Estamos interessados em fazer Box-Plot, logo:
Estamos interessados em fazer Box-Plot, por tipo de carro, assim:
Vamos construir um gráfico de barras horizontais com percentual por categoria, tema minimalista e na tonalidade azul.
Mas primeiro, vamos entender como tratar os dados e construir o gráfico na forma padrão (vertical), e em seguida ir modificando.
library(dplyr)
# Criando um novo data.frame com proporções
classes_milhas <- milhas |>
count(classe) |>
mutate(prop = round(prop.table(n),2))
#' --------------------
#' Ordenando as colunas pela frequência
classes_milhas$classe <- factor(classes_milhas$classe,
levels = classes_milhas$classe[order(classes_milhas$n, decreasing = F)])Agora vamos colocar as barras na horizontal e tonalidade azul:
Modificando o tema do gráfico:
removendo os nomes dos eixos xe y:
Nosso gráfico final, após algumas adições de camadas:
ggplot(classes_milhas, aes(classe, y = prop)) +
geom_bar(stat = 'identity', fill = "#4789e2") +
coord_flip() +
theme_linedraw() +
xlab("") +
ylab("") +
labs(title = "Tipos de Carros da base Milhas") +
scale_y_continuous(labels = scales::percent_format(), position = "right" ) +
theme(axis.text = element_text(size=10),
plot.title = element_text(color="black", size=15, face="bold.italic"),
#--
axis.title.x = element_blank(),
#--
axis.ticks = element_blank(),
panel.border = element_blank(),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
panel.background = element_rect(fill = "transparent",colour = NA),
plot.background = element_rect(fill = "transparent",colour = NA))Nosso gráfico final, após algumas adições de camadas:
Vamos criar mapas de 3 formas diferentes, todos utilizando o conceito de dados de área:
geobr;leaflet;geobr
geobré um pacote computacional para download de conjuntos de dados espaciais oficiais do Brasil. O pacote inclui uma ampla gama de dados geoespaciais em formato de geopacote (como shapefiles), disponíveis em várias escalas geográficas e por vários anos com atributos harmonizados, projeção e topologia1.
geobrPara criarmos nosso mapa, vamos precisar gerar dados para serem as informações existentes no mapa. Dessa forma, vamos supor que estamos gerando quantas pessoas estão no youtube nesse momento em cada estado do Brasil. Vamos gerar esses dados através de simulação, sendo uma amostra de tamanho 1.000, que vai discrimar aleatoriamente cada observação para os 26 estados + DF do país.
Lista dos estados do Brasil (BR):
geobr# Adicionando uma semente
set.seed(29)
# Estados
estados <- c("AC", "AL", "AP", "AM", "BA", "CE", "DF", "ES",
"GO", "MA", "MT", "MS", "MG", "PA", "PB", "PR",
"PE", "PI", "RR", "RO", "RJ", "RN", "RS", "SC",
"SP", "SE", "TO")
# Verificando se existem 27 estados
estados |>
length()[1] 27
# Criando uma amostra de tamanho 1.000
amostra <- sample(x = estados, size = 1000, replace = TRUE)
# Verificando as frequências em cada estado
amostra |>
table()amostra
AC AL AM AP BA CE DF ES GO MA MG MS MT PA PB PE PI PR RJ RN RO RR RS SC SE SP
35 42 35 34 35 33 33 37 31 42 35 38 31 42 36 45 32 41 35 35 40 37 39 40 44 35
TO
38
geobrEm geral ficou uma amostra uniforme, em torno da frequẽncia 35. Vamos agora chamar a biblioteca e gerar o mapa usando o geobr.
No Debian/Ubuntu, foi necessário instalar a libudunits2-dev no terminal do linux;
Após a instalação da biblioteca no Sistema operacional, foi utilizado o comando para instalar o pacote novamente e se tudo ocorreu como esperado, o pacote foi instalado com sucesso!
geobrAbaixo vamos seguir com o código da geração do mapa
# Lendo as bibliotecas
library(geobr) # Necessária para os dados dos mapas
library(dplyr) # Necessária para manipulação dos dados
# Convertendo a amostra em tibble
amostra <- as_tibble(amostra)
# Agrupando os dados dos estados
dados_estados <- amostra |>
mutate(abbrev_state = factor(value)) |>
group_by(abbrev_state) |>
summarise(n = n())
# Fazendo left_join das informações do geobr com os dados
dados_mapa <- read_state(year=2019, showProgress = FALSE) |>
left_join(dados_estados)geobrGerando o mapa utilizando a frequência gerada pelo prórpio ggplot:
# Pacote ggplot2
library(ggplot2)
# Código do MAPA
mapa <- dados_mapa |>
ggplot() +
geom_sf(aes(fill = n)) +
labs(title = "Mapa Brasil", fill = "Frequência")+
theme_minimal()+
theme(axis.title = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank(),
panel.grid = element_blank())geobrgeobrCriando um intervalo e fazendo o gráfico de acordo com a legenda criada:
# Descobrindo o maximo e minimo para definir a quantidade de intervalos
# Calculando o máximo, mínimo e amplitude
maximo <- max(dados_mapa$n);
minimo <- min(dados_mapa$n);
amplitude <- max(dados_mapa$n) - min(dados_mapa$n)
print(c(minimo, maximo, amplitude))[1] 31 45 14
# Por questão de facilidade vamos dividir em 3 categorias:
# 1 - Frequência de menos de 'minimo+1';
# 2 - Frequência de 'minimo+1' até 'máximo-1';
# 3 - Frequência de 'máximo-1' ou mais;
#Criando os Intervalos para a Legenda
classes = c(-Inf, minimo+1, maximo-1, Inf)
classes_plot <- findInterval(dados_mapa$n,classes)
# Criar legenda
legenda = c(paste0('menos de ',minimo+1),
paste0(minimo+1,' |-- ',maximo-1),
paste0('mais de ',maximo-1))
cores = c("#b2e6ff",
"#1659e6",
"#00234b")geobrGerando o mapa atualizado:
# Adicionando a coluna classes_plot no tibble dados_mapa
dados_mapa <- dados_mapa |>
mutate(classes_plot = factor(classes_plot))
# Pacote ggplot2
library(ggplot2)
# Código do MAPA
mapa <- dados_mapa |>
ggplot() +
geom_sf(aes(fill = classes_plot), color = "black") +
labs(title = "Mapa Brasil",
x = "Longitude",
y = "Latitude",
fill = "Frequência")+
scale_fill_manual(labels = legenda,
values = cores)+
theme_minimal() +
theme(
panel.grid = element_blank(), # Remove grade
panel.border = element_rect(color = "black", fill = NA) # Adiciona borda
)geobrA ideia é semelhante a utilizar o pacote geobr, entretanto, nesse caso, precisamos ter o arquivo do shape, que no exemplo anterior, foi baixado diretamente do pacote geobr.
Neste caso, vamos precisar o pacote sf para leitura do arquivo shapefile.
No Debian/Ubuntu, foi necessário instalar as libs abaixo no terminal do linux;
Vamos utilizar neste caso um arquivo de teste para simular uma análise de dados e fazendo o gráfico utilizando o arquivo shapefile, vamos adicionar também uma Rosa dos Ventos.
Vamos nesse caso utilizar um arquivo de shapefile do estado da PB e dados também.
# ---- Load shapefile
shapename <- read_sf('dados/shape_estado_pb/Municipios.shp')
# ---- Carregar dados
dados <- read.csv2("dados/exemplo_de_base.csv")
dados |>
head(3) GEOCODIG_M NOME_MUNIC MICRORREGI NOME_MICRO cod UF coordy
1 2500106 Água Branca 25007 Serra do Teixeira 250010 PB -7.512
2 2500205 Aguiar 25005 Piancó 250020 PB -7.092
3 2500304 Alagoa Grande 25015 Brejo Paraibano 250030 PB -7.089
coordx casos POP2017
1 -37.641 0 10479.088
2 -38.171 0 5469.505
3 -35.635 0 25128.464
Um ponto importante, é ter certeza que a ordenação dos dados da sua base é a mesma do shapefile. Assim, vamos criar um dataframe, mantendo a ordenação do shapefile.
# ---- Criando dataframe com a ordem correta do shapefile
codigoshape <- data.frame(GEOCODIG_M = shapename$GEOCODIG_M)
# ---- Unindo o shapefile com os dados
dados_mapa_shp <- shapename |>
left_join(dados, by = 'GEOCODIG_M')
dados_mapa_shp |>
head(3)Simple feature collection with 3 features and 21 fields
Geometry type: MULTIPOLYGON
Dimension: XY
Bounding box: xmin: -38.33535 ymin: -7.59681 xmax: -35.49084 ymax: -6.94149
CRS: NA
# A tibble: 3 × 22
OBJECTID GEOCODIG_M UF.x SIGLA NOME_MUNIC.x REGI_O MESORREGI_ NOME_MESO
<dbl> <dbl> <chr> <chr> <chr> <chr> <chr> <chr>
1 1 2500106 25 PB Água Branca Nordeste 2501 Sertão Para…
2 2 2500205 25 PB Aguiar Nordeste 2501 Sertão Para…
3 3 2500304 25 PB Alagoa Grande Nordeste 2503 Agreste Par…
# ℹ 14 more variables: MICRORREGI.x <chr>, NOME_MICRO.x <chr>,
# SHAPE_LENG <dbl>, SHAPE_AREA <dbl>, geometry <MULTIPOLYGON>,
# NOME_MUNIC.y <chr>, MICRORREGI.y <int>, NOME_MICRO.y <chr>, cod <int>,
# UF.y <chr>, coordy <dbl>, coordx <dbl>, casos <int>, POP2017 <dbl>
A partir de agora, vamos utilizar o dataframe dados_mapa para fazer o gráfico.
Em nosso dataframe, temos as informações de casos de uma doença X e também temos informações da população por município. Vamos encontrar uma taxa denominada Risco Relativo, que é a razão entre a incidência local (por município) pela incidência total (estado da PB).
# ---- Selecionar coluna de variáveis para gerar mapa
casos <- dados_mapa_shp$casos
pop <- dados_mapa_shp$POP2017
dadosT <- data.frame(Population = pop, CasosPop = casos / pop)
dadosT <- dadosT |>
mutate(
RIE = CasosPop / (sum(casos) / sum(pop)) # Calcula o RIE
)
dadosT |>
head(3) Population CasosPop RIE
1 10479.088 0 0
2 5469.505 0 0
3 25128.464 0 0
Vamos agora criar classes para categorizar os valores do Risco Relativo e criar nosso mapa com as informações.
# ---- Criar intervalo de classes
classes <- c(-Inf, 0.00000000001, 0.49999999999, 0.99999999999, 1.49999999999, 1.99999999999, Inf)
# ---- Criar legenda
legenda = c('0','0,0--0,5','0,5|--1,0','1,0|--1,5','1,5|--2,0','2,0 ou +')
cores <- c("#ffffff", "#f1f1d1", "#e9e57f", "#cda300", "#a46500", "#593216")
# ---- Adicionando a variável Risco Relativo ao shapefile
dados_mapa_shp <- dados_mapa_shp |>
mutate(
RIE = dadosT$RIE, # Adiciona o cálculo ao shapefile
classe_var = cut(RIE, breaks = classes, include.lowest = TRUE) # Cria classes
)# ---- Plot com ggplot2
mapa_shp <- ggplot(data = dados_mapa_shp) +
geom_sf(aes(fill = classe_var), color = "black") + # Preenchimento e bordas
scale_fill_manual(values = cores, labels = legenda) + # Aplica cores e legenda
labs(
x = "Longitude",
y = "Latitude",
fill = "Risco Relativo" # Nome da legenda
) +
annotation_custom(
grob = compassRoseGrob(x = 0.9, y = 0.9, rot = 0, cex = 2, scale = 0.5),
xmin = -Inf, xmax = Inf, ymin = -Inf, ymax = Inf
)+
theme_minimal() +
theme(
panel.grid = element_blank(), # Remove grade
panel.border = element_rect(color = "black", fill = NA) # Adiciona borda
)Vamos utilizar nesse caso dados de COVID–19, que vamos obter através do pacote coronabr. Instalando os pacotes necessários:
Lendo os pacotes para pegarmos os dados e gerar o mapa:
Vamos obter os dados pelo pacote
Agora, o próximo passo é agrupar por município, ler o shapefile e ordenar os municípios da mesma ordem do shapefile.
# Agrupando os dados por cidade
dados_pb2 <- dados_pb |>
select(c(city,new_confirmed )) |>
group_by(city) |>
summarise(n = sum(new_confirmed))
# ---- Load shapefile
shapename <- read_sf('dados/shape_estado_pb/Municipios.shp')
# Vamos associar os casos com convertendo 'nomes' para utilizar o left_join
nomes <- data.frame(city = toupper(shapename$NOME_MUNIC))
dados_grafico <- left_join(nomes,dados_pb2,by = "city")
dados_grafico |>
head(3) city n
1 ÁGUA BRANCA 1128
2 AGUIAR 528
3 ALAGOA GRANDE 4117
Vamos criar intervalos para nosso iterpretar os resultados e fazer o plot do mapa
# Selecionando a variável de Interesse
casos_covid <- dados_grafico$n
# Substituindo os NA's
casos_covid[is.na(casos_covid)] <- 0
#Criando os Intervalos para a Legenda
classes = c(-Inf, 209, 414,619,819,1029, 1234, Inf)
classes_plot <- findInterval(casos_covid,classes)
# Criar legenda
legenda = c('0 |-- 210',
'210 |-- 415',
'415 |-- 620',
'620 |-- 820',
'820 |-- 1030',
'1030 |-- 1235',
'1235 ou mais')Vamos definir as cores e a função do leaflet
# Selecionando as cores de cada classe
cores = c("#ffffff",
"#f1f1d1",
"#e9e57f",
"#dcca03",
"#cda300",
"#a46500",
"#593216")
# Gerando o grafico
mapa_leaflet <- leaflet(shapename) |>
addTiles() |>
addPolygons(stroke = T,
smoothFactor = 0.3,
color = "black",opacity = 1,weight = 1,
fillOpacity = 1,
fillColor = cores[classes_plot],
label = ~paste0(shapename$NOME_MUNIC, ": ", format(casos_covid))) |>
addLegend(position = "topright",colors = cores, labels = legenda, title = "Quantidade de Casos" )Se desejar salvar seu gráfico gerado, isso pode ser feito de duas formas, ou salvar em .png ou salvar em .html, que fica mais interessante, pois possui interação com usuário como o gráfico mostrado no início deste post. A seguir é mostrado as duas formas de salvar:
geobrBurrough, Peter A. “Principles of geographical.” Information systems for land resource assessment. Clarendon Press, Oxford (1986).
Lovelace, Robin, Jakub Nowosad, and Jannes Muenchow. Geocomputation with R. Chapman and Hall/CRC, 2019.https://r.geocompx.org/
Livro: R for Data Science. Disponível em: https://r4ds.had.co.nz/
Livro: R for Data Science. Disponível em: https://ggplot2-book.org/
Repositório GitHub GGPLOT2: R for Data Science. Disponível em: https://github.com/tidyverse/ggplot2
Repositório GitHub elisangelalizzi: Apresentação visual de dados espaciais em saúde pública para vigilância epidemiológica. Disponível em: https://github.com/elisangelalizzi/Spatial-Visual/
Fontes das imagens utilizadas:
OBRIGADO!
Slide produzido com quarto
Lattes: http://lattes.cnpq.br/4617170601890026
LinkedIn: jodavidferreira
Site Pessoal: https://jodavid.github.io/
e-mail: jodavid.ferreira@ufpe.br

Introdução ao R aplicado ao Geoprocessamento - Jodavid Ferreira