Criar um mapa das praias portuguesas com bandeira azul.
O primeiro passo foi encontrar a informação desejada. Neste caso as praias com bandeira azul estão listadas numa página web:
Esta página está no formato HTML onde cada regiĂŁo do paĂs - num total de sete - encontra-se numa tabela separada.
Vai ser necessário fazer algum pré-processamento para criar uma tabela que organize esta informação.
Primeiro lemos a página para dentro do R:
url <- "http://bandeiraazul.abae.pt/plataforma/?p=awarded&s=table"
library(rvest)
tabs <- read_html(url)
tabs
{xml_document}
<html id="sp" role="document">
[1] <head>\n <meta http-equiv="Content-Type" content="text/html; charse ...
[2] <body id="public" class=" ">\n<script><![CDATA[\n (function(i,s,o, ...
O seguinte código lê as várias tabelas HTML para um único data frame:
beaches <- data.frame(Municipio=NULL, Praia=NULL)
for(tab in 1:7) {
df <- tabs %>%
html_nodes("table") %>% # buscar todas as tabelas HTML
.[[tab]] %>% # escolher a 'tab'-Ă©sima
html_table() # converter para um data frame
colnames(df) <- c("Municipio", "Praia")
beaches = rbind(beaches, df) # adicioná-la às tabelas já lidas
}
head(beaches)
Municipio Praia
1 Braga AdaĂşfe
2 Caminha Caminha
3 Caminha Forte do CĂŁo
4 Caminha Moledo
5 Caminha Vila Praia de Ă‚ncora
6 Espinho Espinho-BaĂa
nota: os acentos mostram-se corretos no R
Como extra vamos mapear as praias num mapa de Portugal. Para isso usamos o pacote ggmap
que Ă© uma extensĂŁo do ggplot2
.
Este pacote permite colocar informação em mapas geográficos e tambĂ©m permite encontrar as coordenadas GPS de endereços (nem sempre com sucesso…):
library(dplyr)
beaches <- tbl_df(beaches) %>%
mutate(Address=paste0(Praia, ", ", Municipio, ", Portugal"))
beaches
# A tibble: 314 x 3
Municipio Praia Address
<chr> <chr> <chr>
1 Braga AdaĂşfe AdaĂşfe, Braga, Portugal
2 Caminha Caminha Caminha, Caminha, Portugal
3 Caminha Forte do CĂŁo Forte do CĂŁo, Caminha, Portugal
4 Caminha Moledo Moledo, Caminha, Portugal
5 Caminha Vila Praia de Ă‚ncora Vila Praia de Ă‚ncora, Caminha, Portugal
6 Espinho Espinho-BaĂa Espinho-BaĂa, Espinho, Portugal
7 Espinho Espinho-Rua 37 Espinho-Rua 37, Espinho, Portugal
8 Espinho Frente Azul Frente Azul, Espinho, Portugal
9 Espinho Paramos Paramos, Espinho, Portugal
10 Espinho Silvalde Silvalde, Espinho, Portugal
# ... with 304 more rows
library(ggmap)
geo <- geocode(location = beaches$Address)
Este processo automático não encontra todas as coordenadas. Usaremos apenas os resultados obtidos:
head(geo, 10)
lon lat
1 NA NA
2 -8.837845 41.87321
3 NA NA
4 -8.856518 41.84901
5 NA NA
6 NA NA
7 -8.641184 41.00227
8 -8.641033 41.00719
9 -8.626034 40.97251
10 -8.625919 40.99193
Vamos juntar estes valores ao nosso data frame:
beaches <- beaches %>% mutate(Lon = geo$lon,
Lat = geo$lat,
Address = NULL) # remover coluna
beaches
# A tibble: 314 x 4
Municipio Praia Lon Lat
<chr> <chr> <dbl> <dbl>
1 Braga AdaĂşfe NA NA
2 Caminha Caminha -8.837845 41.87321
3 Caminha Forte do CĂŁo NA NA
4 Caminha Moledo -8.856518 41.84901
5 Caminha Vila Praia de Ă‚ncora NA NA
6 Espinho Espinho-BaĂa NA NA
7 Espinho Espinho-Rua 37 -8.641184 41.00227
8 Espinho Frente Azul -8.641033 41.00719
9 Espinho Paramos -8.626034 40.97251
10 Espinho Silvalde -8.625919 40.99193
# ... with 304 more rows
E podemos usar as funcionalidades do ggmap
para mostrar os dados obtidos:
portugal <-
get_map(location = "Portugal", zoom = 7)
map <-
ggmap(portugal) +
scale_x_continuous(limits=c(-9.6, -6.0)) +
geom_point(data=beaches, aes(x=Lon, y=Lat))
Eis o resultado:
map