Mapa das cervejarias de Juiz de Fora
versão revista e atualizada
Introdução
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.
Objetivos
Aprendizagem de ferramentas para geoprocessamento de dados no R, utilizando como exemplo a representação espacial das cervejarias artesanais de Juiz de Fora.
Recursos
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 precisam ser coletados de diversas fontes. Logo, para a elaboração de uma base de dados específica, utilizamos técnicas de coleta e tratamento de dados, mediante uso de bibliotecas especializadas.
No presente trabalho, os dados principais foram extraídos do portal
brejas.
Informações
adicionais foram obtidas nos seguintes endereços eletrônicos:
portal
de turismo da pjf
ombrelo
Dados
abertos
Bibliotecas
Carregamos as seguintes bibliotecas do R no RStudio:
- tidyverse - para manipulação de dados;
- leaflet - htmlwidget que permite criar mapas interativos diretamente no R;
- ggmap - para recuperar e visualizar dados espaciais de serviços de mapas online;
- googleway - para plotar um mapas do Google a partir do R;
- DT - provê interface para a biblioteca JavaScript DataTables.
Coleta de dados
Definição dos parâmetros
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 uma função de colagem:
Utilizamos a função xml2::read_html() para acessar o conteúdo do código html:
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:
Extração de dados
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:
Extraimos as marcas:
Novamente, utilizamos a função de colagem para retornar a url de cada marca:
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')
})Pré-processamento
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 o primeiro data frame com os dados obtidos:
Inserimos informações adicionais, manualmente, em um novo objeto data frame:
new <- data.frame(cbind(
marcas = c("antuerpia cervejaria",
"cervejaria escola mirante",
"bravo beer",
"cervejaria muller",
"cervejaria carioca do brejo",
"sleutjes beer",
"orbit cervejaria",
"cervejaria skald",
"cervejaria buonacerva"),
ndc = c("Avenida Empresarial Park Sul, 45",
"Rodovia BR-040 Km 796, Salvaterra",
"Alameda Engenheiro Gentil Forn 1690, Jardim Gloria",
"Rua José Appolonio dos Reis 233, Aeroporto",
"Avenida Senhor dos Passos 2107, São Pedro",
"Rua Alvaro José Rodrigues 1165, Aeroporto",
"Estrada Domingos Hungaro SN, Salvaterra - CEP 36033-550",
"R. Prof. Ernesto Evangelista 285, Costa Carvalho",
"R. Pasteur 05, Centro"),
web = c("https://cervejariaantuerpia.com.br/",
"https://www.cervejariaescolamirante.com.br",
"https://www.facebook.com/cervejariabravo/",
"https://srmuller.com.br/",
"https://www.instagram.com/cervejariacariocadobrejo/",
"https://www.sleutjesbeer.com.br/",
"https://www.instagram.com/orbitcervejaria/",
"https://www.cervejariaskald.com.br/",
"https://cervejariabuonacerva.com.br/"),
lat = suppressWarnings(as.numeric(c("<NA>", "<NA>", "<NA>", "<NA>", "<NA>", "<NA>",
"<NA>", "<NA>", "<NA>"))),
lng = suppressWarnings(as.numeric(c("<NA>", "<NA>", "<NA>", "<NA>", "<NA>", "<NA>",
"<NA>", "<NA>", "<NA>")))),
stringsAsFactors = FALSE )Juntamos os dois objetos:
Adicionamos informações complementares:
cvj$ndc[cvj$marcas == "knut beer"] <- "Avenida Senhor dos Passos 2277, São Pedro"
cvj$ndc[cvj$marcas == "cervejaria sao bartolomeu"] <- "Rua Jacob Lawal 377, Borboleta"
cvj$ndc[cvj$marcas == "knut beer"] <- "Avenida Senhor dos Passos 2277, São Pedro"
cvj$ndc[cvj$marcas == "cervejaria gavioli"] <- "Rua José Lourenço 1495, São Pedro"
cvj$ndc[cvj$marcas == "wuff bier"] <- "Rua Elvira Belei 225, Jardim de Ala"
cvj$ndc[cvj$marcas == "cerveja hankz bier"] <- "Avenida Eugênio do Nascimento 834, Aeroporto"
cvj$web[cvj$marcas == "cerveja hankz bier"] <- "https://www.instagram.com/hankzbier/"
cvj$web[cvj$marcas == "brauhaus"] <- "https://www.facebook.com/cervejariabrauhaus"
cvj$web[cvj$marcas == "cervejaria sao bartolomeu"] <- "https://www.instagram.com/saobartolomeu/"
cvj$web[cvj$marcas == "cerveja timboo"] <- "https://www.timboo.com.br/"
cvj$web[cvj$marcas == "cervejaria fathach"] <- "https://www.facebook.com/cervejariafathach/"
cvj$web[cvj$marcas == "cervejaria gavioli"] <- "https://www.instagram.com/cervejariagavioli/"
cvj$web[cvj$marcas == "cervejaria wuerttemberg"] <- "https://www.facebook.com/CervejaWurttemberg/"
cvj$web[cvj$marcas == "knut beer"] <- "https://www.instagram.com/cervejariaknut/"
cvj$web[cvj$marcas == "wuff bier"] <- "https://www.instagram.com/wuffbier/"
cvj$web[cvj$marcas == "cervejaria wuerttemberg"] <- "https://www.facebook.com/CervejaWurttemberg/"
cvj$lat[cvj$marcas == "dakza brewing"] <- NA
cvj$lng[cvj$marcas == "dakza brewing"] <- NAInspecionamos a base de dados:
Tratamento de dados
Removemos a “Rota 040”, que passou a se chamar “Golem” e a “Hills bier”, por ser uma marca caseira:
Dispensamos a coluna que contém a numeração sequencial automática:
Filtramos os registros que não contêm as coordenadas geográficas:
Geocodificação
Open Source Routing Machine(OSRM)
Geocodificação é o processo de conversão de endereços em coordenadas geográficas.
Primeiro, utilizamos o pacote osrm, que dá acesso à API do projeto de código livre e gratuito Open Source Routing Machine(OSRM), para obtenção das coordenadas geográficos dos endereços contidos no data frame cvj_geo:
library(osrm)
library(tidygeocoder)
coords <- cvj_geo %>%
mutate(address = paste(ndc, "Juiz de Fora", "Minas Gerais", sep = ", ")) %>%
geocode(address, method = 'osm')Infelizmente, a alternativa de código aberto não retornou as coordenadas de alguns endereços específicos, de acordo com a saída da função datatable():
Google Maps API
Para utilizar a função google_geocode() do pacote googleway, deve ser registrada uma API Key no painel do Google Cloud. O processo é um pouco confuso e exige um cartão de crédito para faturamento. Embora o serviço seja tarifado, há um limite de acesso gratuito, que pode ser considerado alto a depender do uso.
O valor da chave pode ser atribuído diretamente ao objeto key ou ser salvo em uma variável do ambiente de trabalho, que pode ser chamada a qualquer momento através da função Sys.getenv(), de acordo com o exemplo fornecido por Paul Oldham.
key <- Sys.getenv("GOOGLE_MAPS_KEY")
register_google(key = key)
ggeo <- apply(cvj_geo, 1, function(x) {
google_geocode(address = paste(x["ndc"], "Juiz de Fora", "Minas Gerais", sep = ", "),
key = key)
})Criamos um novo objeto para armazenar o resultado da busca:
Verificamos se resta alguma linha com as coordenadas em branco:
## [1] marcas ndc web lat lng
## <0 linhas> (ou row.names de comprimento 0)
Ajustes finais
Juntamos os dois data frames:
Convertemos as colunas correspondentes às coordenadas geográficas para o tipo numérico:
Salvamos o dataframe em um novo objeto:
Mapeamento
Mapa básico
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)
m1Adicionamos ícones personalizados aos marcadores:
Explore os hiperlinks
Acrescentamos hiperlinks aos marcadores, exibidos após o clique do mouse:
Agrupamentos
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.
m4 <- leaflet(cvjr, width = "100%") %>%
addTiles() %>%
setView(-43.365703, -21.762661, zoom = 12) %>%
addAwesomeMarkers(icon = icons, clusterOptions = markerClusterOptions(), label=cvjr$marcas)
m4
Referências:
Bauer, P.C., Landesvatter, C., Behrenshttps, L. (2023). APIs for social scientists: A collaborative review. Acessado em 24/04/2024: https://bookdown.org/paul/apis_for_social_scientists/
Brito, R. (2016). Como utilizar a Google Geocoding API para obter endereços. Acessado em 24/04/2024: https://devmedia.com.br/como-utilizar-a-google-geocoding-api-para-obter-enderecos/36751
Johnson, H. (2018). Interactive maps in R (with leaflet). Acessado em 24/04/2024: https://hansenjohnson.org/post/interactive-maps-in-r/
Lovelace, R., Nowosad, J., Muenchow, J. (2021). Geocomputation with R. Acessado em 24/04/2024: https://bookdown.org/robinlovelace/geocompr/
Oldham, P. (2018). Exploring Geocoding Scientific Literature with R. Acessado em 24/04/2024: https://www.pauloldham.net/geocoding-scientific-literature-with-r/