No dia 27 de maio, comemora-se o dia da cerveja artesanal mineira, com destaque para Juiz de Fora, onde o pioneirismo de Sebastian Kunz deu origem a uma tradição revigorada nos dias atuais. Para celebrar a data, projetamos um mapa interativo das cervejarias juizforanas.
Cervejarias artesanais cadastradas no site:
* https://www.brejas.com.br
Para geoprocessamento dos dados, utilizamos a biblioteca javascript leaflet, disponível para R, linguagem de programação flexível, utilizada para análise e visualização de dados, cuja interação pode feita por meio da linha de comando ou com o uso do RStudio, considerado o melhor ambiente de desenvolvimento de código em R.
Nem sempre os dados estão disponíveis ou podem ser facilmente acessados; às vezes devem ser organizados no formato tabular, segundo a convenção: as colunas representam as variáveis, e as linhas as observações. Para elaboração de uma base de dados específica, utilizamos técnicas de coleta automatizada de dados na web, mediante uso de bibliotecas especializadas.
Carregamos os pacotes adicionais a serem utilizados.
library(tidyverse)
library(leaflet)
library(ggmap)
library(DT)
library(googleway)
Para identificar e localizar as cervejarias artesanais de Juiz de Fora, exploramos o seguinte endereço web:
https://www.brejas.com.br/cervejaria/microcervejaria/tag/cidade/juiz-de-fora.
Primeiro, realizamos a decomposição:
host <- "https://www.brejas.com.br"
path <- "/cervejaria/microcervejaria/tag"
parameter <- "/cidade"
resources <- "/juiz-de-fora"
Depois, definimos uma nova variável, por meio de colagem.
url <- paste0(host, path, parameter, resources)
Para acessar o conteúdo do código html, utilizamos o pacote xml2.
webpage <- xml2::read_html(url)
Contamos as páginas de busca.
lv <- webpage %>%
rvest::html_nodes("a") %>%
rvest::html_attr("href") %>%
str_subset("listview")
llv <- length(lv)
llv
## [1] 2
Criamos uma lista com as páginas indexadas.
paginas <- str_c(url, '?page=', 1:llv)
paginas
## [1] "https://www.brejas.com.br/cervejaria/microcervejaria/tag/cidade/juiz-de-fora?page=1"
## [2] "https://www.brejas.com.br/cervejaria/microcervejaria/tag/cidade/juiz-de-fora?page=2"
Definimos uma função particular para extrair os links das cervejarias.
cv <- lapply(paginas, function(i) {
u <- xml2::read_html(i) %>%
rvest::html_nodes(".jrListingTitle") %>%
rvest::html_nodes('a') %>%
rvest::html_attr('href')
})
Convertemos a lista em vetor.
cv <- unlist(cv)
Extraimos as marcas.
marcas <- gsub('.*/(.*)','\\1', cv) %>%
str_replace_all("-", " ")
marcas
## [1] "cervejaria wuerttemberg" "mont serrat craft beer"
## [3] "cervejaria barbante" "arthorius cervejaria"
## [5] "cervejaria golem" "rota 040 cervejaria"
## [7] "venna cervejaria artesanal" "cervejaria gavioli"
## [9] "cerveja hankz bier" "brauhaus"
## [11] "cervejaria sao bartolomeu" "cervejaria grizas"
## [13] "cervejaria arcana" "cerveja timboo"
## [15] "mr tugas" "cervejaria fathach"
## [17] "hills bier"
Novamente, utilizamos a função de colagem para retornar a url de cada marca.
urls <- paste0(host, cv)
Definimos as funções para extrair os elementos da tabela.
ndc <- lapply(urls, function(i) {
z <- xml2::read_html(i) %>%
rvest::html_nodes(xpath = '//meta[@property="business:contact_data:street_address"]') %>%
rvest::html_attr('content')
})
web <- lapply(urls, function(i) {
z <- xml2::read_html(i) %>%
rvest::html_nodes(".jrWebsiteoficial") %>%
rvest::html_nodes('a') %>%
rvest::html_attr('href')
})
lat <- lapply(urls, function(i) {
z <- xml2::read_html(i) %>%
rvest::html_nodes(xpath = '//meta[@property="place:location:latitude"]') %>%
rvest::html_attr('content')
})
lng <- lapply(urls, function(i) {
z <- xml2::read_html(i) %>%
rvest::html_nodes(xpath = '//meta[@property="place:location:longitude"]') %>%
rvest::html_attr('content')
})
Fazemos os ajustes iniciais.
ndc <- as.character(ndc, stringsAsFactors = FALSE)
ndc[ndc=="character(0)"] <- "NA"
web[web=="character(0)"] <- "NA"
web <- unlist(web)
lat <- as.numeric(lat)
lng <- as.numeric(lng)
Criamos a primeira tabela com os dados obtidos.
cerva <- data.frame(marcas, ndc, web, lat, lng, stringsAsFactors = FALSE)
Informações adicionais acessadas no portal de turismo da pjf e no portal ombrelo são inseridas manualmente em uma tabela temporária.
new <- cbind(
marcas = c("antuerpia cervejaria", "antuerpria growler station", "cervejaria escola mirante", "profana", "bravo beer"),
ndc = c("Rua Padre Café 73, São Mateus", "Av Rio Branco 3760, Bom Pastor", "Rodovia BR-040 Km 796, Salvaterra","Rua Luíz Rocha 117, Eldorado", "Av Deusdedith Salgado 1763, Teixeiras"),
web = c("http://www.churrasqueirajf.com.br/a-churrasqueira/", "http://www.cervejariaantuerpia.com.br/", "http://www.cervejariaescolamirante.com.br", "https://www.facebook.com/BoiNaCurva", "https://www.facebook.com/cervejariabravo"),
lat = as.numeric(c("<NA>", "<NA>", "<NA>", "<NA>", "<NA>")),
lng = as.numeric(c("<NA>", "<NA>", "<NA>", "<NA>", "<NA>")))
Espelhamos o novo objeto data.frame.
new <- data.frame(new)
Juntamos as duas tabelas.
cvj <- rbind(cerva, new)
Apagamos a primeira linha, pois não encontramos informações a respeito da referida marca.
cvj <- cvj[-1, ]
Excluímos a Rota 040, que passou a se chamar Golem.
cvj <- cvj[!(cvj$marcas=="rota 040 cervejaria"),]
Removemos a hills bier, por se tratar de uma cerveja caseira.
cvj <- cvj[!(cvj$marcas=="hills bier"),]
Dispensamos a coluna que contém a numeração sequencial automática.
row.names(cvj) <- NULL
Adicionamos informações complementares.
cvj$ndc[cvj$marcas == "venna cervejaria artesanal"] <- "R Professor Francisco Bedendo 340, Teixeiras"
cvj$ndc[cvj$marcas == "cervejaria golem"] <- "Av. Rui Barbosa 482, Santa Terezinha"
cvj$ndc[cvj$marcas == "cervejaria gavioli"] <- "R Carangola 914, Democratas"
cvj$ndc[cvj$marcas == "cervejaria arcana"] <- "R Maria Amelia 65, Santa Cecilia"
cvj$ndc[cvj$marcas == "mr tugas"] <- "R Otília de Souza Leal 310, Nova Califórnia"
cvj$ndc[cvj$marcas == "cervejaria escola mirante"] <- "Rodovia BR-040 Km 796, Salvaterra"
cvj$web[cvj$marcas == "arthorius cervejaria"] <- "https://www.facebook.com/CervejaArthorius/"
cvj$web[cvj$marcas == "cerveja hankz bier"] <- "https://www.facebook.com/hankzbier/"
cvj$web[cvj$marcas == "brauhaus"] <- "https://www.facebook.com/cervejariabrauhaus"
cvj$web[cvj$marcas == "cervejaria sao bartolomeu"] <- "https://pt-br.facebook.com/BarSaoBartolomeu"
cvj$web[cvj$marcas == "cervejaria arcana"] <- "https://www.facebook.com/cervejariaarcana/"
cvj$web[cvj$marcas == "cerveja timboo"] <- "https://www.facebook.com/CervejaTimboo/"
cvj$web[cvj$marcas == "cervejaria fathach"] <- "https://www.facebook.com/cervejariafathach/"
Inspecionamos a tabela.
datatable(cvj)
Filtramos os registros que não contêm as coordenadas geográficas.
cvj_geo <- cvj %>% filter(is.na(lat)) %>% select(marcas, ndc, web)
Para extrairmos as latitudes e longitudes, utilizamos a função google_geocode do pacote googleway. Para acessar a base de dados do Google Maps é necessário registrar uma API Key, que depois de salva em um ambiente seguro, pode ser acessada programaticamente.
key <- Sys.getenv("GOOGLE_MAPS_KEY")
register_google(key = key)
Criamos uma função para pesquisar múltiplos endereços.
coords <- apply(cvj_geo, 1, function(x) {
google_geocode(address = paste(x["ndc"], "Juiz de Fora", "Minas Gerais", sep = ", "),
key = key)
})
cvj_geo <- cbind(cvj_geo, do.call(rbind, lapply(coords, geocode_coordinates)))
Juntamos as tabelas.
cvjr <- rbind(cvj, cvj_geo) %>% filter(! is.na(lat))
Efetuamos os ajustes finais.
cvjr$lng <- as.numeric(cvjr$lng)
cvjr$lat <- as.numeric(cvjr$lat)
Concluimos a base de dados.
datatable(cvjr)
Projetamos o mapa das cervejarias de Juiz de Fora.
m1 <- leaflet(cvjr, width = "100%") %>%
addTiles() %>%
setView(-43.365703, -21.762661, zoom = 12) %>%
addMarkers(label=cvjr$marcas)
m1
Adicionamos ícones personalizados aos marcadores:
icons <- awesomeIcons(
icon = 'beer',
iconColor = 'white',
markerColor = "orange",
library = 'fa'
)
m2 <- leaflet(cvjr, width = "100%") %>%
addTiles() %>%
setView(-43.365703, -21.762661, zoom = 12) %>%
addAwesomeMarkers(icon = icons, label=cvjr$marcas)
#addMarkers(label=cvjr$marcas)
m2
Por fim, acrescentamos hiperlinks aos marcadores, exibidos após o clique do mouse.
popup_style <- paste0("<a href=",cvjr$web," target='_blank'>",cvjr$marcas,"</a>")
m3 <- leaflet(cvjr, width = "100%") %>%
addTiles() %>%
setView(-43.365703, -21.762661, zoom = 12) %>%
addAwesomeMarkers(icon = icons, popup=popup_style)
m3
Adicionamos um círculo ao conjunto de dados, a partir do ponto central determinado pelas coordenadas da Cervejaria Grizas, ao mesmo tempo em que o zoom foi congelado.
m4 <- leaflet(cvjr, width = "100%", options = leafletOptions(zoomControl = FALSE)) %>%
addTiles(options = providerTileOptions(minZoom = 12, maxZoom = 12)) %>%
setView(-43.365703, -21.762661, zoom = 12) %>%
addCircleMarkers(-43.365703, -21.762661, popup = 'circuito cervejeiro', radius = 120, color = 'yellow') %>%
addAwesomeMarkers(icon = icons, label=cvjr$marcas)
m4
Agrupamentos automáticos são exibidos como círculos coloridos no mapa, segundo um vetor de cores, formado pelo verde, amarelo e vermelho, que determina o volume de itens do cluster. O nível de agrupamento é inversamente proporcional ao tamanho do zoom. Quanto maior o zoom menor o cluster, até chegar à unidade de análise individual. Ao passar o mouse sobre o círculo, será exibida a entensão da área delimitada pelos marcadores.
m5 <- leaflet(cvjr, width = "100%") %>%
addTiles() %>%
setView(-43.365703, -21.762661, zoom = 12) %>%
addAwesomeMarkers(icon = icons, clusterOptions = markerClusterOptions(), label=cvjr$marcas)
m5